html+单选+回显,VUE+elementUI表格多选框实现单选以及数据回显时toggleRowSelection失效问题...

一、多选框单选

>

@select-all="onSelectAll" 全选是触发的事件

@selection-change="selectItem" 单个去勾选时触发的事件(勾选有变化时触发)

@row-click="onSelectOp" 点击那一行数据触发的事件

ref="multipleTable"

ref 被用来给DOM元素或子组件注册引用信息。引用信息会根据父组件的 $refs 对象进行注册。如果在普通的DOM元素上使用,引用信息就是元素; 如果用在子组件上,引用信息就是组件实

注意:只要想要在Vue中直接操作DOM元素,就必须用ref属性进行注册

1、@select-all="onSelectAll"

全选是触发自定义的onSelectAll() 函数,把所有选项清空,

this.$refs.multipleTable.clearSelection();clearSelection()这个函数是自带的,比如日期的getFullYear()

2、@selection-change="selectItem"

单个去勾选时触发自定义的selectItem函数

@selection-change事件会默认传行数据进去,用selectItem(rows)的rows接收就好,rows所选行数据的数组

this.$refs.multipleTable.toggleRowSelection(it, true);

toggleRowSelection这个函数需要传某行数据,true表示勾选,false表示不勾选,@selection-change默认是勾选的,也就是说这个事件传进来被选中的数据如果你还是想勾选,那么不需要任何操作,除非你想不勾选,那么就把那条数据用false来去掉勾选。

selectItem这个函数我自定义了,一旦勾选多于一行数据,就把上一个勾选去掉,保留最后一个勾选,用过滤器来过滤,把新的(只有一行数据)的数组赋给自定义的数组,方便调用

3、@row-click="onSelectOp"

点击那一行数据触发的事件默认传点击那行的数据,自定义onSelectOp(row)函数,

用row来接收点击的那行数据,

先把所有的选项清空this.$refs.multipleTable.clearSelection();

再把点击的那行勾选this.$refs.multipleTable.toggleRowSelection(row, true);

把自定义数组清空this.selectlist = [];

把新勾选的数据push进数组this.selectlist.push(row);

methods: {

onSelectAll() {this.$refs.multipleTable.clearSelection();

},

selectItem(rows) {if (rows.length > 1) {var newRows = rows.filter((it, index) =>{if (index == rows.length - 1) {this.$refs.multipleTable.toggleRowSelection(it, true);//这行可以不要return true;

}else{this.$refs.multipleTable.toggleRowSelection(it, false);return false;

}

});this.selectlist =newRows;

}else{this.selectlist =rows;

}

},

onSelectOp(row) {

//this.$refs.multipleTable.clearSelection();不需要this.$refs.multipleTable.toggleRowSelection(row, true);//有这个就够了,因为一旦勾选的内容有变化,那么就会触发selectItem(rows)这个函数

//this.selectlist =[];不需要

//this.selectlist.push(row);不需要

},

二、数据回显toggleRowSelection失效问题

失效例子:

comeBackfromEidt() {

let id= parseInt(this.$route.params.id);this.items.forEach(x =>{if (x.id ==id) {this.$refs.multipleTable.toggleRowSelection(x, true);

}

});

},

我是从这个页面勾选数据然后跳转到另一个页面,然后返回的时候想回显勾选的数据,写了上面代码,发现回显不了!!!

后来查到需要加上$nextTick才可以

以下代码可行:

comeBackfromEidt() {

let id= parseInt(this.$route.params.id);this.items.forEach(x =>{if (x.id ==id) {this.$nextTick(() =>{this.$refs.multipleTable.toggleRowSelection(x, true);

});

}

});

},

或者把$nextTick放在forEach外面也可以。

$nextTick 是在下次 DOM 更新循环结束之后执行延迟回调,在修改数据之后使用 $nextTick,则可以在回调中获取更新后的 DOM

在我们用vue时,我们经常用到一个方法是this.$nextTick,相信你也用过。我常用的场景是在进行获取数据后,需要对新视图进行下一步操作或者其他操作时,发现获取不到dom。

因为赋值操作只完成了数据模型的改变并没有完成视图更新

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
elementui表格多选框中进行回显,需要先在数据源中添加一个`selected`字段,用来表示该行数据是否被选中,然后在多选框的`v-model`属性中绑定该字段。当需要进行回显,只需要将该数据源中的`selected`字段设置为`true`即可。 例如: ``` <template> <el-table :data="tableData"> <el-table-column type="selection" width="55"> </el-table-column> <el-table-column prop="name" label="姓名"> </el-table-column> </el-table> </template> <script> export default { data() { return { tableData: [ { name: '张三', selected: false }, { name: '李四', selected: true }, { name: '王五', selected: false }, ] }; } } </script> ``` 以上代码中,`tableData`中的每条数据都有一个`selected`字段来表示是否被选中。同,在多选框的`v-model`中绑定该字段: ``` <el-table-column type="selection" width="55" v-model="tableDataSelection"></el-table-column> ``` 这样,在表格选中某些行之后,`tableDataSelection`中就会保存这些行的数据。当需要进行回显,只需要遍历`tableData`中的每条数据,将`selected`字段设置为与其在`tableDataSelection`中的对应项一致即可。 例如: ``` // 假设已经从接口获取到了选中行的数据 const selectedRows = [ { name: '李四' }, { name: '王五' }, ]; // 遍历数据源,将选中行的数据进行回显 this.tableData.forEach(row => { const selectedRow = selectedRows.find(item => item.name === row.name); row.selected = !!selectedRow; // 将布尔值转换为数字,可以使用 !! 操作符 }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值