vue实现tree-select组件(树选择器)

基于iview的树选择器

组件效果

在这里插入图片描述

思路

主要用iview的Dropdown、Input和Tree组件实现,Dropdown作为外层组件,实现下拉收缩效果,Input实现数据回显,Tree加载数据选项。重点是Tree作为Dropdown的list插槽实现下拉选项的效果

实现

  1. 模板部分
    trigger为custom,手动控制下拉框的显示,Input设为只读
<Dropdown
  ref="dropdownRef"
  style="width:100%"
  trigger="custom"
  :visible="showDrop"
  :disabled="disabled"
>
  <Input
    v-model="showVal"
    style="width: 100%;"
    readonlys
    icon="ios-arrow-down"
    placeholder="请选择"
    @click.native="showDropItem"
  />
  <Tree
    class="i-tree"
    slot="list"
    style="width: 100%;"
    :data="treeData"
    @on-select-change="handleChange"
  ></Tree>
</Dropdown>
  1. js逻辑
    组件加载时初始化TreeData,handleChange事件处理树的点击逻辑,点击Input控制下拉框展示和关闭
mounted() {
  let list = [];
  this.$post(this.url)
    .then((res) => {
      res.goodsTypes.forEach((item) => {
        list.push({
          title: item.title,
          value: item.value,
          expand: false,
          selected: false,
          children: item.children || [],
        });
      });
      this.treeData = list;
    })
    .catch((err) => {
      console.log(err);
    });
},
methods: {
  // 选择事件
  handleChange(e, node) {
    this.val = node.value;
    this.showVal = node.title;
    this.showDrop = false;
    this.$emit("on-change", this.val, this.formKey, this.itemKey);
  },
  // 控制下拉框展示和关闭
  showDropItem() {
    this.showDrop = !this.showDrop;
  },
},
  1. 加些样式
<style scoped>
.i-tree {
  max-height: 300px;
  overflow: auto;
  width: 100%;
}
.i-tree /deep/ .ivu-tree-title {
  width: 100%;
}
</style>
  1. 加个鼠标监听器
 mounted() {
   // 加入全局监听
   document.addEventListener("click", this.autoHidden);
 },
 destroyed() {
   // 移除全局监听
   document.removeEventListener("click", this.autoHidden);
 },
 methods: {
   // 点击其他地方控制下拉框收起
  autoHidden(e) {
      if (this.$refs.dropdownRef) {
        // 判断鼠标点击的dom不在dropdownRef中,且下拉框为显示状态
        if (!this.$refs.dropdownRef.$el.contains(e.target) && this.showDrop) {
          this.showDrop = false;
        }
      }
    },
 },

这样点击其他区域下拉框就会自动收缩了

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue中的TreeSelect组件是一个可用于选择形结构数据的下拉选择。它通常用于展示层级关系,并允许用户从中选择一个或多个节点。 在Vue中使用TreeSelect组件,首先需要引入相关的库或插件,例如element-ui或vue-treeselect。然后在组件中使用TreeSelect标签,并通过props传入需要展示的数据和一些配置项。 以下是一个示例代码: ```vue<template> <div> <tree-select v-model="selectedNodes" :data="treeData" :multiple="true" :show-checkbox="true" :load-data="loadData" ></tree-select> </div> </template> <script> import TreeSelect from 'vue-treeselect'; export default { components: { TreeSelect, }, data() { return { selectedNodes: [], treeData: [], }; }, methods: { loadData({ parentId, callback }) { //从后端加载数据的方法,根据parentId获取子节点数据 // 加载完成后调用callback方法将数据传递给TreeSelect组件 }, }, }; </script> ``` 在上面的示例中,`treeData`是展示在TreeSelect中的形结构数据,`selectedNodes`是用户选择的节点数组。通过`v-model`指令可以实现双向绑定。 TreeSelect组件还提供了一些配置项,例如`multiple`表示是否允许多选,`show-checkbox`表示是否显示复选框,`load-data`是一个方法,用于异步加载子节点数据。 需要根据具体的需求和使用的插件进行相应的配置和使用。以上只是一个简单示例,具体的实现方式可能会有所不同。你可以根据自己的需求和文档进行配置和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值