Hooks FAQ
觉得Hooks FAQ里面回答了很多很实际的疑问。
生命周期方法要如何对应到 Hook?
-
constructor:函数组件不需要构造函数。你可以通过调用
useState
来初始化 state。如果计算的代价比较昂贵,你可以传一个函数给useState
。 -
getDerivedStateFromProps
:改为 在渲染时 安排一次更新。 -
shouldComponentUpdate
:详见 下方 React.memo. -
render:这是函数组件体本身。
-
componentDidMount
,componentDidUpdate
,componentWillUnmount
:useEffect
Hook 可以表达所有这些(包括 不那么 常见 的场景)的组合。 -
componentDidCatch
andgetDerivedStateFromError
:目前还没有这些方法的 Hook 等价写法,但很快会加上。
On Mounting (componentDidMount)
生命周期方法 componentDidMount
会在第一次render完成后立即调用。以前有一个 componentWillMount 会在第一次render之前调用,但它被认为是传统方法,不建议在较新版本的 React 中使用。
1 | const FunctionalComponent = () => { |
取代 componentDidMount
,我们使用第二个参数为 []
的 useEffect
hook。 useState
hook的第二个参数通常是一个包含变化状态的数组,而 useEffect
只会在这些选定的变化中被调用。但如果是像本例这样的空数组,则会在挂载时调用一次。这可以完美替代 componentDidMount
。
1 | class ClassComponent extends React.Component { |
这里发生的事情基本上是一样的:componentDidMount
是一个生命周期方法,在第一次render后会被调用一次。
On Unmounting (componentWillUnmount)
1 | class ClassComponent extends React.Component { |
1 | const FunctionalComponent = () => { |
好消息是,我们也可以使用 useState
钩子来卸载。但要注意,语法有些不同。你需要做的是在 useEffect
函数中返回一个在卸载时运行的函数
。这在需要清理订阅(如 clearInterval
函数)时尤其有用,否则会在较大的项目中造成严重的内存泄漏。使用 useEffect 的一个好处是,我们可以在同一个地方编写挂载和卸载函数。例如:
1 | useEffect(() => { |
1 | // custom hook |
1 | useEffect(() => { |
我该如何使用 Hook 进行数据获取?
该 demo 会帮助你开始理解。欲了解更多,请查阅 react-hooks-fetch-data 来了解如何使用 Hook 进行数据获取。
Reference Links
- 新一代 React API — React Hooks React Conf 2018 React Today and Tomorrow 重點回顧
- 官方文档英文版:hooks-intro
- 官方文档中文版:hooks
- setTimeout in React Components Using Hooks