vue封装带有缓存的函数

vue中有时候列表上的某些参数需要经过复杂且耗时的计算时,会造成性能问题,原因是列表上的某一行数据变化后,整个组件的reder函数都会重新运行,那么每行都会重新进行复杂的运算。

计算属性不支持传参,才有的下文。

解决方案:封装带有缓存功能的函数。

// Vue3示例

<script setup lang="ts">

import { computed, reactive } from 'vue';  

const cacheMap = new Map()

function getCountPlant(fn) {

  return function (v) {

    if (cacheMap.has(v)) {

      return cacheMap.get(v)

    }  

    const cacheData = computed(() => fn(v))

    cacheMap.set(v, cacheData.value)

    console.log(v, '---------', cacheData.value);

    return cacheData.value

  }

}  

function getCount(v) {

  return v * 10 + (v + 1) * (v - 1)

}

const newGetCount = getCountPlant(getCount)

const testData = reactive({

  value: [

    {

      id: 1,

      title: '第一个标题',

    value: 1,

    },

  {

      id: 2,

      title: '第一个标题',

    value: 2,

    },

  {

      id: 3,

      title: '第一个标题',

    value: 3,

  },

] })  

const edit = () => {

  const r = ~~(Math.random() * 3)

  const v = ~~(Math.random() * 100) + 1

  testData.value[r].value = v  

  const r2 = ~~(Math.random() * 3)

  const v2 = ~~(Math.random() * 100) + 1

  testData.value[r2].value = v2

}

</script>  

<template>

  <el-button @click="edit">click</el-button>

  <div v-for="item in testData.value" :key="item.id">{{ item.title }}-- {{ newGetCount(item.value) }}</div>

</template>  

<style scoped lang="scss"></style>

点此发表评论
暂无评论