Vue3中computed学习总结

62 阅读2分钟

computed学习总结

computed是什么

computed是vue3中的计算属性,它用于声明式地描述一个值,这个值依赖于其他数据,并且当依赖的数据发生变化时,计算属性会自动重新计算。

方法没有缓存,计算属性有缓存(当识别属性没有变化时就不执行)

computed的语法

computed的语法有两种,一种是使用函数的形式,另一种是使用对象的形式。

1.函数形式:这样定义fullName是一个计算属性,是只读的,不能修改

<div>
    <h2>姓: <input type="text" v-model="firstName" /></h2>
    <h2>名: <input type="text" v-model="lastName" /></h2>
    <h2>原始写法——姓名: {{ firstName.slice(0,1).toUpperCase() + firstName.slice(1) }} - {{ lastName }}</h2> 
    <h2>由computed函数形式监听——姓名:{{ fullName }}</h2>
    <button @click="changeName">改变changeName</button> 
    <hr>
</div>
   import { ref, computed } from 'vue';

    let firstName = ref('zhang');
    let lastName = ref('三');

    const changeName = () => {
        firstName.value = '李';
        lastName.value = '四';
    }
    // 这样定义fullName是一个计算属性,是只读的,不能修改
    let fullName = computed(() => {
        return firstName.value.slice(0,1).toUpperCase() + firstName.value.slice(1) + '-' + lastName.value;
    })
    // fullName.value = 'hello'; // 这样是不可以的,会报错:fullName是一个计算属性,是只读的,不能修改

fullName.value = 'hello'; 这样是不可以的,会报错:fullName是一个计算属性,是只读的,不能修改 image.png

image-1.png

2.对象形式:如果需要修改,需要使用set方法

<div>
    <div>
    <h2>姓: <input type="text" v-model="firstName" /></h2>
    <h2>名: <input type="text" v-model="lastName" /></h2>
    <h2>原始写法——姓名: {{ firstName.slice(0,1).toUpperCase() + firstName.slice(1) }} - {{ lastName }}</h2>  
    <h2>由computed对象形式监听——姓名:{{ fullName2 }}</h2>
    <button @click="changeFullName2">改变fullName2</button>
    <hr>
</div>
</div>
 // 如果需要修改,需要使用set方法
 import { ref, computed } from 'vue';

    let firstName = ref('zhang');
    let lastName = ref('三');
 
    let fullName2 = computed({
        get() {
            return firstName.value.slice(0,1).toUpperCase() + firstName.value.slice(1) + '-' + lastName.value;
        },
        set(value: string) { 
            const name = value.split('-');
            firstName.value = name[0];
            lastName.value = name[1];
        }
    }) 
    const changeFullName2 = () => {
        // 这边代码没有修改任何值,只是调用了fullName2中set方法
        fullName2.value = '王五-五';
    }
  

这边代码没有修改任何值,只是调用了fullName2set方法

    const changeFullName2 = () => {
       // 这边代码没有修改任何值,只是调用了fullName2中set方法
       fullName2.value = '王五-五';
   }

image-2.png

computed的原理

computed的原理是通过getter和setter来实现的。当依赖的数据发生变化时,computed会自动调用getter函数来重新计算值。如果computed有setter函数,那么当computed的值被修改时,setter函数会被调用。

computed的注意事项

  1. computed的值是惰性的,只有当依赖的数据发生变化时,computed才会重新计算值。
  2. computed的值是响应式的,当依赖的数据发生变化时,computed的值也会自动更新。
  3. computed的值不能直接修改,如果需要修改computed的值,需要通过computed的setter函数来实现。