页面1 级联选择器 <select-tree></select-tree>
,这样要引入封装好的,并且记得注册
<el-row>
<el-col :span="12">
<el-form-item label="部门" prop="departmentId">
<!-- 单独封装-->
<!-- 在父组件使用v-model双向绑定-->
<select-tree
v-model="userInfo.departmentId"
class="inputW"
></select-tree>
</el-form-item>
</el-col>
</el-row>
页面二,子组件 -----创建select-tree组件
<template>
<!-- 级联改变触发input事件-->
<el-cascader
:value="value"
:options="treeData"
:props="props"
size="mini"
separator="-"
@change="changeValue"
>
</el-cascader>
</template>
<script>
import { getDepartment } from "@/api/department.js";
import { transListToTreeData } from "@/utils";
export default {
//接收value属性
props: {
value: Number,
default: null,
},
data() {
return {
treeData: [],
props: {
label: "name", // 要展示的字段
value: "id", // 要存储的字段
},
};
},
created() {
this.getDepartment();
},
methods: {
async getDepartment() {
this.treeData = transListToTreeData(await getDepartment(), 0);
},
changeValue(list) {
//这里打印出来是一个数组,我们需要拿到数组的最后一个值
if (list.length > 0) {
this.$emit("input", list[list.length - 1]); // 将最后一位的id取出来 传出去
} else {
this.$emit("input", null); // 如果长度为0 说明值为空
}
},
},
};
</script>
列表型数据转化树形
/**
*
* 列表型数据转化树形
*/
export function transListToTreeData(list, rootValue) {
const arr = []
list.forEach(item => {
if (item.pid === rootValue) {
// 找到了匹配的节点
arr.push(item)
// 当前节点的id 和 当前节点的子节点的pid是想等的
const children = transListToTreeData(list, item.id) // 找到的节点的子节点
//只有当前节点有子节点时才添加children属性
if (children.length) { item.children = children } // 将子节点赋值给当前节点
}
})
return arr
}
每次选择,id就会变化最新的