共计 2044 个字符,预计需要花费 6 分钟才能阅读完成。
近期做的我的项目用到了 iview 的 table 组件,并且带有 checkbox 抉择框。
iview 坑:
(1)给 data 设置_check 的属性。_checked 属性会影响 checkbox 的选中状态。然而 checkbox 的选中状态不会影响_check 属性
(2)iview 官网文档说:
@on-selection-change,只有选中项发生变化时就会触发,返回值为 selection,已选项。
实现成果并不是这样的,而是:
用程序设置_checked=true 后,并不会触发该事件。也不会触发 on-select-cancel 和 on-select。只有通过鼠标再次点击 checkbox,才会触发上述三项事件。尽管最初参数中的 selection 是正确的。
用程序切换某一行的选中状态,须要调用函数 this.$refs.xxx.toggleSelect(i),调用该函数后,会触发 on-select-cancel、on-select、on-selection-change 事件。
解决方案:
依据 selection, 拆分已选项与未选项
<template>
<div>
<Table
border
ref="selection"
:columns="columns4" :data="data1"
@on-selection-change="handleOnSelectionChange"
></Table>
<Button @click="handleSelectAll(true)">Set all selected</Button>
<Button @click="handleSelectAll(false)">Cancel all selected</Button>
</div>
</template>
<script>
const _ = window._
export default {data() {
return {
columns4: [
{
type: 'selection',
width: 60,
align: 'center'
},
{
title: 'Name',
key: 'name'
},
{
title: 'Age',
key: 'age'
},
{
title: 'Address',
key: 'address'
},
{
title: 'Action',
key: 'action',
width: 150,
align: 'center',
render: (h, params) => {const { row} = params
return (
<div>
<div>
<p>{String(row._checked)}</p>
</div>
</div>
)
}
}
],
data1: [
{
id: 1,
name: 'John Brown',
age: 18,
address: 'New York No. 1 Lake Park',
date: '2016-10-03',
_checked: false
},
{
id: 2,
name: 'Jim Green',
age: 24,
address: 'London No. 1 Lake Park',
date: '2016-10-01',
_checked: false
},
{
id: 3,
name: 'Joe Black',
age: 30,
address: 'Sydney No. 1 Lake Park',
date: '2016-10-02',
_checked: false
},
{
id: 4,
name: 'Jon Snow',
age: 26,
address: 'Ottawa No. 2 Lake Park',
date: '2016-10-04',
_checked: false
}
]
}
},
methods: {handleSelectAll(status) {this.$refs.selection.selectAll(status)
},
handleOnSelectionChange (selection) {
// 思路:将选中的与未选中的做分组
const _data = JSON.parse(JSON.stringify(this.data1))
// 已选项
const selectedArrs = selection
// 未选项
const unSelectArrs = _data.filter(item => _.findIndex(selectedArrs, {id: item.id}) > -1 ? false: true)
this._handleToggleChecked(selectedArrs, true)
this._handleToggleChecked(unSelectArrs, false)
},
// 单选与未单选
_handleToggleChecked (arrs, boo) {
const self = this
arrs.map(item => {const _index = _.findIndex(self.data1, {'id': item.id})
item._checked = boo
self.data1.splice(_index, 1, item)
})
}
}
}
</script>
<style lang="less"></style>
正文完