React Hooks
函数组件中也可以实现状态管理
Hook 是一个特殊的函数,它可以让你“钩入” React 的特性
Hook 使你在无需修改组件结构的情况下复用状态逻辑
Hook 规则
- 只在最顶层使用 Hook
- 只在 React 函数中调用 Hook
useState/useReducer
useState 和 useReducer 都是关于状态值的提取和更新,从本质上来说没有区别,从实现上看,useState 是 useReducer 的一个简化版,其背后用的是同一套逻辑。
1 2 3 4 5 6 7 8
| const DemoPage: React.FC = (props) => { const [count, setCount] = usestate<number>(0) render () ( <div onClick={() => setCount( count += 1)}> {count} </div> ) }
|
useEffect/useLayoutEffect
可用作生命周期函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| const DemoPage: React.FC = (props) => { const [count, setCount] = usestate<number>(0) useEffect(() => {
return () => { } }, [ ]) render () ( <div onClick={() => setCount( count += 1)}> {count} </div> ) }
|
useMemo
计算属性, 根据依赖值的变化响应式改变
useCallback
useCallback其实是利用memoize减少不必要的子组件重新渲染
useRef/useImperativeHandle
获取子组件实例 子组件返回数据给父组件
useContext/createContext
创建共享状态
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| const ParentContext = createContext({})
const Child: React.FC = (props) => { const {username} = useContext(ParentContext) return ( <div>{username}</div> ) } const DemoPage: React.FC = (props) => { const [count, setCount] = usestate<number>(0) useEffect(() => {
return () => { } }, [ ]) return ( <ParentContext.Provider value={{username: '1111'}} onClick={() => setCount( count += 1)}> <Child /> </ParentContext.Provider> ) }
|
自定义 Hook
- 自定义 Hook 是一个函数,其名称以 “use” 开头,函数内部可以调用其他的 Hook
- 自定义 Hook 必须以 “use” 开头
- 在两个组件中使用相同的 Hook 不会共享 state