useMemo和useCallback都是React Hooks,它们可以让我们在函数组件中缓存函数或者值,从而避免不必要的渲染或者计算。
useMemo和useCallback的区别在于它们缓存的内容不同。useMemo可以缓存任何值,比如数字,字符串,对象,数组等。useCallback只能缓存函数,它其实是useMemo的一个特例。
useMemo和useCallback的主要用途是优化性能和可读性。当我们有一些复杂的计算或者渲染,而且它们的结果只依赖于一些特定的变量时,我们可以使用useMemo或者useCallback来缓存这些结果,这样就不需要在每次渲染时重新计算或者渲染。这样可以提高性能,也可以让代码更清晰。
useRef 在存数据时也是缓存上一次页面执行时的数据,不会同步到当前页面,会有一种慢半拍的感觉
下面是一个用代码示例说明useMemo和useCallback的用法和主要用途:
import React, { useState, useEffect, useMemo, useCallback } from "react";
function App() {
const [count, setCount] = useState(0);
const [name, setName] = useState("");
// 使用useMemo来缓存一个复杂的计算结果
const factorial = useMemo(() => {
let result = 1;
for (let i = 1; i <= count; i++) {
result *= i;
}
return result;
}, [count]); // 只有当count变化时,才重新计算
// 使用useCallback来缓存一个函数
const handleChange = useCallback((e) => {
setName(e.target.value);
}, []); // 只有当组件挂载时,才创建函数
return (
<div className="App">
<h1>Factorial of {count} is {factorial}</h1>
<button onClick={() => setCount((c) => c + 1)}>+1</button>
<button onClick={() => setCount((c) => c - 1)}>-1</button>
<hr />
<h1>Hello, {name}</h1>
<input type="text" value={name} onChange={handleChange} />
</div>
);
}
export default App;如果我们不使用useMemo,那么每次我们输入名字或者点击按钮时,都会重新计算阶乘,这样就会浪费性能。
如果我们不使用useCallback,那么每次我们输入名字或者点击按钮时,都会重新创建函数,这样就会导致子组件(如果有的话)重新渲染,因为
函数的引用发生了变化。
另外useEffect函数也只能直接使用,不能类似 const factorial = useEffect() 这样的写法。
www.haizhuan.tk