iview TreeSelect 异步加载子节点 编辑时不能正常回显

news/2024/10/29 5:02:19/

问题描述

因为分类数据太多,首次加载时间太长,和业务沟通改成异步加载子节点,解决了加载缓慢的问题,但编辑的时候回显就不能显示了,因为赋值的时候,下拉框数据中还没有加载已选中的项。该怎么办呢…
在这里插入图片描述

解决方案

结合业务考虑,因为分类的ID是输入框手动输入的,没有特定的格式,只根据多个分类的ID用分号分隔了,无法找到其父节点的分类ID,所以不能用递归调用数据的方法。想了一个让分类显示的方法,将需要回显的数据插入到categoryData中,实现编辑分类的回显。
在这里插入图片描述

示例代码

<template><TreeSelectv-if="item.key === 'broader'"v-model="form[item.key]":data="categoryData":load-data="loadTreeList"multiple/>
</template>
<script>export default {props: {categoryData: {type: Array,default: () => []}},data () {return {value: [],nextValue: 1,data: [{title: 'parent1',value: 'parent1',loading: false,selected: false,checked: false,children: []}]}},methods: {findById (node, targetId) {// 如果当前节点的value等于targetId,直接返回当前节点if (node.value === targetId) {return node}// 如果当前节点有子节点,则遍历子节点if (node.children && node.children.length) {for (let child of node.children) {const foundNode = this.findById(child, targetId)if (foundNode) {// 如果找到了匹配的节点则返回return foundNode}}}// 如果遍历完所有的子节点都没有找到匹配的节点,则返回nullreturn null},initTreeData (categoryIds, labels) {const data = _.cloneDeep(this.categoryData)const existData = []const categoryNodes = []for (let i = 0, len = categoryIds.length; i < len; i++) {data.forEach(item => {const target = this.findById(item, categoryIds[i]) if (target) {existData.push(target)}})categoryNodes.push({title: labels[i],value: categoryIds[i],selected: false})}categoryNodes.forEach(node => {const target = existData.find(existNode => existNode.value === node.value)if (!target) {this.categoryData.push(node)}})},async loadTreeList (broader, callback) {return new Promise((resolve, reject) => {const params = {broader: broader.categoryId,entryName: this.entryName}getTreeList(params).then(res => {const data = res.map(item => {item.title = item.prefLabelitem.value = item.categoryIditem.selected = falseitem.checked = falseitem.loading = falsereturn item})callback(data)resolve(data)}).catch(err => {reject(err)})})        },init (row) {this.visible = truethis.entryId = row.entryIdthis.entryName = row.entryNamethis.title = '新增'if (row && row.id) {this.id = row.idthis.title = '编辑'this.form = { ...row }if (this.form.broader) {this.form.broader = row.broader.split(';')this.initTreeData(row.broader.split(';'), row.category_pref_label.split(';'))}if (row.alt_label) {this.altLabelList = row.alt_label.split(';')}}},}}
</script>

参考文档:

https://www.iviewui.com/view-ui-plus/component/form/tree-select#load


http://www.ppmy.cn/news/1542776.html

相关文章

深度学习(五):语音处理领域的创新引擎(5/10)

一、深度学习在语音处理中的崛起 在语音处理领域&#xff0c;传统方法如谱减法、维纳滤波等在处理复杂语音信号时存在诸多局限性。这些方法通常假设噪声是平稳的&#xff0c;但实际噪声往往是非平稳的&#xff0c;导致噪声估计不准确。同时&#xff0c;为了去除噪声&#xff0…

Cursor零基础小白教程系列 - 创建你的第一个Cursor 项目

最适合小白零基础的Cursor教程 网站lookai.top相同作者&#xff0c;最新文章会在网站更新&#xff0c;欢迎收藏书签 创建你的第一个Cursor 项目 实操视频 概述 开始使用Cursor进行编程的第一步是创建或导入一个项目。本指南将帮助您了解如何在Cursor中创建新项目、导入现有项…

vscode 安装教程

双击vscode 安装包 同意&#xff0c;下一步 可以使用默认安装路径&#xff0c;也可以优化为这个 全选 取消勾选&#xff0c;点完成 在桌面创建一个空文件夹&#xff0c;拖动到vscode图标上 点击这个图标创建文件&#xff0c;注意必须以.py 结尾&#xff01;&#xff0…

操作系统(6) (POSIX--Linux线程编程---c语言相关语法/pthread_t/create/join应用)

本文章基于操作系统(5) (POSIX--Linux线程编程pthread_t/create/join/exit)-CSDN博客​​​​​​ https://blog.csdn.net/2301_80176774/article/details/143078984创作,主要讲解c语言相关语法/pthread_t/create/join应用. 目录 1. 线程与pthread库 2. 代码结构与解释 3…

【SQL】SQL函数

&#x1f4e2; 前言 函数 是指一段可以直接被另一段程序调用的程序或代码。主要包括了以下4中类型的函数。 字符串函数数值函数日期函数流程函数 &#x1f384; 字符串函数 ⭐ 常用函数 函数 功能 CONCAT(S1,S2,...Sn) 字符串拼接&#xff0c;将S1&#xff0c;S2&#xff0…

win10怎么卸载软件干净?电脑彻底删除软件的方法介绍,一键清理卸载残留!

电脑上经常会下载各种各样的软件来协助我们办公&#xff0c;不同的软件能够满足不同的需求。 但是不少软件可能使用频率没有那么高&#xff0c;甚至完全不使用。这个时候就需要将这些不常用的电脑软件卸载掉了&#xff0c;卸载软件能够释放一定的存储空间&#xff0c;提高电脑…

【Linux】————进程间通信(匿名管道)

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年6月20日 进程间通信的目的&#xff1a; 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享资源通知事件&#xff1a;一个进程需…

数据库设计与范式及其应用

数据库设计是数据库管理系统&#xff08;DBMS&#xff09;中的核心环节&#xff0c;良好的数据库设计不仅可以提高数据存取的效率&#xff0c;还能增强数据的可维护性和一致性。范式&#xff08;Normalization&#xff09;是一种设计原则&#xff0c;用于减少数据冗余和提高数据…