usememo的核心思想是通过缓存计算结果并在依赖项未变化时直接返回缓存值来避免重复计算,其关键在于依赖项数组的正确使用,它决定了何时重新执行计算;该机制解决了因不必要的重复计算和引用变化导致的性能瓶颈问题;usememo用于缓存值,而usecallback用于缓存函数引用,两者共同优化react组件的渲染性能。

在JavaScript中实现
useMemo
要实现一个简化的
useMemo
function createUseMemo() {
let lastValue = null;
let lastDependencies = [];
return function useMemo(computeFunction, dependencies) {
// 检查依赖项是否发生变化
const dependenciesChanged = dependencies.some((dep, index) => {
// 简单比较,对于引用类型,这可能不够严谨,但足以说明原理
return dep !== lastDependencies[index];
});
if (dependenciesChanged || lastDependencies.length === 0) {
// 如果依赖项发生变化,或者这是第一次运行,重新计算
lastValue = computeFunction();
lastDependencies = dependencies;
}
// 返回缓存的值
return lastValue;
};
}
// 实际使用时,通常会像React Hooks那样,每个组件实例有自己的状态
// 这里为了演示,我们创建一个实例
const myUseMemo = createUseMemo();
// 示例用法
let counter = 0;
function expensiveCalculation(num) {
console.log('执行耗时计算...');
// 模拟一个耗时操作
for (let i = 0; i < 1000000; i++) {
num += 1;
}
return num;
}
// 第一次调用
const result1 = myUseMemo(() => expensiveCalculation(counter), [counter]);
console.log('结果1:', result1); // 会执行计算
counter = 0; // 依赖项未变
// 第二次调用,依赖项未变,应该直接返回缓存值
const result2 = myUseMemo(() => expensiveCalculation(counter), [counter]);
console.log('结果2:', result2); // 不会执行计算
counter = 1; // 依赖项改变
// 第三次调用,依赖项改变,会重新执行计算
const result3 = myUseMemo(() => expensiveCalculation(counter), [counter]);
console.log('结果3:', result3); // 会执行计算这个简化的实现展示了
useMemo
useMemo
useMemo
Object.is
记忆化,或者说缓存计算结果,在前端开发中解决了一个非常实际且常见的痛点:性能瓶颈。我经常看到一些应用在用户交互时出现卡顿,或者在数据量稍大时就变得迟缓,很多时候,这都源于不必要的重复计算或渲染。
想象一下,你有一个组件,它需要根据一些输入数据进行复杂的计算,比如排序一个巨大的列表,或者处理大量数据以生成一个图表。如果这个组件的父组件仅仅是更新了一个与当前计算无关的状态(比如一个简单的计数器),导致子组件重新渲染,那么这个昂贵的计算就会被再次执行。这就像你每次去厨房拿水,都要重新把水烧开一遍,即使水壶里还有热水。这显然是低效的。
useMemo
useMemo
useMemo
useMemo
dependencies array
useMemo
useMemo
它的重要性体现在几个方面:
useMemo
[]
useMemo
props.userId
props.userId
useMemo
userId
useMemo
useMemo
正确管理依赖项,是写出健壮、高效React代码的基石之一。
useMemo
useCallback
useMemo
useCallback
useMemo
useMemo
useCallback
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]); // 这里的memoizedValue 是 computeExpensiveValue 的返回结果
useCallback
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
// 这里的memoizedCallback 是一个函数何时选择哪个?
我的经验是这样:
当你需要缓存一个“数据结果”时,用useMemo
const filteredAndSortedItems = useMemo(() => {
// 假设这是一个耗时的操作
return items.filter(item => item.isActive).sort((a, b) => a.name.localeCompare(b.name));
}, [items]);
// 只有当 items 变化时,才重新计算 filteredAndSortedItems当你需要缓存一个“函数定义”并将其作为props
useCallback
React.memo
React.memo
const handleClick = useCallback(() => {
console.log('按钮被点击了');
// 依赖项为空,这个函数引用永远不会变
}, []);
// ...在JSX中
<MyButton onClick={handleClick} />如果
MyButton
React.memo
handleClick
简而言之,
useMemo
useCallback
以上就是JS如何实现useMemo?记忆化的值的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号