浅析Vue如何巧用computed计算属性

 更新时间:2023年06月09日 17:09:30   作者:田八  
在日常使用Vue开发项目的时候,计算属性computed是一个非常常用的特性,本文就来分享一些使用Vue的computed计算属性时的一些小技巧,希望能够帮助到大家

在日常使用Vue开发项目的时候,计算属性computed是一个非常常用的特性,它的主要作用是对数据进行处理,然后返回新的数据,这样就不需要在模板中写过多的逻辑代码,从而使得模板更加简洁,可读性更强。

今天我就来分享一些我在使用Vuecomputed计算属性时的一些小技巧,希望能够帮助到大家。

1. 计算属性的基本用法

计算属性的用法很简单,一同分为四个部分:gettersetteronTrackonTrigger

  • get:计算属性的getter函数,当计算属性的依赖发生改变时,会执行该函数,返回计算属性的值。
  • set:计算属性的setter函数,当直接修改计算属性的值时,会执行该函数。
  • onTrack:计算属性的依赖被追踪时,会执行该函数。
  • onTrigger:当计算属性的依赖项发生改变时,会执行该函数。

代码如下:

import { computed } from 'vue'
const count = ref(0)
const plusOne = computed({
    get() {
        return count.value + 1
    },
    set(val) {
        count.value = val - 1
    },
    onTrack(e) {
        debugger;
    },
    onTrigger(e) {
        debugger;
    }
});
console.log(plusOne.value) // 1
console.log(count.value) // 0
plusOne.value = 1
console.log(plusOne.value) // 2
console.log(count.value) // 1

这里我们最常用的就是get,可以简写如下:

const plusOne = computed(() => count.value + 1)

onTrackonTrigger一般用于调试,当我们想要知道计算属性的依赖项发生了什么变化时,可以在这两个函数中打断点调试。

具体可参考官网:

在官网上给出了一些计算属性的使用场景,以及一些计算属性的注意事项,这里如果卷一些的话,可以看一下,下面我就来分享一些我在使用计算属性时的一些小技巧。

2. 计算属性的小技巧

2.1. 监听多个数据的变化

// 多个数据想要同时监听
const a = ref(1)
const b = ref(2)
const c = ref(3)
// 将其合并为一个计算属性
const multiply = computed(() => {
    return {
        a: a.value,
        b: b.value,
        c: c.value,
    }
})
// 监听计算属性的变化
watch(
    () => multiply.value,
    (val) => {
        console.log(val)
    }
)
// 修改数据
a.value = 2 // { a: 2, b: 2, c: 3 }
b.value = 3 // { a: 2, b: 3, c: 3 }
c.value = 4 // { a: 2, b: 3, c: 4 }

2.2. 监听对象的部分属性

const obj1 = ref({
    a: 1,
    b: 2,
    c: 3,
})
const obj2 = ref({
    a: 1,
    b: 2,
    c: 3,
})
// 监听对象的部分属性
const combine = computed(() => {
    return {
        a: obj1.value.a,
        b: obj2.value.b,
    }
})
// 监听计算属性的变化
watch(
    () => combine.value,
    (val) => {
        console.log(val)
    }
)
// 修改数据
obj1.value.a = 2 // { a: 2, b: 2 }
obj1.value.b = 3 // 无输出
obj1.value.c = 4 // 无输出
obj2.value.a = 2 // 无输出
obj2.value.b = 3 // { a: 2, b: 3 }
obj2.value.c = 4 // 无输出

可以多个对象结合监听部分字段的变化,这样就不需要手动判断具体修改的是哪个对象的哪个字段了。

2.3. 监听数组的部分元素

const arr1 = ref([1, 2, 3])
const arr2 = ref([1, 2, 3])
// 监听数组的部分元素
const combine = computed(() => {
    return [
        arr1.value[0],
        arr2.value[1],
    ]
})
// 监听计算属性的变化
watch(
    () => combine.value,
    (val) => {
        console.log(val)
    }
)
// 修改数据
arr1.value[0] = 2 // [2, 2]
arr1.value[1] = 3 // 无输出
arr1.value[2] = 4 // 无输出
arr2.value[0] = 2 // 无输出
arr2.value[1] = 3 // [2, 3]
arr2.value[2] = 4 // 无输出

对数组也可以像对象一样监听部分元素的变化。

2.4. 缓存与更新

// 这是一个大对象,我不需要它是响应式的,但是我需要它能响应式的更新
const list = new Array(100).fill(0).map((item, index) => ({key: index, value: item}))
// 强制刷新
const forceFlush = ref(0);
const cache = computed(() => {
    forceFlush.value; // 这里使用一下,什么都不干就行
    // 这里会对大对象进行一系列的计算,然后给结果缓存下来方便使用
    const cache = list.reduce((prev, curr) => {
        prev[curr.key] = curr;
        return prev
    }, {})
    // 这里就方便直接通过 key 获取
    return (key) => {
        return cache[key] || {}
    }
})
console.log(cache.value(0).value); // 0
// 这里是不会更新的
list[0] = {key: 0, value: 1};
console.log(cache.value(0).value); // 0
// 给一个刷新信号就可以了
forceFlush.value++;
console.log(cache.value(0).value); // 1

2.5. 双向绑定

const props = defineProps({
    modelValue: {
        type: String,
        default: ""
    }
});
const emit = defineEmits(["update:modelValue"]);
const value = computed({
    get() {
        return props.modelValue;
    },
    set(val) {
        emit("update:modelValue", val);
    }
});
value.value = 'hello';

双向绑定需要配合defineEmits(["update:modelValue"])来使用,每次调用emit("update:modelValue", val)很麻烦;

现在使用computed就可以实现value.value = value这种方式直接修改,很符合直观也满足了单向数据流的原则;

总结

在日常使用Vue中,合理的使用Vue的各种特性不仅能使开发效率加倍,同时也能使代码看起来更加整洁。

注意可以使用各种特性,但是不要炫技,够用好用就行,不要写出那种无人能撼动你的地位的代码,手动狗头。

以上就是浅析Vue如何巧用computed计算属性的详细内容,更多关于Vue computed的资料请关注脚本之家其它相关文章!

相关文章

  • Electron + vue 打包桌面操作流程详解

    Electron + vue 打包桌面操作流程详解

    这篇文章主要介绍了Electron + vue 打包桌面操作流程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • 详解Vue.js中.native修饰符

    详解Vue.js中.native修饰符

    这篇文章主要介绍了Vue.js中.native修饰符,给普通的HTML标签监听一个事件,之后添加 .native 修饰符是不会起作用的。需要的朋友可以参考下
    2018-04-04
  • vue刷新子组件、重置组件以及重新加载子组件项目实战记录

    vue刷新子组件、重置组件以及重新加载子组件项目实战记录

    在vue开发中出于各种目的,我们常常需要让组件重新加载渲染,这篇文章主要给大家介绍了关于vue刷新子组件、重置组件以及重新加载子组件的相关资料,需要的朋友可以参考下
    2023-12-12
  • vue中template模板编译的过程全面剖析

    vue中template模板编译的过程全面剖析

    这篇文章主要介绍了vue中template模板编译的过程全面剖析,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 在Vue3中使用BabylonJs开发 3D的初体验

    在Vue3中使用BabylonJs开发 3D的初体验

    这篇文章主要介绍了在 Vue3 中使用 BabylonJs 开发 3D 是什么体验,在本文中,向您展示了如何创建 Vue 组件、Babylon 类、在画布上渲染场景以及创建 3D 网格,需要的朋友可以参考下
    2022-07-07
  • Vue.js项目部署到服务器的详细步骤

    Vue.js项目部署到服务器的详细步骤

    这篇文章给大家介绍了Vue.js项目部署到服务器的详细步骤,既然是部署到服务器,肯定是需要一个云的。具体思路步骤大家可以参考下本文
    2017-07-07
  • 解决VuePress页面乱码问题

    解决VuePress页面乱码问题

    这篇文章主要介绍了解决VuePress页面乱码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Vue自嵌套树组件使用方法详解

    Vue自嵌套树组件使用方法详解

    这篇文章主要为大家详细介绍了Vue自嵌套树组件的使用方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 手写vue无限滚动指令的详细过程

    手写vue无限滚动指令的详细过程

    今天在移动端项目中遇见一个需求,需要数据无限滚动,所以下面这篇文章主要给大家介绍了关于手写vue无限滚动指令的详细过程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • mpvue 项目初始化及实现授权登录的实现方法

    mpvue 项目初始化及实现授权登录的实现方法

    这篇文章主要介绍了mpvue 项目初始化及实现授权登录的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07

最新评论