Skip to main content

目录

什么是Hooks?

HookReact 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