React Hooks 是 React 16.8 引入的新特性,它可以让我们在不编写 class 的情况下,使用 state 以及其他 React 特性。
以下是 react 中常见的 hooks:
useState
useState 是最常用的 Hook 之一。它的作用是用于在函数组件中设置状态,使其具有状态特性。
useState 的原理是使用了 JavaScript 的闭包特性,来保存变量的状态,并通过返回一个包含 2 个元素的数组,第一个元素为当前状态值,第二个元素为更新状态值的方法。
const [state, setState] = useState(initialState);
useEffect
useEffect 是用于在函数组件中使用副作用操作的 Hook。它可以让我们在组件渲染完成后执行某些操作(如获取数据、修改 DOM 等)。
useEffect 的原理是在每次渲染时,都会创建一个包含当前组件状态的快照,并将这个快照与上一次渲染时的状态进行比较,如果有变化,就会执行回调函数。
useEffect(() => {
// effect function
return () => {
// cleanup function
};
}, [dependencies]);
useContext
useContext 是用于在函数组件中使用 React Context 的 Hook。它可以让我们在组件中共享数据,避免了通过 props 层层传递的繁琐过程。
useContext 的原理是通过 React Context 实现,它会从组件树中查找最近的 Provider 并获取其传递的值。
const value = useContext(MyContext);
useRef
useRef 是用于在函数组件中创建 Ref 的 Hook。它可以让我们在组件间共享数据,并且不会触发组件重新渲染。
useRef 的原理是使用了 React 的 Ref 功能,来创建一个可以保存任何数据的容器,并且在组件更新时不会重新渲染。
const refContainer = useRef(initialValue);
useMemo
useMemo 是用于在函数组件中缓存计算结果的 Hook。它可以让我们避免重复计算,从而提高组件性能。
useMemo 的原理是在每次渲染时,都会检查依赖项(第二个参数)是否有变化,如果没有变化就会返回上一次计算的结果,否则就会重新计算。
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
useCallback
useCallback 是用于在函数组件中缓存函数的 Hook。它可以让我们避免在每次渲染时都创建新的函数,从而提高组件性能。
useCallback 的原理是在每次渲染时,都会检查依赖项(第二个参数)是否有变化,如果没有变化就会返回上一次缓存的函数,否则就会重新创建函数。
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
useReducer
useReducer 是用于在函数组件中使用 Reducer 模式的 Hook。它可以让我们将组件的状态和行为分离,使代码更加清晰和易于维护。
useReducer 的原理是使用了 JavaScript 的 Reducer 模式,来管理组件的状态和行为。它会接收一个 Reducer 函数和初始状态值,并返回当前状态值和 dispatch 函数。每次调用 dispatch 函数时,都会触发 Reducer 函数,从而更新状态。
const [state, dispatch] = useReducer(reducer, initialState);
useMemo和useCallback的区别
useMemo 和 useCallback 都可以用于缓存计算结果和函数,但它们的作用不同。useMemo 用于缓存计算结果,而 useCallback 用于缓存函数。如果需要在函数组件中缓存计算结果,可以使用 useMemo。如果需要在函数组件中缓存函数,可以使用 useCallback。
useEffect的清除机制
useEffect 也可以用于清除副作用操作。在每次组件渲染之前,都会先执行上一次 useEffect 的清除操作。如果 useEffect 返回一个函数,那么这个函数就会在下一次 useEffect 或组件卸载时执行。
useEffect(() => {
// effect function
return () => {
// cleanup function
};
}, [dependencies]);
以上是 react 中常见的 hooks 以及它们的实现原理。