为什么要使用hooks

  • 完善函数组件的能力,函数组件更适合 React 组件
  • 组件逻辑复用,Hooks表现更好
  • class 复杂组件正在变的费解,不易拆解,不易测试,逻辑混乱

    模拟组件生命周期

  • componentDidMount - useEffect []

  • componentDidUpdate - useEffect 无依赖 或 [a, b]
  • componentWiiUnMount - useEffect 中返回一个函数

useEffect 中返回函数fn

  • 如果依赖项是 [],组件销毁是执行 fn,等于 WillUnMount
  • useEffect 无依赖或依赖[a, b],组件更新时执行 fn
  • 即,下一次执行 useEffect 之前,就会执行fn,无论更新或卸载

如何自定义Hook

  1. import {useState} from 'react';
  2. import axios from 'axios';
  3. function useAxiox(url) {
  4. const [loading, setLoading] = useState(false);
  5. const [err, setErr] = useState();
  6. const [data, setDate] = useState();
  7. useEffect(() => {
  8. setLoading(true);
  9. axios.get(url)
  10. .then(setDate)
  11. .catch(setErr)
  12. .finally(() => { setLoading(false) })
  13. }, [url])
  14. return [loading, data, err];
  15. }
  16. export default axios;

React Hooks 性能优化

  • useMemo 缓存数据
  • useCallBack 缓存函数
  • 相当于 class 的 SUC 和 PureComponent

  • useState 初始化值,只初始化一次
  • useEffect 内部,不能修改 state
  • useEffect 依赖引用类型,会出现死循环

React Hooks 做组件逻辑复用的优点

  • 完全符合 hooks 原有规则,没有其他要求,易理解记忆
  • 变量作用域很明确
  • 不会产生组件嵌套