美文网首页
lodash的memoize 和 memoize-one有啥区别

lodash的memoize 和 memoize-one有啥区别

作者: 小遁哥 | 来源:发表于2020-08-16 00:01 被阅读0次

    lodash的memoize

    默认的情况下,memoize 只会根据形参的的一个参数进行缓存

    function test(a,b){
        console.log('执行了')
        return a+b;
    }
    
    var mTest = _.memoize(test);
    
    mTest(1,2)
    VM982:2 执行了
    3
    

    再次相同参数

    mTest(1,2)
    3
    

    这看起来似乎不错

    mTest(1,12)
    3
    

    显示结果应该是13
    对于值相同但引用不同来说

    function test(a,b){
        console.log('执行了')
        return a.a+b.b;
    }
    
    mTest({a:1},{b:2})
    VM1166:2 执行了
    3
    

    相同参数再一次的

    mTest({a:1},{b:2})
    VM1166:2 执行了
    3
    

    好在可以传递第二个参数用于指定缓存的key,例如

    var mTest = _.memoize(test,(a,b)=>a.a + "" + b.b);
    

    memoize 还会存储每一次缓存的结果

    memoize-one

    首先它是根据所有形参进行缓存的,而且只保留上一次执行的数据

    import memoizeOne from 'memoize-one';
    
    const add = (a, b) => a + b;
    const memoizedAdd = memoizeOne(add);
    
    memoizedAdd(1, 2); // 3
    memoizedAdd(1, 2); // 3
    // 不执行,返回上一次的结果
    memoizedAdd(2, 3); // 5
    // 执行
    memoizedAdd(1, 2); // 3
    // 执行
    

    传递第二个参数来自定义比较函数
    默认的行为,如果形参长度相等,则通过===进行比较,如果形参长度不等,直接返回false,真的有必要的话,可以使用_.isEqual实现深比较。

    在React中使用memoizeOne,可以直接

      filter = memoize((list, filterText) =>
        list.filter(item => item.text.includes(filterText))
      );
    

    没有必要跑到构造函数里面写

    this.filter = memoize(this.filter ) 
    

    前者更加的只观&省事

    新版本的memoizeOne 已经用TS了,意味着可以自动导入了哦。

    其实对于这种库,没有类型声明文件,可以通过下面方式解决

    export { default as memoizeOne } from 'memoize-one';
    

    相关文章

      网友评论

          本文标题:lodash的memoize 和 memoize-one有啥区别

          本文链接:https://www.haomeiwen.com/subject/gfuzdktx.html