React-Hooks
title: React-Hooksdate: 2020-06-27 09:13:34
tags: React
class 组件类的缺点
- 大型业务很难拆分或重构,也很难测试
- 业务逻辑分散在组件的各个方法中,导致重复逻辑或关联逻辑.
- 组件类引入了复杂的编程模式,比如
render props
和高阶组件.
React Hook 的设计目的
加强版函数组件,完全不使用类,就能写出一个全功能组件.
含义为,组件尽量写成纯函数,如果需要外部功能或副作用,就用钩子函数把外部代码”钩”进来.
React 规定,钩子一律使用use
前缀命名,便于识别.
常用钩子: useState()
,useContext()
,useReducer()
,useEffect()
useState()
状态钩子
用于为函数组件引入状态(state),纯函数不能有状态,所以将状态放入钩子里.
1 | import React, { useState } from 'react'; |
用户点击后,文字自发生了变化,文字取决于用户是否点击,这就是状态.
Button 组件是一个函数,内部使用
useState()
引入状态.
useState()
函数接收状态的初始值,作为参数,例子中的初始值为按钮的文字,该函数返回一个数组,数组的第一个成员是一个变量(buttonText
).
指向状态的当前值.第二个成员是一个函数,用来更新状态.约定是set
前缀加上变量名(setButtonText
).
useContext()
共享状态钩子
如果需要在组件之间共享状态,可以使用useContext()
.
1 | const AppContext = React.createContext({}) |
其中,AppContext.Provider
提供一个Context
对象,这个对象可以被子组件共享.
1 | //Navbar.js |
其中,useContext()
钩子函数用来引入 Context 对象,从中获取username
属性.
1 | //Message.js |
useReducer()
: action 钩子
React 本身不提供状态管理功能,通常使用外部库,如 Redux.
Redux 的核心概念,组件发出 action 与状态管理器通信.状态管理器收到 action 后,使用 Reducer 函数算出新的状态,
Reducer 函数的形式是(state, action)=>newState
.
useReducers()
用来引入 Reducer 功能.
1 | const [state, dispatch] = useReducer(reducer, initialState); |
上面是useReducer()
的基本用法,它接收 Reducer 函数和状态的初始值作为参数,返回一个数组.数组的第一个成员是状态的当前值,
第二个是发送 action 的dispatch
函数.
由于 Hooks 可以提供共享状态和 Reducer 函数,所以这些方面可以取代 redux.但是无提供中间件
和时间旅行.
useEffect()
: 副作用钩子
useEffect()
用来引入具有副作用的操作,如向服务器发送请求数据.
之前放在componentDidMount
之中的代码可以放在useEffect()
中.
解决了没有生命周期的问题.
用法如下:
1 | useEffect(() => { |
useEffect()
接收两个参数,第一个参数是一个函数,异步操作的代码放在里面.
第二个参数是一个数组,用于给Effect
的依赖项,只要这个数组发生变化,useEffect()
就会执行.
第二个参数可以省略,这样每次渲染,就会执行useEffect()
.
第二个参数如果是一个空数组[]
,就只会在加载时执行一次,数据更新时不执行.