Vue学习—computed与watch

参考:https://segmentfault.com/a/1190000012948175?utm_source=tag-newest

1.computed

1.1 定义

是一个计算属性,类似于过滤器,对绑定到view的数据进行处理

    computed: {
        fullName() {
            return this.firstName + ' ' + this.lastName
        },
        // 计算属性默认只有 getter,不过在需要时你也可以提供一个 setter:
        fullName3: {
            get() {
                //回调函数 当需要读取当前属性值是执行,根据相关数据计算并返回当前属性的值
                return this.firstName + ' ' + this.lastName
            },
            set(val) {
                //监视当前属性值的变化,当属性值发生变化时执行,更新相关的属性数据
                //val就是fullName的最新属性值
                console.log(val)
                const names = val.split(' ')
                console.log(names)
                this.firstName = names[0]
                this.lastName = names[1]
            }
        },
    },

 

 

 2. watch

2.1 定义

watch是一个观察的动作

    watch: {
        // 1.监听简单数据类型
        firstName(nVal, oVal) {
            this.fullName2 = nVal + ' ' + this.lastName
        },
        // lastName(nVal, oVal) {
        //     this.fullName2 = this.firstName + ' ' + nVal
        // },

        // watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
        lastName: {
            handler(nVal, oVal) {
                this.fullName2 = this.firstName + ' ' + nVal
            },
            immediate: true
        },
        // 2.监听复杂数据类型
        // console.log打印的结果,发现oldVal和newVal值是一样的,所以深度监听虽然可以监听到对象的变化,但是无法监听到具体对象里面那个属性的变化
        // oldVal和newVal值一样的原因是它们索引同一个对象/数组。Vue 不会保留修改之前值的副本
        data: {
            handler(nVal, oVal) {
                console.log(nVal.name + '<=' + oVal.name)
                this.firstName = nVal.name
            },
            deep: true
        },
        // 3.监听对象单个属性
        // 方法一:可以直接对用对象.属性的方法拿到属性
        'data.name'(nVal, oVal) {
            console.log(nVal + '<=' + oVal)
            this.lastName = nVal
        },
        // 方法二:watch如果想要监听对象的单个属性的变化,必须用computed作为中间件转化,因为computed可以取到对应的属性值
        ageChange() {
            console.log('age属性值变化了')
        }
    }

 

3. computed和watch的区别

3.1 computed特性

1.是计算值,
2.应用:就是简化tempalte里面{{}}计算和处理props或$emit的传值
3.具有缓存性,页面重新渲染值不变化,计算属性会立即返回之前的计算结果,而不必再次执行函数

 

3.2 watch特性

1.是观察的动作,
2.应用:监听props,$emit或本组件的值执行异步操作
3.无缓存性,页面重新渲染时值不变化也会执行

完整代码:

<template>
    <div>
        computed的值:fullName: {{ fullName }}
        <div class="demo-item">
            <input v-model="firstName" />
        </div>
        <div class="demo-item">
            <input v-model="lastName" />
        </div>
        data.name的值:
        <div class="demo-item">
            <input v-model="data.name" />
        </div>
        data.age
        <div class="demo-item">
            <input v-model="data.age" />
        </div>
        fullName3的值:
        <div class="demo-item">
            <input v-model="fullName3" />
        </div>
        watch的值:fullName2: {{ fullName2 }}
    </div>
</template>

<script>
export default {
    name: 'Demo2Async',
    props: {
        asyncValue: {
            type: String
        }
    },
    data() {
        return {
            firstName: 'F',
            lastName: 'L',
            fullName2: '',
            data: {
                name: '',
                age: 1
            }
        }
    },
    computed: {
        fullName() {
            return this.firstName + ' ' + this.lastName
        },
        // 计算属性默认只有 getter,不过在需要时你也可以提供一个 setter:
        fullName3: {
            get() {
                //回调函数 当需要读取当前属性值是执行,根据相关数据计算并返回当前属性的值
                return this.firstName + ' ' + this.lastName
            },
            set(val) {
                //监视当前属性值的变化,当属性值发生变化时执行,更新相关的属性数据
                //val就是fullName的最新属性值
                console.log(val)
                const names = val.split(' ')
                console.log(names)
                this.firstName = names[0]
                this.lastName = names[1]
            }
        },

        ageChange() {
            return this.data.age
        }
    },
    watch: {
        // 1.监听简单数据类型
        firstName(nVal, oVal) {
            this.fullName2 = nVal + ' ' + this.lastName
        },
        // lastName(nVal, oVal) {
        //     this.fullName2 = this.firstName + ' ' + nVal
        // },

        // watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。
        lastName: {
            handler(nVal, oVal) {
                this.fullName2 = this.firstName + ' ' + nVal
            },
            immediate: true
        },
        // 2.监听复杂数据类型
        // console.log打印的结果,发现oldVal和newVal值是一样的,所以深度监听虽然可以监听到对象的变化,但是无法监听到具体对象里面那个属性的变化
        // oldVal和newVal值一样的原因是它们索引同一个对象/数组。Vue 不会保留修改之前值的副本
        data: {
            handler(nVal, oVal) {
                console.log(nVal.name + '<=' + oVal.name)
                this.firstName = nVal.name
            },
            deep: true
        },
        // 3.监听对象单个属性
        // 方法一:可以直接对用对象.属性的方法拿到属性
        'data.name'(nVal, oVal) {
            console.log(nVal + '<=' + oVal)
            this.lastName = nVal
        },
        // 方法二:watch如果想要监听对象的单个属性的变化,必须用computed作为中间件转化,因为computed可以取到对应的属性值
        ageChange() {
            console.log('age属性值变化了')
        }
    }
}
</script>

<style lang="scss" scope>
.demo-item {
    margin-bottom: 10px;
}
</style>

 

posted @ 2021-09-28 18:06  CHUNYIN  阅读(57)  评论(0)    收藏  举报