vue基础(4)--computed&&watch

178 阅读1分钟

import Vue from 'vue'

new Vue({
  el: '#root',
  template: `
    <div>
      <p>Name: {{name}}</p>               //watch方法有缓存,性能开销好
      <p>Name: {{getName()}}</p>          //数据变化,DOM重新渲染的话, 方法会被重新调用
      <p>Number: {{number}}</p>
      <p>FullName: {{fullName}}</p>
      <p><input type="text" v-model="number"></p>
      <p>FirstName: <input type="text" v-model="firstName"></p>
      <p>LastName: <input type="text" v-model="lastName"></p>
      <p>Name: <input type="text" v-model="name"></p>
      <p>Obj.a: <input type="text" v-model="obj.a"></p>
    </div>
  `,
  data: {
    firstName: 'PPP',
    lastName: 'Liu',
    number: 0,
    fullName: '',
    obj: {
      a: 0
    }
  },
  computed: {                                       //有数据变化,做一次计算,有缓存
    /*name(){            //用这种形式为好              
        return `${this.firstName} ${this.lastName}`
    }*/
    name: {
      get () {
        console.log('new name')
        return `${this.firstName} ${this.lastName}`//依赖的数据变化,才重新计算
      },
      set (name) {       //尽量不要用这
        const names = name.split(' ')
        this.firstName = names[0]
        this.lastName = names[1]
      }
    }
  },
  watch: {                                          //多用监听后,做发送指令用
    'obj.a': {
      handler () {
        console.log('obj.a changed')
        this.obj.a += 1
      },
      immediate: true      //加上,加载就立马执行
      // deep: true        //对象属性上见效果obj.a,升入观察,耗性能
    },
    firstName(newName,oldName){                    //最初不加载, 有变化在执行
        this.fullName = newName +' ' +this.lastName     
    }
  },
  methods: {
    getName () {
      console.log('getName invoked')
      return `${this.firstName} ${this.lastName}`
    }
  }
})

优先使用computed方法,有缓存。

watch用法:监听到某个数据的变化,要做某个指令的操作,就watch这个数据的变化。


坑点注意:

computed,watch里面不要改引用值的值,防死循环。