[英]How to make JavaScript function runs only when parameter changes
我正在使用 React,每次發生變化時都會渲染整個組件。 雖然我有一個最小的組件,但它運行一個沉重的 function。 如果它的參數沒有改變,我不希望這個 function 在每個渲染上運行。 類似React.memo
的東西(如果組件的 props 沒有改變,基本上不會重新渲染組件)。 static JavaScript 函數是否有等效的React.memo
?
注意:我不想引入諸如reselect
之類的庫。 一定有更好的方法!
編輯:我覺得我不太清楚我在尋找什么。 讓我用一個例子來問這個問題,
每次我點擊+
或-
時,它都會運行pleaseMemoizeThisFunction
function,即使它的參數沒有改變。 我怎樣才能讓這個 function 僅在其任何參數更改時運行。
這是一個簡單的記憶實現,檢查 function 是否與上次使用相同的 arguments 調用,並且僅在它們不同時重新計算結果。
在您的沙箱中看到您使用 Typescript,我已將類型添加到此 function。
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);
在你的函數周圍使用 useMemo 鈎子,除非參數發生變化,否則它不會運行。 https://reactjs.org/docs/hooks-reference.html#usememo
const 計算 = useMemo(() => calculateExpensive(param1, param2), [param1, param2]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.