剛開始寫代碼以下:(運行:http://jsbin.com/qonoliy/2/ed...)html
<div id="test"> <div class="item" v-for="item in items" @click="toggle(item)" > <div>{{item.name}}</div> <div v-show="item.show"> 初始隱藏 </div> </div> </div> <script> new Vue({ el: '#test', data: { items: [{ name: 'a', show: false }, { name: 'b', show: false }, { name: 'c', show: false }] }, methods: { toggle: function(item) { item.show = !item.show; } } }); </script>
因爲data.items
是後端傳過來的,沒有show
這個字段, 無奈只好把 data.items
遍歷添加 show
屬性。(運行:http://jsbin.com/qonoliy/4/ed...)vue
var data = [{ name: 'a', }, { name: 'b', }, { name: 'c', }]; data.map(function(item){ item.show = false; }); new Vue({ el: '#test', data: { items: data }, methods: { toggle: function(item) { item.show = !item.show; } } });
對服務端數據進行遍歷處理仍是不太優雅,若是可以在v-for
循環中給 item 添加 show 屬性就行了。
可是彷佛不行。(運行:http://jsbin.com/qonoliy/5/ed...後端
@vingojw 提供了在觸發 toggle 事件是添加屬性的方法 (運行:http://jsbin.com/qonoliy/6/ed...)this
toggle: function(item) { Vue.set(item, 'show', this.show = !this.show); }
@X-Ray 提出了一個個寫法(運行:http://jsbin.com/qonoliy/7/ed...)lua
toggle: function($index) { var item = this.items[$index]; var state = item.show; var obj = $.extend(true, {}, item); obj.show = !state; this.items.$set($index, obj); }
想起了 angluar 有個 ng-init 彷佛能夠作此事,vue 暫時沒有 v-init 指令,那就自定義一個 v-init 指令
http://jsbin.com/qonoliy/8/ed...code
angluar 使用 v-init 實現
http://jsbin.com/finayi/edit?...htm