1.列举十个常用的React 内置Hooks
- useState:让函数组件具有维持状态的能力
- useEffect:执行副作用
- useCallback:避免不必要的函数重新创建、避免不必要的子组件重新渲染
- useMemo:缓存计算的结果
- useRef:在多次渲染之间共享数据
- useContext:定义全局状态
- useLayoutEffect
- useReducer
- useDebugValue
- useImperativeHandle
2.为什么会有React Hooks 它解决了那些问题
如果你使用过 React 一段时间,你也许会熟悉一些解决此类问题的方案,比如 render props 和 高阶组件。 但是这类方案需要重新组织你的组件结构,这可能会很麻烦,使你的代码难以理解。 如果你在 React DevTools 中观察过 React 应用,你会发现由 providers,consumers,高阶组件,render props 等其他抽象层组成的组件会形成“嵌套地狱”。 你可以使用 Hook 从组件中提取状态逻辑,使得这些逻辑可以单独测试并复用。 Hook 使你在无需修改组件结构的情况下复用状态逻辑。 这使得在组件间或社区内共享 Hook 变得更便捷。
3.React Hooks 如何模拟组件的生命周期
import React, { useState, useEffect, useRef } from "react"
interface Props {
name: string;
}
const MyComponent: React.FC<Props> = ({ name }) => {
const [count, setCount] = useState(0);
const isMounted = useRef(false);
useEffect(() => {
console.log(`${name} is mounted`);
isMounted.current = true;
return () => {
console.log(`${name} is unmounted`);
isMounted.current = false;
};
}, []);
useEffect(() => {
if (isMounted.current) {
console.log("count has been updated");
}
}, [count]);
useEffect(() => {
console.log("name has been updated");
}, [name]);
useEffect(() => {
console.log("component has been updated");
});
const handleClick = () => {
setCount(count + 1);
};
return (
<div>
<h1>Hello {name}!</h1>
<p>Count: {count}</p>
<button onClick={handleClick}>Click me</button>
</div>
)
}
export default MyComponent;
在这个例子中,我们定义了一个MyComponent
函数组件,它接受一个名为name
的属性。 我们使用useState
Hook来定义一个名为count
的状态和一个名为setCount
的函数,它用于更新状态。我们还使用useRef
Hook来创建一个名为isMounted
的引用,以检查组件是否已经挂载。
在组件的useEffect
Hook中,我们通过传递一个空数组作为第二个参数来模拟componentDidMount
方法。 在这个方法中,我们使用console.log
语句记录组件的挂载和卸载状态,并设置isMounted
的当前值以反映组件的挂载状态。
我们还使用了两个useEffect
Hook来模拟componentDidUpdate
方法。 第一个是通过传递count
作为第二个参数来触发的,它在count
的值被更新时记录一个消息。 第二个useEffect
是不带依赖项的,它在每次更新时都会被调用,并记录一个通用的组件更新消息。
最后,我们定义了一个点击处理程序,它使用setCount
来增加count
的值。 在组件的返回语句中,我们使用JSX来渲染组件的内容。
使用这种方式,我们可以在函数组件中模拟类组件的生命周期方法,并且可以清晰地控制组件的状态和行为。
4.如何自定义hook
Hook
作为 React
的新特性,确实为我们提供了更多的可能性。通过自定义 Hook
的方式,我们可以将组件中可复用的状态逻辑抽离出来,保持其独立性。而当我们需要它时又可以很容易的将这些状态逻辑重新应用到组件内,与组件紧密的结合在一起,发挥它的作用。
5.说一下React Hooks 性能优化
- React.memo : 和 class 组件时期的 PureComponent 一样,做简单额数据类型比较
- useMemo : 可以用来比较复杂类型的数据,不如 Object Array 等
- useCallback : 升级版本,用于控制传递函数时候控制组件是否需要更新
6.使用React Hooks 遇到的那些坑?
- 不要改变 hooks 的调用顺序;
- 不要使用旧的状态;
- 不要创建旧的闭包;
- 不要忘记清理副作用;
- 不要在不需要重新渲染时使用useState;
- 不要缺少useEffect依赖。
7.Hooks 相比 HOC 和Render Prop 有那些有点
Hooks 可以优化 render 的前置逻辑处理,也适合用于取代 class extend 的写法; HoC 更多是个从外注入的方案,也适合用来做插件; Render Props 可以在树状 VDOM 的渲染流程上有更多的自由度;