重读 Vue文档 --- computed

351 阅读1分钟

引言

看过多遍 vue.js 文档,但是对一些知识点始终似懂非懂。于是便有了重读 Vue.js 文档的计划。此篇对 computed 属性进行了一些梳理,分享给大家。

设计初衷

用于简单运算,避免在模版中放入太多的逻辑,造成难以维护。computed 属性是从一种(一些)状态中推导出另一种状态,且computed 属性的 getter 方法是无副作用的(side effect),类似于纯函数(pure function)。

特点

依赖于响应式依赖进行缓存的

更新条件

  • 依赖的是响应式状态
  • 状态发生了改变。

传参

<template>
    {{ computedText('daniel fang') }}
</template>

computed: {
    computedText () {
        return function (value) {
            return value.slice(0, 6);
        }
    }
}

setter

computed 默认只有 getter, 此 getter 即为 Object.defineProperty 中的 getter。在需要时亦可提供 setter。

  • 希望在改变 computed 属性时,做一些其他的操作。
computed: {
    fullName: {
        get () {
            return this.firstName + ' ' + this.lastName;
        },
        set (newValue) {
            var names = newValue.split(' ');
            this.firstName = names[0];
            this.lastName = names[names.length - 1];
        }
    }
}
  • 与 vuex 配合使用的时候
<template>
    <input v-model="message">
</template>

computed: {
    message: {
        get () {
            return this.$store.state.message;
        },
        set (newValue) {
            this.$store.commit('updateMessage', newValue);
        }
    }
}
  • 子组件中表单绑定了依赖于某个 props 的 computed
<template>
    <radio v-model="message"></radio>
</template>

props: ['msg'],
computed: {
    message: {
        get () {
            return this.msg;
        },
        set (newValue) {
            this.$emit('change', newValue);
        }
    }
}

总结

本篇文章是个人对 computed 属性的一些理解,希望能对大家有所帮助。如果有错误或不严谨的地方,欢迎批评指正,如果喜欢,欢迎点赞

参考