antdv 穿梭框

news2024/11/17 10:04:16

antd的穿梭框的数据貌似只接收key和title,而且必须是字符串(我测试不是字符串的不行),

所以要把后端返回的数据再处理一下得到我们想要的数据

除了实现简单的穿梭框功能,还想要重写搜索事件,想达到的效果是搜索到的结果的节点能自动展开且高亮显示

给穿梭框添加show-search

完整代码:

<template>
    <!-- 选择图层穿梭框 -->
    <a-modal title="选择数据图层" width="900px" :visible="true" :maskClosable="false" wrapClassName="transferModal"
        centered @ok="getSelectedNodes" destroyOnClose>
        <a-transfer
            class="tree-transfer"
            :titles="['所有数据图层', '已选数据图层']"
            :operations="['添加', '移除']"
            :data-source="dataSource"
            :target-keys="targetKeys"
            :render="item => item.title"
            :show-select-all="false"
            @change="onChange"
            show-search
            @search="handleSearch"
        >
            <template
                slot="children"
                slot-scope="{ props: { direction, selectedKeys }, on: { itemSelect } }"
            >
                <a-tree
                    v-if="direction === 'left'"
                    blockNode
                    checkable
                    checkStrictly
                    defaultExpandAll
                    :checkedKeys="[...selectedKeys, ...targetKeys]"
                    :treeData="newTreeData"
                    :expandedKeys="expandedKeys" :auto-expand-parent="autoExpandParent"
                    @expand="onExpand"
                    @check="
                        (_, props) => {
                        onChecked(_, props, [...selectedKeys, ...targetKeys], itemSelect);
                        }
                    "
                    @select="
                        (_, props) => {
                        onChecked(_, props, [...selectedKeys, ...targetKeys], itemSelect);
                        }
                    "
                >
                <template slot="title" slot-scope="{ name }">
                    <span v-if="name.indexOf(searchValue) > -1">
                        {{ name.substr(0, name.indexOf(searchValue)) }}
                        <span style="color: #f50">{{ searchValue }}</span>
                        {{ name.substr(name.indexOf(searchValue) + searchValue.length) }}
                    </span>
                    <span v-else>{{ name }}</span>
                </template>
                </a-tree>
            </template>
        </a-transfer>
    </a-modal>
</template>

<script>
import { auth_service_tree_zyfx } from "@/API/api/g_api"

function isChecked(selectedKeys, eventKey) {
  return selectedKeys.indexOf(eventKey) !== -1;
}

function handleTreeData(data, targetKeys = []) {//数据选中移到右侧就设置为禁选
  data.forEach(item => {
    item['disabled'] = targetKeys.includes(item.key);
    if (item.children) {
      handleTreeData(item.children, targetKeys);
    }
  });
  return data;
}
const getParentKey = (key, tree) => {
    let parentKey;
    for (let i = 0; i < tree.length; i++) {
        const node = tree[i];
        if (node.children) {
            if (node.children.some((item) => item.id === key)) {
                parentKey = String(node.id);
            } else if (getParentKey(key, node.children)) {
                parentKey = getParentKey(key, node.children);
            }
        }
    }
    return parentKey;
};
const dataList = [];
const generateList = (data) => {
    for (let i = 0; i < data.length; i++) {
        const node = data[i];
        const key = node.id;
        const name = node.name;
        dataList.push({ key, title: name });
        if (node.children) {
            generateList(node.children);
        }
    }
};
export default {
    data() {
        return {
            treeData: [],
            targetKeys: [],
            dataSource: [],
            checkedNodes: [],
            dataList: [],
            expandedKeys: [],
            searchValue: "",
            autoExpandParent: true,
        }
    },
    computed: {
        newTreeData() {
            return handleTreeData(this.treeData, this.targetKeys);
        },
    },
    mounted(){
        this.init();
    },
    methods:{
        async init(){
            let data = await auth_service_tree_zyfx()
            this.treeData = data.code==1?data.data:[];
            this.renderTreeNodes(this.treeData)
            //console.log(this.treeData);
            //generateList(this.treeData);
            this.flatten(JSON.parse(JSON.stringify(this.treeData)));
        },
        renderTreeNodes(list) {
            list.forEach(item => {
                item.key = String(item.id);
                item.title = item.name;
                this.dataList.push({ key: item.id, title: item.name });
                if(item.children){
                    this.renderTreeNodes(item.children);
                }
            });
        },
        flatten(list = []) {
            list.forEach(item => {
                this.dataSource.push(item);
                this.flatten(item.children);
            });
        },
        onChange(targetKeys) { //两栏之间转移时的回调函数
            // console.log('Target Keys:', targetKeys);
            this.targetKeys = targetKeys;
        },
        onChecked(_, e, checkedKeys, itemSelect) {//选中项发生改变时的回调函数
            // console.log(_, e.checkedNodes, checkedKeys, itemSelect);
            this.checkedNodes = e.checkedNodes;
            const { eventKey } = e.node;
            itemSelect(eventKey, !isChecked(checkedKeys, eventKey));
        },
        onExpand(expandedKeys) {
            this.expandedKeys = expandedKeys;
            this.autoExpandParent = false;
        },
        handleSearch(dir, value) {
            // console.log('search:', dir, value);
            if(dir=="left"){
                const expandedKeys = this.dataList
                    .map((item) => {
                        if (item.title.toString().indexOf(value) > -1) {
                            return getParentKey(item.key, this.treeData);
                        }
                        return null;
                    })
                    .filter((item, i, self) => item && self.indexOf(item) === i);
                // console.log(expandedKeys);
                Object.assign(this, {
                    expandedKeys,
                    searchValue: value,
                    autoExpandParent: true,
                });
            }
            
        },
        getSelectedNodes(){
            let nodes = [];
            this.checkedNodes.map(r=>{
                if(this.targetKeys.includes(r.key)){
                    nodes.push(r.data.props.dataRef)
                }
            });
            console.log(nodes);
        }
    }
};
</script>

<style lang="scss" scoped>
::v-deep .transferModal{
    .ant-modal-body{
        max-height: 70vh;
        // overflow-y: auto;
        .tree-transfer{
            height: 100%;
        }
        .ant-transfer-list-body{
            max-height: 300px;
            overflow: auto;
        }
    }
}
</style>

实现效果如下:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1799978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

时间序列新范式!多尺度+时间序列,刷爆多项SOTA

当我们面对复杂模式和多变周期的应用场景&#xff08;比如金融市场分析&#xff09;时&#xff0c;采用多尺度时间序列来做分析和预测是个更好的选择。 这是因为&#xff1a;传统时序方法通常只用固定时间窗口来提取信息&#xff0c;难以适应不同时间尺度上的模式变化。但多尺…

opencv实战小结-银行卡号识别

实战1-银行卡号识别 项目来源&#xff1a;opencv入门 项目目的&#xff1a;识别传入的银行卡照片中的卡号 难点&#xff1a;银行卡上会有一些干扰项&#xff0c;如何排除这些干扰项&#xff0c;并且打印正确的号码是一个问题 最终效果如上图 实现这样的功能需要以下几个步骤…

蓝桥云课第12届强者挑战赛

第一题&#xff1a;字符串加法 其实本质上就是一个高精度问题&#xff0c;可以使用同余定理的推论 &#xff08;ab&#xff09;%n((a%n)(b%n))%n; #include <iostream> using namespace std; const int mod1e97; int main() {string a,b;cin>>a>>b;ab;int …

GAN网络理论和实验(二)

文章目录 一、说明二、什么是生成对抗网络&#xff1f;三、判别模型与生成模型四、生成对抗网络的架构五、你的第一个 GAN六、准备训练数据七、实现鉴别器八、实现生成器九、训练模型十、检查 GAN 生成的样本十一、使用 GAN 生成手写数字十二、准备训练数据十三、实现鉴别器和生…

LabVIEW减压阀和温控阀综合测试系统

在使用LabVIEW开发阀门测试软件时&#xff0c;特别是针对减压阀和温控阀&#xff0c;测试内容和注意事项包括以下方面&#xff1a; 测试内容 压力测试&#xff1a; 入口压力&#xff1a;测量阀门在不同入口压力下的表现。 出口压力&#xff1a;确保减压阀能够将出口压力控制在…

【TIPs】 Visual Stadio 2019 中本地误使用“git的重置 - 删除更改 -- hard”后,如何恢复?

环境&#xff1a; VS 2019Windows10本地版本管理&#xff08;非远程&#xff09; 前言&#xff1a; git 在Visual Stadio 2019中集成了git的版本管理&#xff0c;在本地用来做版本管理&#xff0c;本来比较好用。 不过有一次&#xff0c;由于拿最初始的版本的时候&#xf…

代驾公司在市场竞争中如何保持优势?

在竞争激烈的市场中&#xff0c;代驾公司可以通过多种策略保持其竞争优势&#xff0c;包括利用市场潜力、创新服务模式、提高服务效率以及加强品牌建设等。以下是具体的策略&#xff1a; 利用市场潜力 汽车产业空间巨大&#xff1a;随着汽车保有量的增加&#xff0c;代驾行业…

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候&#xff0c;就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

Intel VT-x怎么开启?如何解决VMware打开虚拟机报错问题?

许多小伙伴在安装完VMware不能打开虚拟机&#xff0c;每次打开都会出现一个“此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态”的报错&#xff0c;然后因此启动不了虚拟机。今天小编就带来如何解决这个报错的方法。 什么是Intel VT-x&#xff1f; 这是英特尔cp…

从零开始手把手Vue3+TypeScript+ElementPlus管理后台项目实战六(引入pinia,注册成功返回的信息在主页显示)

简介 pinia是多页面之间共享数据的一个组件&#xff0c;用法比较简单&#xff0c;具体参照以下。 安装Pinia pnpm install pinia引入Pinia main.ts 新增store src目录下新建stores目录&#xff0c;stores目录下新增user.ts文件 import { ref } from vue; import { define…

论文代码解读STPGNN

1.前言 本次代码文章来自于《2024-AAAI-Spatio-Temporal Pivotal Graph Neural Networks for Traffic Flow Forecasting》&#xff0c;基本模型结构如下图所示&#xff1a; 文章讲解视频链接 代码开源链接 接下来就开始代码解读了。 2.代码解读 class nconv(nn.Module):de…

离散数学答疑 3

&#xff5e;A&#xff1a;A的补集 有时候空集是元素&#xff0c;有时候就是纯粹的空集 A-B的定义&#xff1a; 笛卡尔积&#xff1a; 求等价关系&#xff1a;先求划分再一一列举 不同划分&#xff1a;分几块。一块&#xff1a;两块&#xff1a;三块&#xff1a;分别计算 Ix是…

2024-5-7 石群电路-26

2024-6-7&#xff0c;星期五&#xff0c;15:00&#xff0c;天气&#xff1a;阴转小雨&#xff0c;心情&#xff1a;晴。今天虽然是阴雨天&#xff0c;但是心情不能差哦&#xff0c;离答辩越来越近了&#xff0c;今天学完习好好准备准备ppt&#xff0c;加油学习喽~ 今日观看了石…

Vue 学习笔记 总结

Vue.js 教程 | 菜鸟教程 (runoob.com) 放一下课上的内容 Vue练习 1、练习要求和实验2的用户注册一样&#xff0c;当用户输入后&#xff0c;能在下方显示用户输入的各项内容&#xff08;不需要实现【重置】按钮&#xff09; 2、实验报告中的实验小结部分来谈谈用JS、jQuery和…

接口幂等性设计(5 大方案罗列)

结合案例、列举场景的接口幂等性设计方案。 方案 1. 状态机 业务场景&#xff0c;数据审核成功后进行短信通知&#xff0c;或者是订单状态变成已支付后&#xff0c;短信通知用户订单生成的详细信息&#xff0c;等等和状态有关的操作。 假设 status&#xff1a;0&#xff08;待…

vue改造四级树状可输入table

vue改造四级树状可输入table <template><div class"dimension_wary"><div class"itemHeader"><div class"target"></div><div class"sort">X2</div><div class"weight">…

xiaolingcoding 图解网络笔记——基础篇

文章目录 参考一、网络模型有哪几层DMANAPI 机制二、键入网址到网页显示&#xff0c;期间发生了什么&#xff1f;1. HTTP2. DNS3. 协议栈4. TCP5. IP6. MAC7. 网卡8. 交换机9. 路由器10. 服务器 与 客户端的互相扒皮&#xff08;添加、删除头部信息&#xff09;参考图HTTP 请求…

部署kubesphere报错

安装kubesphere报错命名空间terminted [rootk8smaster ~]# kubectl apply -f kubesphere-installer.yaml Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16, unavailable in v1.22; use apiextensions.k8s.io/v1 CustomResourceDefini…

【数据结构初阶】--- 顺序表

顺序表&#xff0c;好像学C语言时从来没听过&#xff0c;实际上就是给数组穿了层衣服&#xff0c;本质是一模一样的。 这里的顺序表实际是定义了一个结构体&#xff0c;设计各种函数来实现它的功能&#xff0c;比如说数组中的增删改查插入&#xff0c;这些基本操作其实平时就会…

【YOLOV8】4.图片分类-训练自己的数据集

Yolo8出来一段时间了,包含了目标检测、实例分割、人体姿态预测、旋转目标检测、图像分类等功能,所以想花点时间总结记录一下这几个功能的使用方法和自定义数据集需要注意的一些问题,本篇是第四篇,图像分类功能,自定义数据集的训练。 YOLO(You Only Look Once)是一种流行的…