我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何巧用Vue缓存函数浅析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何巧用Vue缓存函数浅析

vue2中的缓存函数

vue2版本中有这么一个缓存函数


  
  function cached (fn) {
    var cache = Object.create(null);
    return (function cachedFn (str) {
      var hit = cache[str];
      return hit || (cache[str] = fn(str))
    })
  }
  

上面这个函数存在一个常用场景,比如存在一个数组,需要把每个元素的首字母转为大写。


const array = ['abc', 'ed', 'abc', 'acd', 'ed', 'fkg', ...];

常用的解决方法


// 定一个capitalize函数
function capitalize (str) {
    return str.charAt(0).toUpperCase() + str.slice(1)
 };
  
 const capitalizeArray = array.map(capitalize);

细心的我们会发现array中存在不少重复的元素, 他们返回的结果一样的,实际不需要重复计算执行capitalize,而且capitalize是一个PURE函数,此时我们可以利用上面的cached做一个备忘录的功能。

改造如下


function capitalize (str) {
    return str.charAt(0).toUpperCase() + str.slice(1)
 };
  
const capitalizeArray = array.map(cached(capitalize));

当遇到重复字符串的时候会直接返回缓存的结果。想想capitalize是一个十分耗时的任务,性能优化不止一点点。

改造vue缓存函数

上面的举例是缓存同步任务的纯函数,在业务开发中存在这么一个场景,输入框搜索。当输入框触发input事件的时候,我们都会调用接口返回查询结果。比如我输入了掘金关键字返回了结果,然后又输入掘金NBA返回了结果,此时我删掉了NBA,又查询掘金, 实际上这个结果我们之前查过,如果缓存起来直接拉缓存即可,不用再去调用接口。

我们基于cached实现一个缓存异步纯函数的备忘录


const cachedAsync = function(fn) {
    const cache = Object.create(null);
    return async str => {
        const hit = cache[str];
        if (hit) {
            return hit;
        }
        // 只缓存成功的Promise, 失败直接重新请求
        return (cache[str] = await fn(str));
    };
};

使用场景


const cachedAsyncQueryPrdList = cachedAsync(prdNo => {
    // 下面是一个请求的操作,返回一个promise
    return queryPrdList({
        prdNo
    });
}); 

<template>
    <el-input v-model="prdNo" placeholder="请输入产品编码" @input="handleQueryPrdList" />
    <el-select>
        <el-option v-for="item in prdList" :label="item.label" :value="item.value">
    </el-select>
</template>
<script>
export default {
    data() {
        prdNo: '',
        prdList: [],
    },
    methods: {
        async handleQueryPrdList() {
            const { data } = await cachedAsyncQueryPrdList(this.prdNo);
            this.prdList = data;
        }
    }
}
</script>

上面实现了,当输入相同的关键字,如果之前请求是成功的,直接拉起缓存,不会重新向服务器发起请求。因为我们的备忘录只会缓存成功的promise。

优化

针对上面的场景,虽然el-input底层已经使用compositionEnd和compositionStart事件来做一层防抖,只有文字真正输入到屏幕上才会去触发input事件。但是这是不够,如果用户输入手速很快,会出现一秒发几次请求的情况,增加了服务器负担。因此这种一般会搭配防抖函数使用。

防抖函数


const debounce = (fn, ms = 300) => {
    let timeoutId;
    return function(...args) {
        clearTimeout(timeoutId);
        timeoutId = setTimeout(() => fn.apply(this, args), ms);
    };
};

然后搭配我们的cachedAsync使用


const cachedAsyncQueryPrdList = cachedAsync(prdNo => {
    // 下面是一个ajax请求的操作,返回一个promise
    return queryPrdList({
        prdNo
    });
}); 

<template>
    <el-input v-model="prdNo" placeholder="请输入产品编码"  @input="debounceQueryPrdListFn" />
    <el-select>
        <el-option v-for="item in prdList" :label="item.label" :value="item.value">
    </el-select>
</template>
<script>
const noop = () => {};
export default {
    data() {
        prdNo: '',
        prdList: [],
        debounceQueryPrdListFn: noop,
    },
    created() {
        this.debounceQueryPrdListFn = debounce(this.handleQueryPrdList);
    },
    methods: {
        async handleQueryPrdList() {
            const { data } = await cachedAsyncQueryPrdList(this.prdNo);
            this.prdList = data;
        }
    }
}
</script>

FBI WARNING:  >>> cachedAsync函数,只适用于PURE函数。

这个实现已经在生产环境稳定使用,大家可以放心食用。

总结

到此这篇关于如何巧用Vue缓存函数的文章就介绍到这了,更多相关巧用Vue缓存函数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何巧用Vue缓存函数浅析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

深入浅出ASP数据缓存:剖析其工作原理和应用技巧

ASP数据缓存是一种高效的缓存机制,可显著提升Web应用程序的性能。深入解析了ASP数据缓存的工作原理,并提供了丰富的应用技巧,以帮助开发者充分利用缓存机制,优化应用程序的性能。
深入浅出ASP数据缓存:剖析其工作原理和应用技巧
2024-02-04

C++浅析数据在内存中如何存储

使用编程语言进行编程时,需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着,当您创建一个变量时,就会在内存中保留一些空间。您可能需要存储各种数据类型的信息,操作系统会根据变量的数据类型,来分配内存和决定在保留内存中存储什么
2022-11-13

如何使用php函数来优化缓存机制?

引言:在开发网站时,为了提高性能和访问速度,缓存机制是非常重要的。PHP内置了一些函数和扩展来帮助我们实现缓存功能。本文将介绍如何使用PHP函数来优化缓存机制,并提供具体的代码示例。一、了解缓存机制在开始优化缓存机制之前,首先需要了解缓存的
2023-10-21

vue如何使用keep-alive缓存页面

这篇文章主要介绍vue如何使用keep-alive缓存页面,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!keep-alive缓存页面比如在表单输入页面进入下一步后,再返回上一步到表单页时要保留表单输入的内容、比如在列
2023-06-26

如何使用Vue进行数据传递(方法浅析)

Vue是一个流行的JavaScript框架,它可以帮助我们构建高效的用户界面。在Vue中,有多种方法可以进行数据传递,这些方法可以应用于单个组件或整个Vue实例。本文将介绍如何使用Vue进行数据传递。PropsProps是Vue提供的一种属性绑定机制,它可以将数据从父组件传递到子组件。在父组件中,我们可以使用v-bind指令将数据绑定到子组件的Props属性,如下所示:```<
2023-05-14

如何使用缓存机制提升 PHP 函数性能?

通过缓存函数结果,php 可以显著提高性能。在 php.ini 中启用 opcode 缓存,并将脚本每个小时重新缓存一次:opcache.revalidate_freq=1。此外,可以使用 apc_add() 函数将函数结果存储在 apc
如何使用缓存机制提升 PHP 函数性能?
2024-04-24

vue如何使用keep-alive后清除缓存

小编给大家分享一下vue如何使用keep-alive后清除缓存,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!什么是keepalive?在平常开发中,有部分组件没有
2023-06-20

编程热搜

目录