代码如下:
<template>
<div style="display:flex; align-items:center;">
<div class="left">
<div v-for="(l, index) in lists" :key="l.id" @click="choose(index)">
<input type="checkbox" :checked="l.checked">
<span>{{l.name}}-{{l.side}}</span>
</div>
</div>
<div class="switch" style="margin:0 20px;">
<div @click="toLeft" style="width:20px;height:20px;border:1px solid #ccc;margin-top:10px;">《</div>
<div @click="toRight" style="width:20px;height:20px;border:1px solid #ccc;margin-top:10px;">》</div>
</div>
<div class="right">
<div v-for="(l, index) in right" :key="l.id" @click="choose(index)">
<input type="checkbox" :checked="l.checked">
<span>{{l.name}} {{l.side}}</span>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
lists: [
{
id: 1,
name: 'list1'
},
{
id: 2,
name: 'list2'
},
{
id: 3,
name: 'list3'
},
{
id: 4,
name: 'list4'
},
{
id: 5,
name: 'list5'
},
{
id: 6,
name: 'list6'
},
{
id: 7,
name: 'list7'
},
{
id: 8,
name: 'list8'
}
]
}
},
computed: {
left() {
return this.lists.filter(el => el.side === 'left')
},
right() {
return this.lists.filter(el => el.side === 'right')
}
},
methods: {
choose(index) {
this.lists[index].name = 'ceshi'
this.lists[index].side ='out'
this.lists[index].checked = !this.lists[index].checked
// this.$set(this.lists, index, this.lists[index])
},
toLeft() {
},
toRight() {
}
},
mounted() {
this.lists.forEach((el, index) => {
el.checked = false
el.side = 'left'
console.log(el)
this.$set(this.lists, index, el)
});
},
}
</script>
组件初始化的时候在mounted
中为lists
添加的两个属性值,并使用$set
设置为响应式数据,当我点击左侧数据执行choose
事件时,如果我注释掉choose
事件的第一行,后面两行的side
和checked
修改不会触发视图的更新,必须再使用$set
。但是如果放开第一行,就可以直接触发视图更新,不需要再使用$set
。
这是什么情况呢?我在初始化的时候使用$set
注册成响应式数据了呀,为什么不能直接修改side
和checked
的值呢?
而且我修改的name
的值后就可以直接修改了呢、?
使用的是vue快速原型开发vue-cli4, node10V+
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…