javascript - 如何使 JavaScript 函数仅在参数更改时运行
问题描述
我正在使用 React,每次发生变化时都会渲染整个组件。虽然我有一个尽可能小的组件,但它运行的功能很重。如果它的参数没有改变,我不希望这个函数在每个渲染上运行。类似的东西React.memo
(如果组件的道具没有改变,基本上不会重新渲染组件)。React.memo
静态 JavaScript 函数是否有等价物?
注意:我不想引入诸如reselect
. 一定有更好的方法!
编辑:我觉得我不太清楚我在寻找什么。让我用一个例子来问这个问题,
每次我单击+
or-
时,它都会运行该pleaseMemoizeThisFunction
函数,即使它的参数没有改变。我怎样才能让这个函数只在它的任何参数发生变化时运行。
解决方案
这是一个简单的 memoization 实现,它检查函数是否使用与上次相同的参数调用,并且仅在它们不同时重新计算结果。
在您使用 Typescript 的沙箱中看到,我已将类型添加到此函数中。
function memo<A extends any[], R>(fn:(...args:A) => R) {
let value:R,
before: A = {length:NaN} as any;
const sameAsBefore = (v:A[number], i:number) => v === before[i];
function memoized (...args:A):R {
if (args.length !== before.length || !args.every(sameAsBefore)) {
before = args;
value = fn.apply(this, args);
}
return value;
}
}
用法:
const pleaseMemoizeThisFunction = memo((a: string, b: string): string => {
console.count("function run: ");
// it will do some heavy stuff here
return `I am done with ${a} and ${b}`;
});
或喜欢this.someMethod = memo(this.someMethod);
推荐阅读
- javascript - 使用 javascript + octave 进行音频分析,“audiocontext 解码器和 octave 之间的通道数据结果不同”?
- sql - 如何通过 JAVA 或 SQL 查询根据系统(Windows)格式转换日期格式?
- javascript - 能够在firestore中存储数据后如何重定向到另一个html文件?
- powershell - 选择并迭代属性
- asp.net-core - Auth0 + Swashbuckle .Net Core 2.2。使用 SwaggerUI 时 jwt 令牌中缺少声明
- mongodb - 使用 $lookup 加入集合的新集合
- r - 如何根据数量更改ggplot中每个方面的xlim或比例?
- google-chrome - 如何修复“未检查的 runtime.lastError:消息端口在收到响应之前关闭。” 链接到 G-Cal 事件时?
- python - 在python中将嵌套的html表转换为嵌套字典?
- c# - 对于给定的文化不是有效的日历。参数名称:值可能是 PC 或 Windows 问题?