首页 > 其他分享 >vue根据element-ui实现下拉多选

vue根据element-ui实现下拉多选

时间:2023-06-26 09:46:50浏览次数:30  
标签:__ el vue selectTree 下拉多选 tree element item label

下拉多选element-ui

实现效果

组件代码

<template>
  <el-select
    class="maxwidth"
    v-model="showVal"
    multiple
    placeholder="请选择"
    :popper-append-to-body="false"
    @remove-tag="removetag"
    @clear="clearall"
    clearable
  >
    <el-option :value="selectTree" disabled>
      <el-tree
        :data="list"
        :props="props"
        ref="tree"
        check-strictly
        :expand-on-click-node="false"
        :node-key="props.id"
        check-on-click-node
        show-checkbox
        :default-checked-keys="value"
        @check-change="handleNodeClick"
      ></el-tree>
    </el-option>
  </el-select>
</template>
<script>
export default {
  name: "SelectTreeMultiple",
  props: {
    // 跟  this.$emit("input", []); 一起使用用来实现v-model
    value: {
      type: Array,
      default: () => {
        return [];
      },
    },
    // 树配置
    props: {
      type: Object,
      default: () => {
        return { children: "children", label: "label", id: "id" };
      },
    },
    // 下拉列表内容
    list: {
      type: Array,
      default: () => {
        return [];
      },
    },
    // 仅叶节点可选中
    onlyLeaf: {
      type: Boolean,
      default: true,
    },
  },
  data() {
    return {
      selectTree: [], // 选中的数据
      showVal: [], //输入框展示
    };
  },
  watch: {
    value: {
      immediate: true,
      handler(val) {
        // 回显数据
        this.$nextTick(() => {
          this.echo(val);
        });
      },
    },
  },
  methods: {
    //回显数据
    echo(val) {
      // 禁止出现 this.$emit("input", []);
      if (!val.length) {
        this.$refs.tree.setCheckedNodes([]);
      }
      let datalist = this.$refs.tree.getCheckedNodes();
      this.selectTree = []; //置空
      this.showVal = [];
      datalist.forEach((item) => {
        this.selectTree.push(item[this.props.id]);
        this.showVal.push(item[this.props.label]);
      });
    },
    //节点点击事件
    handleNodeClick(data, self, child) {
      if (!data.children || !this.onlyLeaf) {
        let datalist = this.$refs.tree.getCheckedNodes();
        this.selectTree = []; //置空
        this.showVal = [];
        datalist.forEach((item) => {
          this.selectTree.push(item[this.props.id]);
          this.showVal.push(item[this.props.label]);
        });
        this.$emit("input", this.selectTree);
      } else {
        this.$refs.tree.setChecked(data[this.props.id], false);
      }
    },
    //单个节点移除
    removetag() {
      this.selectTree.splice(0, 1);
      let setlist = this.$refs.tree.getCheckedNodes();
      setlist.splice(0, 1);
      this.$nextTick(() => {
        this.$refs.tree.setCheckedNodes(setlist);
      });
    },
    //清除所有节点
    clearall() {
      this.selectTree = [];
      this.$nextTick(() => {
        this.$refs.tree.setCheckedNodes([]);
        this.$emit("input", []);
      });
    },
  },
};
</script>
<style scoped>
.el-scrollbar .el-scrollbar__view .el-select-dropdown__item {
  height: auto;
  max-height: 300px;
  padding: 0;
  overflow: hidden;
  overflow-y: auto;
}
.el-select-dropdown__item.selected {
  font-weight: normal;
}
ul li >>> .el-tree .el-tree-node__content {
  height: auto;
  padding: 0 20px;
}
.el-tree-node__label {
  font-weight: normal;
}
.el-tree >>> .is-current .el-tree-node__label {
  color: #409eff;
  font-weight: 700;
}
.el-tree >>> .is-current .el-tree-node__children .el-tree-node__label {
  color: #606266;
  font-weight: normal;
}
.maxwidth {
  width: 100%;
}
</style>

使用代码

<select-tree-multiple :props="tagProps" :list="tagsNameList2" v-model="tagType" ref="tag"></select-tree-multiple>

标签:__,el,vue,selectTree,下拉多选,tree,element,item,label
From: https://www.cnblogs.com/9zhe/p/17504530.html

相关文章

  • 前端Vue自定义精美tabs,可设置下划线图标 热门标题
    前端Vue自定义精美tabs,可设置下划线图标热门标题,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13186效果图如下:cc-beautyTabs使用方法<!--tabchange:tab选择事件tabList:tab数据--><cc-beautyTabs@tabChange="tabChange":tabList="t......
  • 前端Vue自定义滚动卡片,可以用于商品海报生成
    前端Vue自定义滚动卡片,可以用于商品海报生成,下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=13189实现代码如下:cc-scroolCard使用方法<!--dataInfo:滚动卡片数据 swiperIndex:滚动序列@change:滚动事件--><cc-scroolCard:dataInfo="data":......
  • springboot+vue基于Web的社区医院管理服务系统,附源码+数据库+论文+PPT,适合课程设计、
    1、项目介绍在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括社区医院管理服务系统的网络应用,在外国线上管理系统已经是很普遍的方式,不过国内的管理系统可能还处于起步阶段。社区医院管理服务系统具有社区医院信息管理功能的选择。社区医院管理服务系统......
  • SpringBoot + Ant Design Vue实现数据导出功能
    (SpringBoot+AntDesignVue实现数据导出功能)一、需求以xlsx格式导出所选表格中的内容要求进行分级设置表头颜色。二、前端代码实现2.1显示实现首先我们需要添加一个用于到导出的按钮上去,像这样的:<a-button@click="exportBatchlistVerify">批量导出</a-button>至......
  • vue 解决 post请求下载文件,下载的文件损坏打不开,结果乱码
    axios.post('xxx',{responseType:'blob'//指定返回数据的格式为blob}).then(response=>{console.log(response);//把response打出来,看下图leturl=window.URL.createObjectURL(response.data);console.log(url)vara=document.cre......
  • Vuex教程
    Vuex使用场景:全局管理数据注意:vue2项目要安装vuex3版本,vue3项目要安装vuex4版本安装npminstallvuex@3--save建立以下目录结构/src /store -store.js创建vuexstorevuex中最关键的是store对象,这是vuex的核心。可以说,vuex这个插件其实就是一个store对象,每个vue......
  • elementplus vue 范围输入框
    <divclass="fv-rowmb-7"><labelclass="fs-6fw-semoboldmb-2">{{t("Numberofgroups")}}</label><el-form-itemprop="formInline.group"><el-inputcl......
  • Vue中的Ajax请求和Slot插槽的技术探究
    Ajax请求Ajax是一种异步的Web开发技术,用于在不刷新整个页面的情况下向服务器发送请求和接收响应。Vue提供了一种简单而强大的方法来处理Ajax请求。以下是在Vue中进行Ajax请求的基本步骤:安装Axios:Axios是一个流行的JavaScript库,用于进行Ajax请求。你可以使用npm或yarn等包管理......
  • vue-step2
    目录结构目录解析build:项目构建(webpack)相关代码config:配置目录,包括端口号等node_modules:npm加载的项目依赖模块src:assets:放置一些图片,如logocomponents:目录里面放一些组件文件,可以不用App.vue项目入口文件main.js项目的核心文件sta......
  • VUE防止多次点击,重复请求
    1.添加自定义文件preventReClick.jsimportVuefrom'vue'constpreventReClick=Vue.directive('preventReClick',{  inserted:function(el,binding){    el.addEventListener('click',()=>{      if(!el.disabled)......