hooks
大约 4 分钟约 1267 字
hooks
hooks的使用
为什么要用Hook?
1.在组件之间复用状态逻辑很难
Hook使你在无需修改组件结构的情况下复用状态逻辑。
2.复杂组件变得难以理解
Hook将组件中相互关联的部分拆分成更小的函数(比如设置订阅或请求数据),而并非强制按照生命周期划分。你还可以使用reducer来管理组件的内部状态,使其更加可预测。
3.难以理解的 class
Hook使你在非class的情况下可以使用更多的React特性
什么是 Hook?
Hook是一些可以让你在函数组件里“钩入” React state及生命周期等特性的函数。Hook不能在class 组件中使用 —— 这使得你不使用class也能使用React。
什么是 "副作用"?
- 你之前可能已经在
React组件中执行过数据获取、订阅或者手动修改过DOM。我们统一把这些操作称为“副作用”,或者简称为“作用”。
useState
调用 useState 方法的时候做了什么?
- 它定义一个
“state 变量”,一般来说,在函数退出后变量就会”消失”,而state中的变量会被React 保留。
useState 需要哪些参数?
-useState() 方法里面唯一的参数就是初始 state;想初始化两个变量,就调用两次useState()
useState 方法的返回值是什么?
- 返回值为:当前
state以及更新 state 的函数。这就是我们写const [count, setCount] = useState()的原因; 使用的[]中括号
useEffect
1.useEffect 介绍
useEffect 做了什么?
- 它告诉
React 组件需要在渲染后执行某些操作。React会保存你传递的函数(我们将它称之为 “effect”),并且在执行DOM 更新之后调用它。
为什么在组件内部调用 useEffect?
-将 useEffect 放在组件内部让我们可以在 effect 中直接访问count state 变量(或其他 props);Hook 使用了 JavaScript 的闭包机制,而不用在 JavaScript 已经提供了解决方案的情况下,还引入特定的 React API。
useEffect 会在每次渲染后都执行吗?
- 它在
第一次渲染之后和每次更新之后都会执行;React保证了每次运行effect的同时,DOM都已经更新完毕。
useEffect 是不是异步?
是异步;如果需要effect 同步的话,有单独的useLayoutEffect Hook供你使用,其API与useEffect相同。
useEffect 的优势?
- 与
componentDidMount或componentDidUpdate不同,使用useEffect调度的effect不会阻塞浏览器更新屏幕,这让你的应用看起来响应更快。
2.需要清除的 effect
useEffect 的设计是在同一个地方执行。如果你的 effect 返回一个函数,React 将会在执行清除操作时调用它
useEffect(() => {
// 渲染时执行 相当于clas组件的 componentDidMount componentDidUpdate
return () => {
// 组件卸载时执行 相当于clas组件的
};
}, []); // 注1 例:[count] 仅在count 更改时更新 componentWillUnmount
提示
- 如果使用
注1这种优化方式,请确保数组中包含了所有外部作用域中会随时间变化并且在effect中使用的变量,否则你的代码会引用到先前渲染中的旧变量; - 如果想执行
只运行一次的effect(仅在组件挂载和卸载时执行),可以传递一个空数组([])作为第二个参数。
Hook 规则
1.只在最顶层使用 Hook
不要在循环,条件或嵌套函数中调用Hook, 确保总是在你的React函数的最顶层调用他们。 遵守这条规则,你就能确保Hook在每一次渲染中都按照同样的顺序被调用。这让React能够在多次的useState和useEffect调用之间保持hook状态的正确。
2.只在 React 函数中调用 Hook
- 不要在普通的
JavaScript函数中调用Hook。 - 在
React的函数组件中调用Hook - 在自定义
Hook中调用其他Hook
自定义Hook
自定义 Hook是一个函数,其名称以“use” 开头,函数内部可以调用其他的Hook。自定义 Hook是一种自然遵循Hook 设计的约定,而并不是 React的特性。
自定义 Hook 必须以 “use” 开头吗?
必须如此。这个约定非常重要。不遵循的话,由于无法判断某个函数是否包含对其内部 Hook 的调用,React将无法自动检查你的Hook是否违反了Hook 的规则。
在两个组件中使用相同的 Hook 会共享 state 吗?
不会。自定义 Hook是一种重用状态逻辑的机制(例如设置为订阅并存储当前值),所以每次使用自定义 Hook时,其中的所有state和副作用都是完全隔离的。
自定义 Hook 如何获取独立的 state?
- 每次调用
Hook,它都会获取独立的 state;我们可以在一个组件中多次调用 useState 和 useEffect,它们是完全独立的。
