首页 > 编程笔记 > JavaScript笔记 阅读:49

Vue3 computed()的用法(附带实例)

Vue3 组合式 API 中的 computed() 函数与选项式 API 中的 computed 属性的功能是一样的,只是在语法的使用上不同而已,但不管是在组合式 API 还是在选项式 API 中,都是既可以只指定 getter,也可以指定 getter(指 get 方法)和 setter(指 set 方法)的。

computed() 函数接收的参数可以是一个函数,也可以是一个包含 get 方法和 set 方法的对象。当参数为函数时,就是指定了 getter,用来返回动态计算的结果值;当参数为对象时,就是指定了 getter 和 setter,此时既可以通过 getter 返回动态计算的结果值,也可以通过 setter 监听计算属性的修改。

computed() 函数的返回值是计算属性对象,它本质上是一个 ref 对象,getter 返回的值会被自动保存到其 value 属性上。当我们修改计算属性对象的 value 属性值时,setter 就会被自动调用。

下面通过代码演示 computed() 函数的使用方法:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>computed() 函数</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/vue/3.2.40/vue.global.js"></script>
</head>
<body>
    <div id="app">
        <h3>测试只带 get 方法的计算属性</h3>
        <p>数量:{{ count }}</p>
        <p>姓名:{{ person.name }}</p>
        <p>信息(get 方法计算属性):{{ info }}</p>
        <button @click="update">更新</button>

        <h3>测试带 get 和 set 方法的计算属性</h3>
        <input type="text" v-model="doubleCount" />
    </div>
    <script>
        const { createApp, ref, reactive, computed } = Vue;

        createApp({
            setup() {
                // 定义 ref 对象
                const count = ref(0);
                // 定义 reactive 对象
                const person = reactive({
                    name: '张三',
                });

                // 定义只有 getter 的计算属性
                const info = computed(() => {
                    return `${person.name}完成的数量${count.value}`;
                });

                // 定义有 getter 和 setter 的计算属性
                const doubleCount = computed({
                    get() {
                        console.log(info);
                        return count.value * 2;
                    },
                    set(value) {
                        count.value = value / 2;
                    },
                });

                // 更新 ref 或 reactive 数据
                const update = () => {
                    count.value += 1;
                    person.name += '---';
                };

                return {
                    count,
                    person,
                    info,
                    update,
                    doubleCount,
                };
            },
        }).mount('#app');
    </script>
</body>
</html>
代码运行后的页面效果如下图所示:


图 1 代码运行后的页面效果

在上面的代码中,我们先分别定义了一个 ref 对象 count 和一个 reactive 对象 person,然后调用 computed() 函数来定义计算属性 info,传入的参数为用于动态计算属性值的 get() 函数。

computed() 函数返回的 info 对象,本质上是一个 ref 对象,可以通过控制台进行查看,如下图所示:


图 2 通过控制台查看info对象

根据控制台输出的结果可以看出,内部“_value”的值就是执行 get() 函数,在读取前面的 ref 和 reactive 响应式数据后,计算并返回的结果。同时返回了计算属性对象,在模板中就可以读取计算属性显示。

当点击“更新”按钮时,我们在点击回调中更新了计算属性依赖的 ref 数据和 reactive 数据,info 计算属性的 get() 函数会自动执行,并将返回的结果值更新到页面上。

当然如果模板中有多处读取计算属性,则计算属性的 get() 函数只会执行一次,因为计算属性有缓存,这是与选项式 API 一样的特点。

接着定义了带 get() 和 set() 方法的计算属性 doubleCount,在 get() 方法中返回前面 count 对象的两倍值,在 set() 方法中将最新值的一半更新给了 count 对象。在返回 doubleCount 计算属性的同时,在模板中利用 v-model 指令对 doubleCount 计算属性进行双向数据保存处理。

在初始显示时,程序会自动执行 doubleCount 计算属性的 get() 方法,根据初始 count 值进行计算,返回 0 并显示到输入框中。当用户点击“更新”按钮更新 count 值时,doubleCount 计算属性的 get() 方法会被自动调用,返回新计算结果并显示到输入框中;当用户在输入框中改变输入内容时,v-model 指令会将输入的最新值赋给 doubleCount 计算属性,这自然会触发 set() 方法执行。随后在 set() 方法中更新了 count 值,这样页面上的数量和计算属性信息都会更新显示。

相关文章