<template>
<div>
<!-- c-table为基于elementUI的el-table进行封装的组件 -->
<c-table :table-column="priceTableCol" :table-data="list">
<template v-slot:name2="row">
<el-input v-model="row.data.name2" />
</template>
</c-table>
</div>
</template>
<script>
export default {
data(){
return{
list:[]
}
},
created(){
this.priceTableCol = [
{
prop: 'name',
label: '姓名',
align: 'center'
},
{
label: '别名',
align: 'center',
slot: 'name2'
},
{
prop: 'age',
label: '年龄',
align: 'center'
},
]
this.getData()
},
methods:{
getData(){
// 模拟在服务端拉取数据
this.list=[
{name:111, age:18},
{name:222, age:22}
]
this.list.forEach(item=>{
item.name2= item.name
})
}
}
}
</script>
执行逻辑为
当前使用vue版本2.6.12
重命名
对象的新增属性不能被监听到
;数组通过数据下标进行赋值不能被监听到
;直接修改数组的length属性不能被监听到
;可以通过$set来解决!
<template>
<div>
<el-button @click="togetData">点击</el-button>
<c-table :table-column="priceTableCol" :table-data="list" :span-method="spanMethod" :is-show-pagination="false">
<template v-slot:name2="row">
<el-input v-model="row.data.name2" />
</template>
</c-table>
</div>
</template>
<script>
export default {
data(){
return{
list:[]
}
},
created(){
this.priceTableCol = [
{
prop: 'name',
label: '姓名',
align: 'center'
},
{
label: '重命名',
align: 'center',
slot: 'name2'
},
{
prop: 'age',
label: '年龄',
align: 'center'
},
]
this.getData()
},
methods:{
getData(){
this.list=[
{name:111, age:18},
{name:222, age:22}
]
this.list.forEach(item=>{
this.$set(item, 'name2', item.name)
})
},
togetData(){
console.log('this.list', this.list)
}
}
}
</script>
[1]发现 在没有使用$set时,仅有name属性与age属性有set与get方法,name2属性没有
[2]在使用了$set对name2进行赋值之后,name2也有get与set方法
在vue中,并不是任何时候数据都是双向绑定的,就比如上述修改多层嵌套数据时,数据的双向绑定就会失效;set为解决双向绑定失效而生!
修改/添加数组属性
Vue.$set(数组,索引值,元素值)
修改/添加对象属性
Vue.set(对象, 属性名,属性值)
其实$set就是调用 Object.defineProperty 方法为当前属性添加get与set方法!
使用vue实例化对象的$forceUpdate方法也可以解决此问题;