封装树形筛选数据组件
<template>
<el-card>
<el-container>
<el-input v-model="filterText" placeholder="请输入名称查询" style="margin: 0 12px 12px 0" clearable :prefix-icon="Search" />
<el-button type="primary" plain @click="handleReset">重置</el-button>
<el-button type="primary" plain @click="handleSearch">搜索</el-button>
</el-container>
<el-scrollbar max-height="800px">
<el-tree
ref="treeRef"
class="filter-tree"
:data="treeData"
:props="treeProps"
show-checkbox
:default-expand-all="false"
node-key="code"
:filter-node-method="filterNode"
@check-change="handleCheckChange"
>
</el-tree>
</el-scrollbar>
</el-card>
</template>
<script lang="ts" setup>
import { Search } from '@element-plus/icons-vue';
import { ElTree } from 'element-plus';
import { useAsyncState } from '@vueuse/core';
import { getPosTreeList } from '@/api/businessPersUse';
const treeRef = ref<InstanceType<typeof ElTree>>();
const emit = defineEmits(['search']);
const filterText = ref('');
const keysList = ref<PersUseApi.checkedNodeList[]>([]);
const treeData = ref<Partial<PersUseApi.IPosTreeList>[]>([]);
const treeProps = {
children: 'children',
label: 'name',
value: 'code',
};
const filterNode = (value: string, data: any) => {
if (!value) return true;
return data.name.includes(value);
};
watch(filterText, (val) => {
treeRef.value!.filter(val);
});
//获取树形数据
const { state, execute } = useAsyncState(
() => getPosTreeList(),
{ data: { inner: {}, outer: {} } },
{
onSuccess(res) {
treeData.value.push(res.data.treeDate);
},
},
);
//el-tree若数据未展开,则checked只能得到点击的数据,得不到子级,此处手动递归加入数组
const handleCheckChange = (data: PersUseApi.IPosTreeList, checked: boolean) => {
if (checked) {
const dataArr = [];
dataArr.push(data);
const pushKeys = (data: PersUseApi.IPosTreeList[]) => {
data.forEach((data: PersUseApi.IPosTreeList) => {
const isLeaf = !data.children || !data.children.length ? true : false;
const isRepeat = keysList.value.some((d) => d.code == data.code);
if (isRepeat) return;
keysList.value.push({
code: data.code,
codeType: data.frameworkNodeType,
isLeaf: isLeaf,
});
if (!isLeaf) {
pushKeys(data.children!);
}
});
};
pushKeys(dataArr);
} else {
keysList.value = keysList.value.filter((item) => item.code !== data.code); //首先去除选中数据
const currentKeys = treeRef.value?.getCheckedKeys();
keysList.value = keysList.value.filter((item) => currentKeys?.includes(item.code)); //再去除子级数据
}
console.log(' keysList.value', keysList.value);
};
const getUselessKeysFn = (keys: Array<String>) => {
const uselessKeys: Array<String> = []; //不需要的keys
const flatArrFn = (Arr: PersUseApi.IPosTreeList[]) => {
//将数组中含children的对象扁平化,扁平为一个数组
Arr.forEach((item) => {
uselessKeys.push(item.code);
if (item.children && item.children.length) {
flatArrFn(item.children);
}
});
};
for (const key of keys) {
const loopKeys = (data: any, key: any) => {
//根据key找相同的,找到即停止
const res = [];
for (const d of data) {
if (d.code == key) {
//如果是叶子节点,则push自己,否则,push children
if (!d.children && !d.children.length) {res.push(d)}else{
res.push(d.children);
flatArrFn(res.flat());//把加入的数组扁平化
}
} else {
if (d.children && d.children.length) {
loopKeys(d.children, key);
}
}
}
};
loopKeys(treeData.value, key);
}
return uselessKeys;
};
const handleSearch = () => {
const uselessKeys = getUselessKeysFn(keysList.value);//这里是无用的keys
const finalKeyList = keysList.value.filter((item) => !uselessKeys.includes(item.code));
emit('search', finalKeyList);//把最终数据传递给父组件
};
const handleReset = () => {
treeRef.value?.setCheckedKeys([]);
emit('search', []);//把最终数据传递给父组件
};
</script>
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbaikj
系列文章
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01