美文网首页
VUE DAY3 变异方法、计算属性和侦听器

VUE DAY3 变异方法、计算属性和侦听器

作者: 为什么要简称 | 来源:发表于2019-11-22 13:15 被阅读0次

动态添加的属性不是响应式的

(对于被Object.defineProperty修饰过的属性可以成为响应式属性。)
如果要向响应式对象中添加一个响应式的属性,且触发视图更新。
想要?如下:

//Vue无法探测普通的新增属性
this.myObject.newProperty = 'hi'

//破解方法 vm.$set(target, key, value)
this.$set(this.MyObject, 'newProperty', 'hi)

Vue.set(this.MyObject, 'newProperty', 'hi')

变异方法

变异方法(mutation method),会改变被这些方法调用的原始数组。
push()
pop()
shift()
unshift()
sort()
reverse()
调用以上变异方法的时候,会触发视图更新。

对应的,也有非变异方法(non-mutating method)
filter()
concat()
slice()
这些方法不改变原始数组,但是会返回一个新数组。

如果利用索引设置一个项,Vue是检测不到改动的。破解方法参考以上动态添加属性。

监听器

vue实例提供了一个watch属性,用于监听vue实例中属性的变化。

<script>
  var vm = new Vue({
    el:'...',
    data:{...},
    //watch对应了一个属性
    watch:{
      //msg:键,观察的属性
      //funtion:值,对应的回调函数
      msg:function(value, [oldvalue]){
        ...
      }
    }

  })
</script>

如果要监视一个对象中内部属性的改变,需要加上deep:true属性,否则vue无法监听到内部值的变化。

watch:{
  user:{
    deep:true,
    hander:funtion(curr, old){
      ...
    }
  }
}

添加immediate属性表示立马进行监听。

计算属性

当计算属性依赖的数据发生改变时,计算属性会重新计算一次,如果计算属性依赖的属性没有发生改变,那么计算属性就不会重新计算。

var vm = new Vue({ 
  el: '#app', 
  data: { n1:'', n2:'' }, 
  //n3依赖与n1和n2的值,当n1 和 n2发生改变的时候,这个函数就会执行。 
  //返回值就是n3的值 
  computed: { 
    n3(){ 
      return +this.n1 + +this.n2; 
    } 
  } 
});

计算属性是基于它们的依赖项进行缓存的,即上例中n3基于n1和n2进行了缓存,如果n1和n2的值没有发生改变,那么多次访问n3时,计算属性会返回之前的的计算结果,而不会再执行函数。
计算属性不能和data中的属性同名,因为无论是data属性还是计算属性,最终都是挂载到vm上的。

计算属性默认只有getter,不过在需要是可以自己设置一个setter

computed: {
  fullName: {
    // getter
    get: function () {
      return this.firstName + ' ' + this.lastName
    },
    // setter
    set: function (newValue) {
      var names = newValue.split(' ')
      this.firstName = names[0]
      this.lastName = names[names.length - 1]
    }
  }
}

相关文章

网友评论

      本文标题:VUE DAY3 变异方法、计算属性和侦听器

      本文链接:https://www.haomeiwen.com/subject/rnizictx.html