Skip to content

memo

函数缓存。

基本用法

传入一个函数,返回一个带缓存的新函数。

ts
import { memo } from '@renzp/utils';

let runCount = 0;
const add = (a: number, b: number) => {
  runCount++;
  return a + b;
};
const addMemo = memo(add);
addMemo(1, 1);
addMemo(1, 1);
addMemo(2, 2);
console.log(runCount); // 2

自定义缓存key

默认是将函数的参数数组通过JSON.stringify转换作为key,如果此方式不能满足缓存key的话,可以通过options.key函数来设置缓存key。

ts
import { memo } from '@renzp/utils';

let runCount = 0;
const add = (a: number, b: number) => {
  runCount++;
  return a + b;
}
const addMemo = memo(add, { key: (a) => a });
addMemo(1, 1);
addMemo(1, 2);
addMemo(1, 3);
console.log(runCount); // 1

设置最大缓存量

默认最大缓存10个数据,如果想增加,可以通过options.max设置。

注意:max小于1的时候无效。

ts
import { memo } from '@renzp/utils';

let runCount = 0;
const add = (a: number, b: number) => {
  runCount++;
  return a + b;
};
const addMemo = memo(add, { max: 3 });
// +1
addMemo(1, 1);
addMemo(1, 1);
// +1
addMemo(2, 2);
addMemo(2, 2);
// +1
addMemo(3, 3);
addMemo(3, 3);
console.log(runCount); // 3
// +1
addMemo(4, 4);
// +1
addMemo(1, 1);
addMemo(1, 1);
addMemo(1, 1);
console.log(runCount); // 5

其他操作

同时缓存函数还携带了工具函数:

  • clear():清空缓存
  • remove(key: any):删除指定缓存。注意:默认key是参数数组。
  • set:设置缓存。注意:默认key是参数数组。
ts
import { memo } from '@renzp/utils';

let runCount = 0;
const add = (a: number, b: number) => {
  runCount++;
  return a + b;
};

const addMemo = memo(add);

let count = addMemo(1,1);
count = addMemo(1,1);
console.log(count); // 2
console.log(runCount); // 1
addMemo.remove([1, 1]);
count = addMemo(1,1);
console.log(runCount); // 2

count = addMemo(2,2);
count = addMemo(3,3);
count = addMemo(3,3);
console.log(runCount); // 4
addMemo.clear();
count = addMemo(1,1);
count = addMemo(2,2);
count = addMemo(3,3);
console.log(runCount); // 7

count = addMemo(1,1);
console.log(count); // 2
addMemo.set([1, 1],10);
count = addMemo(1,1);
console.log(count); // 10
console.log(runCount); // 7

参数

参数说明类型默认值是否必填
fn要组合的函数T-
options配置MemoOptions<T>-

options

参数说明类型默认值是否必填
key自定义缓存key(...args: Parameters<T>) => any-
max最大缓存数量number10

返回

参数说明类型
fn带缓存的函数MemoReturnType<T>
ts
export type AnyFunction = (...args: any[]) => any

export type MemoReturnType<T extends AnyFunction> = ((
  ...args: Parameters<T>
) => ReturnType<T>) & {
  clear: () => void
  remove: (key: any) => void
  set: (key: any, data: ReturnType<T>) => void
}