监视属性中可以开启异步任务:

当计算属性中添加异步操作时会导致页面读取不到数据,

computed: {
    fullName() {
        setTimeout(() => {
            return this.firstName + '-' + this.lastName;
        }, 1000)
    }
},

页面展示:

是由于 return 这个返回值交给的是 setTimeout 里的函数,即粉色框内容交给了红色框。所以 fullName 是没有办法拿到值的,页面也无法展示。

注意:

​ 1. 所被 vue 管理的函数,最好写成普通函数,这样 this 的指向才是 vm 或组件实例对象

​ 2. 所有不被 vue 管理的函数(定时器的回调函数,ajax 的回调函数,Promise 的回调函数等),最好写成箭头函数,这样 this 的指向才是 vm 或组件实例对象

在 watch 中某个监听属性下的定时器任务中打印 this,指向的是 vue 实例。箭头函数没有自己的 this,向上一级查找,找到 firstName,是被 vue 所管理的,所以 this 指向 vm。

watch: {
    firstName(newVal) {
        setTimeout(() => {
            console.log('this', this)
            this.fullName = newVal + '-' + this.lastName;
        }, 1000)
    },
        lastName(newVal) {
            this.fullName = this.firstName + '-' + newVal
        }
},

如果将定时器写成普通函数,this 指向 window

watch: {
    firstName(newVal) {
        setTimeout(function() {
            console.log('this', this)
            this.fullName = newVal + '-' + this.lastName;
        }, 1000)
    },
        lastName(newVal) {
            this.fullName = this.firstName + '-' + newVal
        }
},

更新于

请我喝[茶]~( ̄▽ ̄)~*

HaiLan 微信支付

微信支付

HaiLan 支付宝

支付宝

HaiLan 贝宝

贝宝