站長資訊網
        最全最豐富的資訊網站

        vue計算屬性是什么

        vue計算屬性:在【Vue.js 0.12.8】版本之前,只要讀取相應的計算屬性,對應的getter就會重新執行。而在【Vue.js 0.12.8】版本中,在這方面進行了優化,即只有計算屬性依賴的屬性值發生了改變時才會重新執行getter。

        vue計算屬性是什么

        vue計算屬性:

        一、計算屬性

        計算屬性就是當其依賴屬性的值發生變化時,這個屬性的值會自動更新,與之相關的DOM部分也會同步自動更新。

        代碼如下:

        <div id="example">         <input type="text" v-model="didi">         <input type="text" v-model="family">         <br>         didi={{didi}},family={{family}},didiFamily={{didiFamily}}     </div>     var vm = new Vue({         el:'#example',         data:{             didi:'didi',             family:'family'         },         computed:{             <!-- 一個計算屬性的getter -->             didiFamily:function(){                 <!-- this指向vm實例 -->                 return this.didi+this.family             }         }     })

          當vm.didi和vm.family的值發生變化時,vm.didiFamily的值會自動更新,并且會自動同步更新DOM部分。

          前面實例只提供了getter,實際上除了getter。我們還可以設置計算屬性的setter。代碼示例如下:

        <div id="example">         <input type="text" v-model="didi">         <input type="text" v-model="family">         <br>         didi={{didi}},family={{family}},didiFamily={{didiFamily}}     </div>     var vm = new Vue({         el:'#example',         data:{             didi:'didi',             family:'family'         },         computed:{             <!-- 一個計算屬性的getter -->             didiFamily:function(){                 get:function(){                     <!-- this指向vm實例 -->                     return this.didi+this.family                 },                 <!-- 一個計算屬性的setter -->                 set:function(newVal){                     var names = newVal.split('')                     this.didi = names[0]                     this.didi = names[1]                 }             }         }     })

        當設置vm.didiFamily的值時,vm.didi和vm.family的值也會自動更新。

        二、計算屬性緩存

          計算屬性的特性的確很誘人,但是如果在計算屬性方法中執行大量的耗時操作,則可能會帶來一些性能問題。例如,在計算屬性getter中循環一個大的數組以執行很多操作,那么當頻繁調用該計算屬性時,就會導致大量不必要的運算。

          在Vue.js 0.12.8版本之前,只要讀取相應的計算屬性,對應的getter就會重新執行。而在Vue.js 0.12.8版本中,在這方面進行了優化,即只有計算屬性依賴的屬性值發生了改變時才會重新執行getter。

          這樣也存在一個問題,就是只有Vue實例中被觀察的數據屬性發生了改變時才會重新執行getter。但是有時候計算屬性依賴實時3的非觀察數據屬性。代碼示例如下:

        var vm = new Vue({    data:{        welcome:'welcome to join didiFamily'              },    computed:{         example:function(){             return Date.now() + this.welcome              }             }   })

          我們需要在每次訪問example時都取得最新的時間而不是緩存的時間。從Vue.js 0.12.11版本開始,默認提供了緩存開關,在計算屬性對象中指定cache字段來控制是否開啟緩存。代碼示例如下:

        var vm = new Vue({    data:{        welcome:'welcome to join didiFamily'              },    computed:{         example:function(){             //關閉緩存,默認為true             cache:false,             get:function(){              return Date.now() + this.welcome                             }                }             }   })

        設置cache為false關閉緩存之后,每次直接訪問vm.example時都會重新執行getter方法。

        三、常見問題

          在實際開發中使用計算屬性時,我們會遇到各種各樣的問題,以下是搜集到的一些常見問題以及解決方案。

        計算屬性getter不執行的場景

          從前面我們了解到,當計算屬性依賴的數據屬性發生改變時,計算屬性的getter方法就會執行。但是在有些情況下,雖然依賴數據屬性發生了改變,但計算屬性的getter方法并不會執行。但是在有些情況下,雖然依賴數據屬性發生了改變,但計算屬性的getter方法并不會執行。

              當包含計算屬性的節點被移除并且模板中其他地方沒有再引用該屬性時,那么對應的計算屬性的getter方法不會執行。代碼示例如下:

        <div id="example">         <button @click='toggleShow'>Toggle Show Total Price</button>         <p v-if="showTotal">Total Price = {{totalPrice}}</p>     </div>     new Vue({         el:'#example',         data:{             showTotal:true,             basePrice:100         },         computed:{             totalPrice:function(){                 return this.basePrice + 1             }         },         methods:{             toggleShow:function(){                 this.showTotal = !this.showTotal             }         }     })

        當點擊按鈕使showTotal為false,此時P元素會被移除,在P元素內部的計算屬性totalPrice的getter方法不會執行。但是當計算屬性一直出現在模板中時,getter方法還是會被執行

          2.在v-repeat中使用計算屬性

            有時候從后端獲得JSON數據集合后,我們需要對單條數據應用計算屬性。在Vue.js 0.12之前的版本中,我們可以在v-repeat所在元素上使用v-component指令。代碼示例如下:

        <div id="items">         <p v-repeat="items" vue-component="item">             <button>{{fulltext}}</button>         </p>     </div>     var items = [         {number:1,text:'one'},         {number:2,text:'two'}     ]     var vue = new Vue({         el:'#items',         data:{             items:items         },         components:{             item:{                computed:{                     fulltext:function(){                         return 'item' +this.text                     }                 },              }         }     })

        在Vue.js 0.12版本中,Vue.js廢棄了v-component指令,所以我們需要使用自定義元素組件來實現在v-repeat中使用計算屬性。代碼示例如下:

        <div id="items">         <my-item v-repeat="items" inline-template>                      </my-item>     </div>     var items = [         {number:1,text:'one'},         {number:2,text:'two'}     ]     var vue = new Vue({         el:'#items',         data:{             items:items         },         components:{             'my-item':{                replace:true,                 computed:{                     fulltext:function(){                         return 'item' +this.text                     }                 },              }         }     })

        相關免費學習推薦:js視頻教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 尤物yw午夜国产精品视频| 99在线精品免费视频九九视| 国产69精品久久久久99| 精品久久久久久无码专区| 国产午夜亚洲精品理论片不卡 | 自拍偷在线精品自拍偷无码专区| 91精品国产91久久久久久青草 | 国产乱子伦精品无码专区| 国产成人无码精品一区二区三区 | 69久久精品无码一区二区| 中文精品人人永久免费| 久久九九久精品国产| 国产伦精品一区二区三区视频猫咪| 久久97精品久久久久久久不卡| 国产2021久久精品| 日韩精品成人一区二区三区| 97精品国产手机| 91麻豆精品视频| 99久久免费国产精品热| 国产成人亚洲综合无码精品| 国产午夜精品一区二区三区漫画| 亚洲AV无码久久精品色欲| 综合在线视频精品专区| 尤物TV国产精品看片在线| 亚洲国产精品一区二区第四页| 欧美日韩精品在线观看| 免费精品精品国产欧美在线| 久久久精品久久久久特色影视| 久久国产成人亚洲精品影院 | 国产精品国产三级专区第1集 | 国产精品久久影院| 久久精品国产福利国产秒| 国产精品视频一区二区三区经| 国产成人精品免费午夜app| 99re这里只有精品6| 亚洲国产精品久久久久网站| 办公室久久精品| 美女岳肉太深了使劲国产精品亚洲专一区二区三区 | 国产在线精品一区二区不卡麻豆| 精品无码久久久久久久动漫| 久久久久一级精品亚洲国产成人综合AV区 |