【vue+el-transfer】穿梭框实现及遇到的bug,已解决

news2024/11/24 17:15:35

昨晚加班写的穿梭框组件,一边写一边遇到bug,果然只有bug才会让你印象更深刻,更值得记录

封装成组件FreezeTransfer

效果如下:

在这里插入图片描述

主要参考了官网上可搜索的这个示例

在这里插入图片描述
先说遇到的bug,然后贴完整的代码

1、el-transfer数据源绑定之后不展示,filterMethod不对的原因
2、点单个复选框,所有项都被选中,数据被处理后,不需要再 使用props转换
:props=“{
key: ‘id’,
label: ‘cnName’
}”
转换
3、未选择的时候,中间按钮的左右箭头不显示
4、行没有占全
5、每次打开弹窗的时候,初始化
6、change事件的使用
7、清空某个面板的搜索关键词

1、先说第一个绑数据源,按官网给的示例,这个和treeselect的示例差不多,需要将格式转换成它要求的格式
在这里插入图片描述
在这里插入图片描述
正常从接口获取数据就行,我这里是组件,所以在父页面获取到之后,传到子组件就行,在子组件里监听数据源,处理数据之后给treansfer绑定的data

 dataSource: {
      handler(newVal) {
        this.source = newVal.map(item => {
          let obj = {
            key: item.code,
            code: item.code,
            label: item.cnName,
            disabled: false,
          }

          return obj
        })
        this.$emit('getCode', [])
      },
      deep: true,
      immediate: true,
    },

这里遇到的bug就是左侧的数据源已经有了,但就是什么都不展示,一片空白
这个坑就是filter-method引起的,因为我是可搜索的穿梭框,从官方示例拿过来的时候,先定义了这个方法,但是啥都没写,真的是不踩一下根本不知道这还会影响数据源的展示

:filter-method="filterMethod"
filterMethod(query, item) {
//模糊查询,不区分英文大小写
      return item.key.toUpperCase().indexOf(query.toUpperCase()) > -1 || item.label.indexOf(query) > -1
    },

2、点单个复选框,所有项都被选中,可能的原因就是id都绑了一样的,但我排查了不是这个原因,这也是个坑,就是数据源处理过了之后,不需要再写props转换了
在这里插入图片描述
不需要

  :props="{
      key: 'id',
      label: 'cnName'
    }"

3、未选择的时候,中间按钮的左右箭头不显示
官网未选择的时候
在这里插入图片描述
我这里没有中间的箭头,可能是样式受影响了
在这里插入图片描述

/deep/ .el-button.el-button--primary.is-disabled {
  color: #fff !important;
}

4、行没有占全

/deep/ .el-transfer-panel__item.el-checkbox {
  width: 100%;
}

5、每次打开弹窗的时候,初始化
因为是放在弹窗中展示的,每次打开弹窗要初始化数据
父组件上定义initTransarr数组,在确认及取消事件中置为空

  :initTransarr="initTransarr"
  initTransarr:[]
      /** 弹框确认取消 */
    dialogSure(flag) {
      if (flag === 'sure') {

          this.$emit('handleSure', this.custCodearr)
        }
      } else {
        this.$emit('handleCancel')
      }
      this.initTransarr = []
      this.$emit('update:visible', false)
    },

6、change事件的使用
这里说下,left-check-change和right-check-change,分别在左侧和右侧勾选复选框的时候触发,我这里因为需求的调整,没用到,但还是保留了
在这里插入图片描述

change事件三个参数,当前值、数据移动的方向(‘left’ / ‘right’)、发生移动的数据 key 数组,就是中间左右箭头的事件

7、清空某个面板的搜索关键词
在这里插入图片描述

父组件

    <FreezeTransfer
      v-if="isTransfer"
      ref="freezeTransfer"
      :visible="visible"
      :dataSource="dataSource"
      :initTransarr="initTransarr"
      @getCode="getCode"
    ></FreezeTransfer>
    
  data() {
    return {
    visible:false,
      custCodearr: [],
      initTransarr: [],
    }
  },
    getCode(arr) {
      this.custCodearr = arr
    },
 /** 弹框确认取消 */
    dialogSure(flag) {
      if (flag === 'sure') {

          this.$emit('handleSure', this.custCodearr)
        }
      } else {
        this.$emit('handleCancel')
      }
      this.initTransarr = []
      this.$emit('update:visible', false)
    },

子组件

<template>
  <div class="transfer">
    <el-transfer
      v-if="visible"
      ref="transfer"
      filterable
      :filter-method="filterMethod"
      :filter-placeholder="$t('placeholderName.enter')"
      v-model="value"
      :data="source"
      :titles="['可选择', '已选择']"
      @change="handleChange"
      @left-check-change="leftcheckChange($event)"
      @right-check-change="rightcheckChange($event)"
    >
      <span slot-scope="{ option }">{{ option.code }} - {{ option.label }}</span>
    </el-transfer>
  </div>
</template>

<script>
export default {
  name: 'FreezeTransfer',
  props: {
    // 列表显示隐藏
    visible: {
      type: Boolean,
      default: false,
    },
    // 列表数据
    dataSource: {
      type: Array,
      default: () => {
        return []
      },
    },
    // 初始化右侧数据
    initTransarr: {
      type: Array,
      default: () => {
        return []
      },
    },

  },
  data() {
    return {
      source: [], // 总数据
      value: [],
    }
  },
  watch: {

    initTransarr: {
      handler(newVal) {
        this.value = newVal
      },
      deep: true,
    },
    dataSource: {
      handler(newVal) {
        this.source = newVal.map(item => {
          let obj = {
            key: item.code,
            code: item.code,
            label: item.cnName,
            disabled: false,
          }

          return obj
        })
        this.$emit('getCode', [])
      },
      deep: true,
      immediate: true,
    },
  },
  mounted() {},
  methods: {
    filterMethod(query, item) {
      return item.key.toUpperCase().indexOf(query.toUpperCase()) > -1 ||         	item.label.indexOf(query) > -1
    },
    //当前值、数据移动的方向('left' / 'right')、发生移动的数据 key 数组
    handleChange(value, direction, movedKeys) {
      if (direction == 'right') {
        this.$nextTick(() => {
          this.$refs.transfer.clearQuery('left')
        })
      } else if (direction == 'left') {
        this.$nextTick(() => {
          this.$refs.transfer.clearQuery('right')
        })
      }
      var arr = []
      value.forEach(item => {
        arr.push({ code: item })
      })
      this.$emit('getCode', arr)
    },
    leftcheckChange(e) {
      //   console.log(e,'left------');
    },
    rightcheckChange(e) {
    //   console.log(e,'right------');
    },



  },
}
</script>

<style scoped lang="scss">
.transfer {
  width: 100%;
  /deep/ .el-transfer-panel {
    width: 45%;
  }
}
/deep/ .el-button.el-button--primary.is-disabled {
  color: #fff !important;
}
/deep/ .el-transfer-panel__item.el-checkbox {
  width: 100%;
}
/deep/ .el-transfer-panel__list {
  height: 480px !important;
}
/deep/ .el-transfer-panel__body {
  height: 480px !important;
}
</style>

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

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

相关文章

layui下select下拉框不显示或没有效果

layui下select下拉框不显示或没有效果 弹层layer选择框没有样式_不可点击_渲染失效的解决办法 一、必须给表单体系所在的父元素加上 class"layui-form" 在一个容器中设定 class"layui-form" 来标识一个表单元素块&#xff0c;如果你不想用 form&#xf…

java 高校学生信息管理系统Myeclipse开发mysql数据库web结构jsp编程计算机网页项目

一、源码特点 JSP 高校学生信息管理系统 是一套完善的系统源码&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档&#xff0c;系统主要采用B/S模式开发 。 研究的基本内容是基于Web的学生信息…

2023 最新版网络安全保姆级指南,手把手带你从零基础进阶渗透攻防工程师

一份网络攻防渗透测试的学习路线&#xff0c;不藏私了&#xff01; 2023最新500G《黑客&网络安全入门&进阶学习资源包》 1、学习编程语言(phpmysqljshtml) 原因&#xff1a;phpmysql 可以帮助你快速的理解 B/S 架构是怎样运行的&#xff0c;只有理解了他的运行原理才…

《机器学习公式推导与代码实现》chapter12-XGBoost

《机器学习公式推导与代码实现》学习笔记&#xff0c;记录一下自己的学习过程&#xff0c;详细的内容请大家购买作者的书籍查阅。 XGBoost 从算法精度、速度和泛化能力等性能指标来看GBDT&#xff0c;仍然有较大的优化空间。XGBoost是一种基于GBDT的顶级梯度提升模型。相较于…

提炼关键词是一种能力

提炼关键词&#xff0c;是一种能力 交流或写文字&#xff0c;都要提炼关键词 趣讲大白话&#xff1a;抓重点 【趣讲信息科技202期】 **************************** 大脑的信息通过关键词调取 语言的传达&#xff0c;通过关键词传递关键信息 搜索要输入关键词 人工智能也要提示关…

tensorRT 模型部署

讲解&#xff1a; 模型经过训练之后终端部署之前都会有一个模型转换的过程&#xff0c;英伟达也不例外&#xff0c; 模型转换的过程其实是一个模型优化与加速的过程&#xff0c;里面包含着引擎对模型的一系列操作&#xff0c; 比如说layer 级的融合&#xff0c;权重的量化、图层…

PMP考试中多少分算通过?

PMP考试成绩一般是在考完后 6-8 周开始出成绩&#xff0c;像之前318的PMP考试&#xff0c;5月8号晚上已经开始出成绩了&#xff0c;还没出来的也会陆续出来。 【如何查询成绩】 1、输入网址&#xff08;PMI官网&#xff0c;不知道网址的私戳&#xff09;&#xff0c;点击 Log …

消息中间件中常见问题

如何保证消息不丢失 MQ的用途 异步发送&#xff08;验证码&#xff0c;短信&#xff0c;邮件&#xff09;MySQL&#xff0c;ES&#xff0c;Redis之间的数据同步分布式事务削峰填谷 消息可能丢失的环境 消息在产生端时候生产端挂掉&#xff0c;消息未到达交换机&#xff0c…

【新车评分】降价三万,排名第一的蔚来ES7更能打了?

去年6月&#xff0c;蔚来上市了该品牌第四款SUV车型——ES7&#xff0c;共分为两个版本标准版和首发版&#xff0c;发售价分别为46.8万和54.8万元。 不过近期蔚来以砍掉部分车主权益&#xff0c;换来了全系车型3万元的降价&#xff0c;ES7的起售价也来到了43.8万元和51.8万元。…

【Python 随练】利用递归方法求 5!

题目 利用递归方法求 5!。 简介 在本篇博客中&#xff0c;我们将使用递归方法解决一个数学问题&#xff1a;计算一个数的阶乘。阶乘是指将从1到某个正整数n的所有整数相乘&#xff0c;通常表示为n!。我们将介绍递归的概念&#xff0c;并给出一个完整的代码示例来计算给定数的…

P-Tuning v2: 与微调性能相等的提示性优化

原文&#xff1a;P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks 作者: Xiao Liu1,2 , Kaixuan Ji1 代码: https://github.com/THUDM/P-tuning-v2 一、简介 二、准备工作 ---- 2.1 NLU的任务 ---- 2.2 提示优化 三、P-Tu…

什么是云原生?

目录 1.简介2.云元素的四要素 1.简介 云原生&#xff1a;是一种构建和运行应用程序的方法&#xff0c;是一套技术体系和方法论。云原生&#xff08;CloudNative&#xff09;是一个组合词&#xff0c;Cloud Native&#xff1a; Cloud 表示应用程序位于云中&#xff0c;而不是…

基于OpenMV 循迹小车 + WIFI无线图传

文章目录 一、工程环境二、OpenMV1. 色块选定2. 色块识别3. 串口通信4. WiFi无线图传5. 代码汇总 三、MSP430四、视频演示 一、工程环境 1. 软件 OpenMV IDECode Composer StudioMicrosoft Edge 2. 硬件 MSP430F5529OpenMV4 H7及其 WiFi拓展板视觉云台旋转编码器、oled显示…

国际原油期货怎么开户?国际原油期货开户流程是什么?

随着国际原油期货交易的大众化&#xff0c;国际原油期货交易的入市门槛也在逐渐降低&#xff0c;使越来越多的国际原油期货交易爱好者能够参与到这个交易市场中。很多朋友可能对国际原油期货开户有很多的疑问&#xff0c;是不是很繁琐&#xff1f;需不需要很多的证明文件&#…

论文解读 | 皮质电图系统与软机器人致动器的完美结合

原创 | 文 BFT机器人 01 研究内容 主要研究内容是关于一种电皮层图谱系统的部署&#xff0c;该系统使用软体机器人致动器。论文详细介绍了该系统的制造和实验方法&#xff0c;并提供了相关的图表和参考文献。该系统的设计旨在提高电皮层图谱系统的灵活性和可植入性&#xff0c…

vite+vue3+cesium环境搭建

1.创建一个Vite项目 npm create vitelatest 2.安装cesium插件&#xff1a;vite-plugin-cesium npm i cesium vite-plugin-cesium vite -D 3、配置vite.config.js import cesium from vite-plugin-cesium; export default defineConfig({ plugins: [vue(),cesium()] }) 4、清空…

软件测试技能,JMeter压力测试教程(二)

目录 前言 一、案例场景 二、登录请求 三、Json 提取器 四、关联请求 五、遇到的坑 前言 现在很多接口的登录是返回一个json数据&#xff0c;token值在返回的json里面&#xff0c;在jmeter里面也可以直接提取json里面的值 上一个接口返回的token作为下个接口的入参 一、…

Python基础(12)——Python字符串详解

Python基础&#xff08;12&#xff09;——Python字符串详解 文章目录 Python基础&#xff08;12&#xff09;——Python字符串详解课程&#xff1a;字符串目标一. 认识字符串1.1 字符串特征1.2 字符串输出1.3 字符串输入 二、下标2.1 快速体验 三、切片3.1 语法3.2 体验 四、常…

Generative Adversarial Network(生成对抗网络)

目录 Generative Adversarial Network&#xff08;生成对抗网络&#xff09; Basic Idea of GAN GAN as structured learning Can Generator learn by itself Can Discriminator generate Theory behind GAN Conditional GAN Generative Adversarial Network&#xff08;…

SpringBoot + Vue前后端分离项目实战 || 一:Vue前端设计

文章目录 环境配置开发工具下载Vue前端模板前端项目启动前端说明及修改修改导航栏自定义菜单与子菜单增加导航标签功能 前端数据格式 B站视频讲解&#xff1a;2023全网最简单但实用的SpringBootVue前后端分离项目实战 不想看视频可浏览此文章笔记&#xff0c;比较详细 环境配置…