首页 > 其他分享 >ElementUI Table 表格树形结构多选框选中父级时会选中子级(递归多级)

ElementUI Table 表格树形结构多选框选中父级时会选中子级(递归多级)

时间:2022-09-19 10:57:37浏览次数:108  
标签:el return 父级 ElementUI item 选中 isSelect children row

<template>
	<el-table :data="renderDynamic" ref="product" border row-key="id" :row-class-name="rowClassNameFun"
		:header-row-class-name="headerRowClassName" size="mini" max-height="500px" style="width: 100%"
		@select="selectFun" @select-all="selectAllFun" :header-cell-style="{ background: '#fafafa' }">

		<el-table-column type="selection" width="55"> </el-table-column>

		<el-table-column prop="date" label="日期" sortable width="180">

		</el-table-column>

		<el-table-column prop="name" label="姓名" sortable width="180">

		</el-table-column>

		<el-table-column prop="address" label="地址"> </el-table-column>

	</el-table>
</template>
<script>
	export default {
		name: "TaskManage",
		data() {
			return {

				renderDynamic: [{
	id: 1,
	parentId: 0,
	date: "2016-05-02",
	name: "王小虎",
	address: "上海市普陀区金沙江路 1518 弄",
}, {
	id: 2,
	parentId: 0,
	date: "2016-05-01",
	name: "王小虎",
	address: "上海市普陀区金沙江路 1519 弄",
	children: [{
		id: 3,
		parentId: 2,
		date: "2016-05-01",
		name: "王小虎",
		address: "上海市普陀区金沙江路 1519 弄",
		children: [{
			id: 4,
			parentId: 3,
			date: "2016-05-01",
			name: "王小虎",
			address: "上海市普陀区金沙江路 1519 弄",
		}, {
			id: 5,
			parentId: 3,
			date: "2016-05-01",
			name: "王小虎",
			address: "上海市普陀区金沙江路 1519 弄",
		}, ],
	}, {
		id: 6,
		parentId: 2,
		date: "2016-05-01",
		name: "王小虎",
		address: "上海市普陀区金沙江路 1519 弄",
	}, ],
}, ],

			};

		},
		mounted() {
			this.initData(this.renderDynamic);

		},
		methods: {
			//初始化数据
			initData(data) {

				data.forEach((item) => {

					item.isSelect = false; //默认为不选中

					if (item.children && item.children.length) {

						this.initData(item.children);

					}

				});

			},
			selectFun(selection, row) {
				this.setRowIsSelect(row);

			},
			setRowIsSelect(row) {
				//当点击父级点复选框时,当前的状态可能为未知状态,所以当前行状态设为false并选中,即可实现子级点全选效果

				if (row.isSelect === "") {

					row.isSelect = false;

					this.$refs.product.toggleRowSelection(row, true);

				}

				row.isSelect = !row.isSelect;

				let that = this;

				function selectAllChildrens(data) {

					data.forEach((item) => {

						item.isSelect = row.isSelect;

						that.$refs.product.toggleRowSelection(item, row.isSelect);

						if (item.children && item.children.length) {

							selectAllChildrens(item.children);

						}

					});

				}

				function getSelectStatus(selectStatuaArr, data) {

					data.forEach((childrenItem) => {

						selectStatuaArr.push(childrenItem.isSelect);

						if (childrenItem.children && childrenItem.children.length) {

							getSelectStatus(selectStatuaArr, childrenItem.children);

						}

					});

					return selectStatuaArr;

				}

				function getLevelStatus(row) {

					//如果当前节点的parantId =0 并且有子节点,则为1

					//如果当前节点的parantId !=0 并且子节点没有子节点 则为3

					if (row.parentId == 0) {

						if (row.children && row.children.length) {

							return 1;

						} else {

							return 4;

						}

					} else {

						if (!row.children || !row.children.length) {

							return 3;

						} else {

							return 2;

						}

					}

				}

				let result = {};

				//获取明确的节点

				function getExplicitNode(data, parentId) {

					data.forEach((item) => {

						if (item.id == parentId) {

							result = item;

						}

						if (item.children && item.children.length) {

							getExplicitNode(item.children, parentId);

						}

					})

					return result;

				}

				function operateLastLeve(row) {

					//操作的是子节点  1、获取父节点  2、判断子节点选中个数,如果全部选中则父节点设为选中状态,如果都不选中,则为不选中状态,如果部分选择,则设为不明确状态

					let selectStatuaArr = [];

					let item = getExplicitNode(that.renderDynamic, row.parentId);

					selectStatuaArr = getSelectStatus(selectStatuaArr, item.children);

					if (

						selectStatuaArr.every((selectItem) => {

							return true == selectItem;

						})

					) {

						item.isSelect = true;

						that.$refs.product.toggleRowSelection(item, true);

					} else if (

						selectStatuaArr.every((selectItem) => {

							return false == selectItem;

						})

					) {

						item.isSelect = false;

						that.$refs.product.toggleRowSelection(item, false);

					} else {

						item.isSelect = "";

					}

					//则还有父级

					if (item.parentId != 0) {

						operateLastLeve(item)

					}

				}

				//判断操作的是子级点复选框还是父级点复选框,如果是父级点,则控制子级点的全选和不全选

				//1、只是父级 2、既是子集,又是父级 3、只是子级

				let levelSataus = getLevelStatus(row);

				if (levelSataus == 1) {

					selectAllChildrens(row.children);

				} else if (levelSataus == 2) {

					selectAllChildrens(row.children);

					operateLastLeve(row);

				} else if (levelSataus == 3) {

					operateLastLeve(row);

				}

			},
			checkIsAllSelect() {
				this.oneProductIsSelect = [];

				this.renderDynamic.forEach((item) => {

					this.oneProductIsSelect.push(item.isSelect);

				});

				//判断一级产品是否是全选.如果一级产品全为true,则设置为取消全选,否则全选

				let isAllSelect = this.oneProductIsSelect.every((selectStatusItem) => {

					return true == selectStatusItem;

				});

				return isAllSelect;

			},
			selectAllFun(selection) {
				let isAllSelect = this.checkIsAllSelect();

				this.renderDynamic.forEach((item) => {

					item.isSelect = isAllSelect;

					this.$refs.product.toggleRowSelection(item, !isAllSelect);

					this.selectFun(selection, item);

			 });

			},
			rowClassNameFun({
				row
			}) {
				if (row.isSelect === "") {

					return "indeterminate";

				}

			},
			headerRowClassName({
				row
			}) {
				let oneProductIsSelect = [];

				this.renderDynamic.forEach((item) => {

					oneProductIsSelect.push(item.isSelect);

				});

				if (oneProductIsSelect.includes("")) {

					return "indeterminate";

				}

				return "";

			},
		}
	}
</script>

<style lang='less'>
	.indeterminate .el-checkbox__input .el-checkbox__inner {
		background-color: #409eff !important;

		border-color: #409eff !important;

		color: #fff !important;

	}

	.indeterminate .el-checkbox__input.is-checked .el-checkbox__inner::after {

		transform: scale(0.5);

	}

	.indeterminate .el-checkbox__input .el-checkbox__inner {

		background-color: #f2f6fc;

		border-color: #dcdfe6;

	}

	.indeterminate .el-checkbox__input .el-checkbox__inner::after {

		border-color: #c0c4cc !important;

		background-color: #c0c4cc;

	}

	.product-show th .el-checkbox__inner {

		display: none !important;

	}

	.indeterminate .el-checkbox__input .el-checkbox__inner::after {

		content: "";

		position: absolute;

		display: block;

		background-color: #fff;

		height: 2px;

		transform: scale(0.5);

		left: 0;

		right: 0;

		top: 5px;

		width: auto !important;

	}

	.product-show .el-checkbox__inner {

		display: block !important;

	}

	.product-show .el-checkbox {

		display: block !important;

	}
</style>

https://www.h5w3.com/147952.html

标签:el,return,父级,ElementUI,item,选中,isSelect,children,row
From: https://www.cnblogs.com/Fancy1486450630/p/16706914.html

相关文章