Skip to main content

目录

什么是Hooks?​

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。

为什么要使用React Hooks?​

传统组件类的几个缺点:

  • 大型组件很难拆分和重构,也很难测试。
  • 业务逻辑分散在组件的各个方法之中,导致重复逻辑或关联逻辑。
  • 组件类引入了复杂的编程模式,比如 render props 和高阶组件。

详见

React Hooks 动机

Redux 的作者 Dan Abramov的 总结

函数式组件与类组件有何不同?

Hooks的优势

  • 能优化类组件的三大问题
  • 能将组件中相互关联的部分拆分成更小的函数
  • 能在无需修改组件结构的情况下复用状态逻辑

Why React Hooks

Hooks的缺点

  • 响应式的useEffect不能被清除 心智成本增加, 依赖的不可控性 解决方式: 依赖划分, 单一职责划分

  • Hooks不擅长异步的代码(旧引用的问题) 利用闭包的方式 hack或者useRef

  • custom hooks 严重依赖参数的不可变性

建议使用官方推荐的插件 eslint-plugin-react-hooks。

使用注意事项​

  • ✅ 钩子一律使用use前缀命名,便于识别。你要使用 xxx 功能,钩子就命名为 usexxx
  • ✅ 只在最顶层使用 Hooks,不要在循环,条件或嵌套函数中调用 Hooks
  • ✅ 只在 React 函数中调用 Hooks, 不要在普通的 JavaScript 函数中调用 Hooks
  • ✅ Hooks 警告

Hooks 规则

常用的Hooks​

useState()

useEffect()

useLayoutEffect()

useCallback()

useContext()

useMemo()

useReducer()

useRef()

React.forwardRef()

useImperativeHandle()

useCustom 自定义Hooks

更多详见Hooks索引

Hooks 生命周期对应 Class 组件类​

Here

函数组件与类组件的区别​

tip

函数式组件捕获了渲染所用的值,通过闭包缓存到了上一次执行的值。(Function components capture the rendered values.) 类组件会在更新时,会更新整个 this 实例 https://overreacted.io/zh-hans/how-are-function-components-different-from-classes/

语法​

class 需要继承Component,然后 render 返回组件 function直接返回

调用方式​

class 需要实例化,然后调用 render function直接调用

  • 无法使用setState

useState VS setState​

  1. setState({}) / setState({}, () => {}) / setState((state, props) => {}, () => {}); useState只能在函数中使用

  2. setState会合并参数,useState不会

state = {
name: 'Rain120'
age: 20
}
setState({
age: 18
})

// => state = { name: 'Rain120', age: 18 }

const [, setProfile] = useState({
name: 'Rain120'
age: 20
})

setProfile(prev => ({
...prev,
age: 18
}))

setState可以通过第二个函数得到最新的值,useState需要通过 useEffect

参考资料​

React Hooks

React Hooks 入门教程

React Hooks 详解

When to useMemo and useCallback

react-lifecycle-methods-diagram

reactacademy.ca