欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入淺析Vue中的 computed 和 watch

 更新時(shí)間:2018年06月06日 11:32:09   作者:吳凌云  
computed 計(jì)算屬性是通過屬性計(jì)算得來的屬性,watch屬性變化,就會(huì)觸發(fā)監(jiān)聽的函數(shù)。下面通過本文給大家介紹Vue中的 computed 和 watch,感興趣的朋友一起看看吧

computed

計(jì)算屬性:通過屬性計(jì)算得來的屬性

    計(jì)算屬性,是在相關(guān)聯(lián)的屬性發(fā)生變化才計(jì)算,計(jì)算過一次,如果相關(guān)屬性沒有變化,下一次就不需要計(jì)算了,直接去緩存的值

a:<input type="number" v-model.number="a" />
 b:<input type="number" v-model.number="b" />
 <!--c:<input type="number" v-model.number="c" />-->
 總和:{{sum()}}
 總和:{{count}}
 平均值:{{avg}}
 <p v-once>單價(jià):{{price}}</p>
 <p>數(shù)量:<input type="number" v-model.number="count"/></p>
 <p>總價(jià):{{sum}}</p>
 <p>運(yùn)費(fèi):{{free}}</p>
 <p>應(yīng)付:{{pay}}</p>
  data: {
      a: '',
      b:'',
      c:'',
      price: 28.8,
      count: '',
      free: 10
  },
  computed: {
    count(){
      console.log('計(jì)算屬性觸發(fā)了');
        return this.a+this.b;
    },
    avg(){
      return this.count/2;
    },
    sum(){
      return this.price * this.count;
    },
   pay(){
    if(this.count>0){
      if(this.sum>=299){
        return this.sum;
    }else{
      return this.sum + this.free;
    }
     }else{
        return 0;
    }
    }
   }

watch

屬性變化,就會(huì)觸發(fā)監(jiān)聽的函數(shù)。

監(jiān)聽屬性變化,一般是用于跟數(shù)據(jù)無關(guān)的業(yè)務(wù)邏輯操作。

計(jì)算屬性,適用于屬性發(fā)生變化后,需要計(jì)算得到新的數(shù)據(jù)。        

<div id="app">
      a: <input type="number" v-model.number="a" /><br />
      b: <input type="number" v-model.number="b" /><br />
      總和:{{count}}
      <br /><br /><br />
      name: <input type="text" v-model="obj.name" /><br />
      age: <input type="text" v-model.number="obj.age" /><br />
    </div>
    <script src="vue.js"></script>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          a: '',
          b: '',
          count: '',
          obj: {
            name: '',
            age: ''
          }
        },
        watch: {
          a(newVal, oldVal){
            console.log('觸發(fā)了a-watch');
            this.count = this.a + this.b;
          },
          b(newVal){
            console.log('觸發(fā)了b-watch');
            this.count = this.a + this.b;
          },
//          obj(newVal, oldVal){
//            console.log('觸發(fā)了obj的監(jiān)聽');
//          }
//
          obj: {
            //監(jiān)聽對(duì)象中的每一個(gè)值
            handler(newVal, oldVal){
              console.log('觸發(fā)了obj的監(jiān)聽');
            },
            deep: true//深度監(jiān)聽
          },
          //監(jiān)聽對(duì)象中的某個(gè)屬性
          'obj.name': function(){
            console.log('觸發(fā)了obj.name的監(jiān)聽');
          }
        }
      })
    </script>

watch 也可以在methods里面進(jìn)行監(jiān)聽配置

<div id="app">
      a: <input type="number" v-model.number="a" /><br />
      b: <input type="number" v-model.number="b" /><br />
      總和:{{count}}
      <br /><br /><br />
      name: <input type="text" v-model="obj.name" /><br />
      age: <input type="text" v-model.number="obj.age" /><br />
      <button @click="btnAction()">開始監(jiān)聽</button>
    </div>
    <script src="vue.js"></script>
    <script>
      var vm = new Vue({
        el: '#app',
        data: {
          a: '',
          b: '',
          count: '',
          obj: {
            name: '',
            age: ''
          }
        },
        methods: {
          btnAction(){
            this.$watch('a', (newVal, oldval)=>{
              console.log('監(jiān)聽到了a的變化');
              console.log(newVal, oldval);
            })
            this.$watch('obj.name', (newVal, oldval)=>{
              console.log('監(jiān)聽到了obj.name的變化');
              console.log(newVal, oldval);
            })
            this.$watch('obj', (newVal, oldval)=>{
              console.log('監(jiān)聽到了obj的變化');
              console.log(newVal, oldval);
            }, {
              deep: true
            })
          }
        }
      })
//      vm.$watch('a', (newVal, oldval)=>{
//        console.log('監(jiān)聽到了a的變化');
//        console.log(newVal, oldval);
//      })
//      
//      vm.$watch('obj.name', (newVal, oldval)=>{
//        console.log('監(jiān)聽到了obj.name的變化');
//        console.log(newVal, oldval);
//      })
//      
//      vm.$watch('obj', (newVal, oldval)=>{
//        console.log('監(jiān)聽到了obj的變化');
//        console.log(newVal, oldval);
//      }, {
//        deep: true
//      })
    </script>

下面在看下computed 和 watch

  都可以觀察頁面的數(shù)據(jù)變化。當(dāng)處理頁面的數(shù)據(jù)變化時(shí),我們有時(shí)候很容易濫用watch。 而通常更好的辦法是使用computed屬性,而不是命令是的watch回調(diào)。

/*html:
  我們要實(shí)現(xiàn) 第三個(gè)表單的值 是第一個(gè)和第二個(gè)的拼接,并且在前倆表單數(shù)值變化時(shí),第三個(gè)表單數(shù)值也在變化
  */
<div id="myDiv">
  <input type="text" v-model="firstName">
  <input type="text" v-model="lastName">
  <input type="text" v-model="fullName">
</div>
<!--js: 用watch方法來實(shí)現(xiàn)-->
//將需要watch的屬性定義在watch中,當(dāng)屬性變化氏就會(huì)動(dòng)態(tài)的執(zhí)行watch中的操作,并動(dòng)態(tài)的可以更新到dom中 
 new Vue({
 el: '#myDiv',
 data: {
  firstName: 'Foo',
  lastName: 'Bar',
  fullName: 'Foo Bar'
 },
 watch: {
  firstName: function (val) {
   this.fullName = val + ' ' + this.lastName
  },
  lastName: function (val) {
   this.fullName = this.firstName + ' ' + val
  }
 }
})
<!--js: 利用computed 來寫-->
  //計(jì)算屬性是基于它們的依賴進(jìn)行緩存的。計(jì)算屬性只有在它的相關(guān)依賴發(fā)生改變時(shí)才會(huì)重新求值。
  //這就意味著只要 message 還沒有發(fā)生改變,多次訪問 reversedMessage 計(jì)算屬性會(huì)立即返回之前的計(jì)算結(jié)果,而不必再次執(zhí)行函數(shù)。
 new Vue({
    el:"#myDiv",
      data:{
        firstName:"Den",
        lastName:"wang",
      },
      computed:{
        fullName:function(){
          return this.firstName + " " +this.lastName;
        }
      }
  })

  很容易看出 computed 在實(shí)現(xiàn)上邊的效果時(shí),是更簡單的。

總結(jié)

以上所述是小編給大家介紹的Vue中的 computed 和 watch,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • vue如何把字符串中的所有@內(nèi)容,替換成帶標(biāo)簽的

    vue如何把字符串中的所有@內(nèi)容,替換成帶標(biāo)簽的

    這篇文章主要介紹了vue如何把字符串中的所有@內(nèi)容,替換成帶標(biāo)簽的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • 解決vue ui報(bào)錯(cuò)Couldn‘t parse bundle asset“C:\Users\Administrator\vue_project1\dist\js\about.js“. Analyzer

    解決vue ui報(bào)錯(cuò)Couldn‘t parse bundle asset“C:

    這篇文章主要介紹了解決vue ui報(bào)錯(cuò)Couldn‘t parse bundle asset“C:\Users\Administrator\vue_project1\dist\js\about.js“. Analyzer問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • unplugin-auto-import與unplugin-vue-components安裝問題解析

    unplugin-auto-import與unplugin-vue-components安裝問題解析

    這篇文章主要為大家介紹了unplugin-auto-import與unplugin-vue-components問題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Vue中的作用域CSS和CSS模塊的區(qū)別

    Vue中的作用域CSS和CSS模塊的區(qū)別

    這篇文章主要介紹了Vue中的作用域CSS和CSS模塊的區(qū)別,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • Vue實(shí)現(xiàn)父子組件傳值其實(shí)不難

    Vue實(shí)現(xiàn)父子組件傳值其實(shí)不難

    這篇文章主要介紹了Vue實(shí)現(xiàn)父子組件傳值其實(shí)不難問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Vue使用electron生成桌面應(yīng)用過程詳解

    Vue使用electron生成桌面應(yīng)用過程詳解

    這篇文章主要介紹了Vue使用electron生成桌面應(yīng)用過程,很想使用 electron 制作一個(gè)桌面應(yīng)用,但是真的上手使用的時(shí)候才發(fā)現(xiàn) electron 的坑實(shí)在是太多了,先將遇到的坑記錄在這里,遇到一個(gè)記錄一個(gè)
    2023-04-04
  • Vue學(xué)習(xí)之常用指令實(shí)例詳解

    Vue學(xué)習(xí)之常用指令實(shí)例詳解

    這篇文章主要介紹了Vue學(xué)習(xí)之常用指令,結(jié)合實(shí)例形式詳細(xì)分析了vue.js創(chuàng)建實(shí)例、常用指令及相關(guān)操作技巧,需要的朋友可以參考下
    2020-01-01
  • vue resource post請(qǐng)求時(shí)遇到的坑

    vue resource post請(qǐng)求時(shí)遇到的坑

    這篇文章主要介紹了vue resource post請(qǐng)求時(shí)遇到的坑,需要的朋友可以參考下
    2017-10-10
  • vue封裝tree組件實(shí)現(xiàn)搜索功能

    vue封裝tree組件實(shí)現(xiàn)搜索功能

    本文主要介紹了vue封裝tree組件實(shí)現(xiàn)搜索功能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • vue2項(xiàng)目中如何使用clipboard復(fù)制插件

    vue2項(xiàng)目中如何使用clipboard復(fù)制插件

    這篇文章主要介紹了vue2項(xiàng)目中如何使用clipboard復(fù)制插件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論