关于vue的computed、filters、watch

filtersjavascript

这个属性你们可能用的不是不少java

由于通常的数组过滤咱们用 es6的filter就能完成了es6

 

我想到一个场景,网上买书促销数组

满100减50缓存

满两百减100app

  <input type="text" v-model="price"/>
  <p>满100减50</p>
  <p>满200减100</p>
  <p>折后价格:{{price | priceFilter}}</p>

   data:{
    price:100
  },    
  filters:{
    priceFilter(price){
      let disCount = 0
      if(price>=100 && price <200){
        disCount = 50
      }else if(price > 200){
        disCount = 100
      }else{
        
      }
      price = price - disCount
      return price
    }
  }

 这种场景用filters就比较适合了性能

 

computedthis

computed适合比较单纯的数据改动,拼接等操做而且保存在一个新的变量里spa

好比拼接姓和名code

  <p>{{lastName}}{{firstName}}</p>
  <p>computed:{{username}}</p>
  <input type="text" v-model="firstName"/>
  <input type="text" v-model="str"/>


  data:{
    firstName:'小明',
    lastName:'王',
    str:'213'
  },
  computed:{
    username:function(){
      console.log(123)
      return this.lastName + this.firstName
    }
  }

 特别注意的是,computed会缓存

在咱们要监听的数据没有变化的时候,是不会再去执行对象相应的数据的

好比修改str,不会输出123

可是若是是filters的话,会从新执行里面的操做,不会缓存

因此,computed性能比较好

 

watch

watch监听一我通常用来处理页面的联动效果

通常是发请求或者监听路由进行相应操做

 watch想说的是  immediate 和 deep两个属性

immediate在数据第一次改变前就会调用

适合初始化数据

  <select name="codeName" v-model="selectedOption" id="">
    <option :value="item" v-for="item in selectArr">{{item}}</option>
  </select>

const vm = new Vue({
  el:"#app",
  data:{
    selectArr:['js','java'],
    selectedOption:'js',
    showText:''
  },
  
  watch:{
    selectedOption:{
     handler:function(val, oldVal){
      this.showText = this.selectedOption
    },
    immediate:true
    }
  }
}

 deep是深度监听,能监听对象新增属性值

  <input type="text" v-model="deepA.obj.y">
  <input type="text" v-model="deepB.obj.y">

const vm = new Vue({
  el:"#app",
  data:{
    deepA:{x:1,obj:{y:1}},
    deepB:{x:2,obj:{y:2}}
}

 watch:{
    deepA:{
     handler:function(val, oldVal){
      console.log('deepA has change')
    },
    deep:false
    },
    deepB:{
     handler:function(val, oldVal){
      console.log('deepB has change')
    },
    deep:true
    }
  }

 当咱们改变 deepA的时候,watch不会触发

deepB由于有了 deep:true因此触发了

 

另外:input改变deepA和deepB的时候都会触发 filters里面方法(不会缓存)

以上全部demo的地址

相关文章
相关标签/搜索