简体   繁体   English

Vue Array.splice()不会删除element-ui表中的DOM元素

[英]Vue Array.splice() doesn't remove DOM element in element-ui table

I have a table with a hierarchical structure. 我有一个具有层次结构的表。 When I try to remove one of the children with "array.splice", VUE does not delete its Dom structure reactively. 当我尝试使用“array.splice”删除其中一个子节点时,VUE不会反应性地删除其Dom结构。 Has anyone come across this? 有人遇到过这个吗? What are the solutions? 有什么解决方案?

Reproduced this problem by the example of the table c site Vuejs 通过表c站点Vuejs的示例重现了这个问题

 var Main = { data() { return { tableData: [{ id: 1, date: '2016-05-02', name: 'wangxiaohu' }, { id: 2, date: '2016-05-04', name: 'wangxiaohu' }, { id: 3, date: '2016-05-01', name: 'wangxiaohu', children: [{ id: 31, date: '2016-05-01', name: 'wangxiaohu' }, { id: 32, date: '2016-05-01', name: 'wangxiaohu' }] }, { id: 4, date: '2016-05-03', name: 'wangxiaohu' }], tableData1: [{ id: 1, date: '2016-05-02', name: 'wangxiaohu' }, { id: 2, date: '2016-05-04', name: 'wangxiaohu' }, { id: 3, date: '2016-05-01', name: 'wangxiaohu', hasChildren: true }, { id: 4, date: '2016-05-03', name: 'wangxiaohu' }] } }, methods: { load(tree, treeNode, resolve) { resolve([ { id: 31, date: '2016-05-01', name: 'wangxiaohu' }, { id: 32, date: '2016-05-01', name: 'wangxiaohu' } ]) }, removeRow(row){ this.tableData[2].children.splice(0,1); //this.tableData.splice(0,1); } }, } var Ctor = Vue.extend(Main) new Ctor().$mount('#app') 
 @import url("//unpkg.com/element-ui@2.7.2/lib/theme-chalk/index.css"); 
 <script src="//unpkg.com/vue/dist/vue.js"></script> <script src="//unpkg.com/element-ui@2.7.2/lib/index.js"></script> <div id="app"> <template> <div> <el-button @click="removeRow"> Delete child </el-button> <el-table :data="tableData" style="width: 100%;margin-bottom: 20px;" border row-key="id"> <el-table-column prop="date" label="日期" sortable width="180"> </el-table-column> <el-table-column prop="name" label="name" sortable width="180"> </el-table-column> </el-table> <el-table :data="tableData1" style="width: 100%" row-key="id" border lazy :load="load" > <el-table-column prop="date" label="date" width="180"> </el-table-column> <el-table-column prop="name" label="name" width="180"> </el-table-column> </el-table> </div> </template> </div> 

I am using Vue 2.6.10 and element-ui 2.7.0 我正在使用Vue 2.6.10和element-ui 2.7.0

It seems to be an issue with the way element-ui handles data internally. 这似乎与element-ui内部处理数据的方式有关。 When modifying nested data directly, the table is not getting re-rendered. 直接修改嵌套数据时,表不会重新呈现。 (But the data was indeed mutated correctly, as could be seen when logging this.tableData after the splice() .) (但是数据确实是正确的,正如在splice()之后记录this.tableData时可以看到的this.tableData 。)

It helps to create a copy of the tableData (you might need a workaround/polyfill for Array.from() if you'd like to support older browsers), modify that and set tableData to the mutated copy. 它有助于创建Array.from()如果您想支持旧浏览器,可能需要为Array.from()提供变通方法/ Array.from() ),修改它并将tableData设置为变异副本。

(Open the snipped in fullscreen mode and either click the button twice, or expand the children before clicking the button, as the children are collapsed by default and after re-rendering.) (在全屏模式下打开剪切,然后单击按钮两次,或者在单击按钮之前展开子项,因为子项在默认情况下折叠并在重新渲染后折叠。)

 var Main = { data() { return { tableData: [{ id: 1, date: '2016-05-02', name: 'wangxiaohu' }, { id: 2, date: '2016-05-04', name: 'wangxiaohu' }, { id: 3, date: '2016-05-01', name: 'wangxiaohu', children: [{ id: 31, date: '2016-05-01', name: 'wangxiaohu' }, { id: 32, date: '2016-05-01', name: 'wangxiaohu' }] }, { id: 4, date: '2016-05-03', name: 'wangxiaohu' }], tableData1: [{ id: 1, date: '2016-05-02', name: 'wangxiaohu' }, { id: 2, date: '2016-05-04', name: 'wangxiaohu' }, { id: 3, date: '2016-05-01', name: 'wangxiaohu', hasChildren: true }, { id: 4, date: '2016-05-03', name: 'wangxiaohu' }] } }, methods: { load(tree, treeNode, resolve) { resolve([ { id: 31, date: '2016-05-01', name: 'wangxiaohu' }, { id: 32, date: '2016-05-01', name: 'wangxiaohu' } ]) }, removeRow(row){ var newTableData = Array.from(this.tableData); newTableData[2].children.splice(0,1) this.tableData = newTableData; //this.tableData.splice(0,1); } }, } var Ctor = Vue.extend(Main) new Ctor().$mount('#app') 
 @import url("//unpkg.com/element-ui@2.7.2/lib/theme-chalk/index.css"); 
 <script src="//unpkg.com/vue/dist/vue.js"></script> <script src="//unpkg.com/element-ui@2.7.2/lib/index.js"></script> <div id="app"> <template> <div> <el-button @click="removeRow"> Delete child </el-button> <el-table :data="tableData" style="width: 100%;margin-bottom: 20px;" border row-key="id"> <el-table-column prop="date" label="日期" sortable width="180"> </el-table-column> <el-table-column prop="name" label="name" sortable width="180"> </el-table-column> </el-table> <el-table :data="tableData1" style="width: 100%" row-key="id" border lazy :load="load" > <el-table-column prop="date" label="date" width="180"> </el-table-column> <el-table-column prop="name" label="name" width="180"> </el-table-column> </el-table> </div> </template> </div> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM