本文主要介紹了vue 實例方法和數據的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下,希望能幫助到大家。
1.vm.$set
問題描述:
如何在不透過循環資料為list資料新增一個showMore屬性,並且在moreFun中改變這個新增屬性的值,並實現雙向綁定?
<template> <p id="app"> <p class="demo"> <ul> <template v-for="(v,index) in list"> <li>{{v.name}}</li> <p v-show="!v.showMore"> <button @click="moreFun(index)">展示更多</button> </p> </template> </ul> </p> </p> </template> <script> export default { name: 'app', data() { return { list: [{ name: '小颖' }, { name: '仔仔' }, { name: '黑妞' }, { name: '土豆' }] } }, methods: { moreFun(index) { console.log(this.list); } } } </script> <style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
一開始小穎並不知道怎麼做,而且小穎覺得 在
<p v-show="!v.showMore"> <button @click="moreFun(index)">展示更多</button> </p>
這段程式碼肯定會錯誤,然而當小穎寫上後發現,並沒有
moreFun(index) { this.$set(this.list[index], 'showMore', true); console.log(this.list); }
這段程式碼肯定會錯,然而當小穎寫上後發現,並沒有
<script> export default { name: 'app', data() { return { list: [{ name: '小颖' }, { name: '仔仔' }, { name: '黑妞' }, { name: '土豆' }] } }, mounted: function() { this.list.forEach(function(element, index) { element.showMore = false; }); }, methods: { moreFun(index) { this.list[index].showMore = true; console.log(this.list); } } } </script>
- {{v.name}}
<p v-show="!v.showMore"> <button @click="moreFun(index)">展示更多</button> </p>
這段程式碼肯定會錯,然而當小穎寫上後發現,並沒有
<p v-show="!v.showMore"> <button @click="moreFun(index)">展示更多</button> </p>
這段程式碼肯定會錯,然而當小穎寫上後發現,並沒有,##後來那位帥鍋告訴我,看看vue的 vm.$set 小穎看後將moreFun方法寫為:
<template> <p id="app"> <p class="demo"> <input type="text" class="num1" v-model="num1"> <label class="sign">-</label> <input type="text" class="num2" v-model="num2"> <label class="sign">=</label> <label class="result">{{resultNum}}</label> </p> </p> </template> <script> export default { name: 'app', data() { return { num1: 1, num2: 5, resultNum: null } }, watch: { num1: function() { var _num1 = parseInt(this.num1); var _num2 = parseInt(this.num2); this.resultNum = _num1 - _num2; }, num2: function() { var _num1 = parseInt(this.num1); var _num2 = parseInt(this.num2); this.resultNum = _num1 - _num2; } }, mounted: function() { var _num1 = parseInt(this.num1); var _num2 = parseInt(this.num2); this.resultNum = _num1 - _num2; } } </script> <style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } input.num1, input.num2 { width: 100px; } label.sign { font-size: 30px; vertical-align: -3px; } label.result { font-size: 20px; } </style>
然後就達到小穎想要的結果啦。小穎當時遇到的問題類似於這樣的:
<template> <p id="app"> <p class="demo"> <ul> <template v-for="(v,index) in list"> <li>{{v.name}}</li> <li>{{v.age}}</li> <button @click="deleteFun(index)">delete</button> </template> </ul> </p> </p> </template> <script> export default { name: 'app', data() { return { list: [{ name: '小颖', age:22 }, { name: '仔仔', age:1 }, { name: '黑妞', age:1 }, { name: '土豆', age:1 }] } }, methods: { deleteFun(index) { this.$delete(this.list[index], 'age'); } } } </script> <style> #app { font-family: 'Avenir', Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #2c3e50; margin-top: 60px; } </style>
問題:當執行完moreFun方法後,雖然list中的showMore屬性的值變成了true,但是
rrreee按鈕展示更多 仍然顯示著,這是因為,如果在實例建立之後新增新的屬性到實例上,它不會觸發視圖更新。
所以後來小穎就將showMore直接加入list中,然後就好啦。現在想想其實實用個vm.$set就解決啦。
2.vm.$watch
用法:
觀察 Vue 實例變化的一個表達式或計算屬性函數。回呼函數得到的參數為新值和舊值。表達式只接受監督的鍵路徑。對於更複雜的表達式,用一個函數取代。
注意:在變異 (不是替換) 物件或陣列時,舊值將與新值相同,因為它們的引用指向同一個物件/陣列。 Vue 不會保留變異之前值的副本。
rrreee3.vm.$delete
這是全域 Vue.delete 的別名。 rrreee
相關推薦:vue-cli專案中使用mockjs詳解vue中使用圖片懶載入vue- lazyload外掛程式############vue專案中定義全域變數和全域函數方法#######以上是vue 實例方法與資料詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!