blob: 5f69849d45389f32d81422697e2d00ddd925cdf6 [file] [log] [blame]
<!--
* track-by="primary": diff array by this as the primary key, default is the index
* use `Vue.set(list, index, value)` to set a item value, do not use `list[index] = value`
* use `list.splice()`, `list.push()`, `list.pop()`, `list.shift()`, `list.unshift()`, `list.sort()`, `list.reverse()`, do not use `list.length = x`
-->
<template>
<div>
<text class="title">Track by</text>
<text class="subtitle" v-for="(item, k, $index) in list" track-by="item.key">{{$index}}-{{item.text}}</text>
<text class="btn" @click="update">Update</text>
<text class="btn" @click="mutate">Mutate</text>
</div>
</template>
<style scoped>
.title {font-size: 48px;}
.subtitle {font-size: 36px;}
.btn {font-size: 36px; text-align: center; color: white; background-color: gray; padding: 20px; border-radius: 5px;}
</style>
<script>
module.exports = {
data: function () {
return {
list: [
{key: 1, text: 'a'},
{key: 2, text: 'a'},
{key: 3, text: 'b'},
{key: 4, text: 'c'},
{key: 5, text: 'a'}
],
flag: true
}
},
methods: {
update: function (e) {
// equals to `this.list.text = 'foo'`
// DO NOT USE: `this.list[2] = {key: 3, text: 'foo'}}`
Vue.set(this.list, 2, {key: 3, text: 'foo'})
console.log('this.list', this.list)
},
mutate: function (e) {
if (this.list.length % 2) {
this.list.push({key: 'x', text: 'bar'})
}
else {
this.list.pop()
}
console.log('this.list', this.list)
}
}
}
</script>