【开发】【element-ui】实现 树状节点下拉选择器 组件的简单思路

利用el-selectel-tree组合使用实现 树状节点下拉选择器 的基础组件Demo
因为比较简单,直接上代码,相关解释在代码注释里。

效果图

在这里插入图片描述

HTML

<template>
  <div>
    <el-select ref="selectRef" v-model="selectValue" size="mini" :style="width ? `width:${width}` : ''">
      <!-- 搜索 -->
      <el-input v-model="filterText" placeholder="搜索已显示过的节点" clearable />
      <!-- 节点树 -->
      <el-option style="height: 100%; padding: 0;" value="">
        <el-tree
          ref="treeRef"
          class="main-select-el-tree"
          :data="treeData"
          :props="treeProps"
          :expand-on-click-node="expandOnClickNode"
          :filter-node-method="filterNode"
          :load="loadNode"
          lazy
          highlight-current
          accordion
          style="font-weight: normal;"
          @node-click="handleNodeClick" />
      </el-option>
    </el-select>
  </div>
</template>

JavaScript

<script>
export default {
  name: 'ObjectSchemaSelect',
  props: {
    width: {
      type: String,
      default: ''
    }
  },
  data() {
    return {
      // 输入框绑定值
      selectValue: '',
      // 当前选中 - 节点值
      nowNode: '',
      // 当前选中 - 节点父值
      nowNodeParent: '',
      // 搜索框绑定值
      filterText: '',
      // tree - 配置
      expandOnClickNode: true,
      treeProps: { children: 'children', label: 'label', isLeaf: 'leaf' },
      treeData: []
    }
  },
  watch: {
    // 树 - 搜索
    filterText(val) {
      this.$refs.treeRef.filter(val)
    }
  },
  created() {
    this.getData()
  },
  methods: {
    // tree - node-click
    handleNodeClick(node) {
      // TODO 后续可改造 跳过一级节点
      if (node && node.level !== 1) {
        this.nowNode = node.label || '-'
        this.nowNodeParent = node.parent || '-'
        this.selectValue = `${this.nowNodeParent}/${this.nowNode}`
        this.$refs.selectRef.blur()
      }
    },
    // tree - filter-node-method
    filterNode(value, data) {
      if (!value) return true
      return data.label.indexOf(value) !== -1
    },
    // tree - load
    loadNode(node, resolve) {
      if (node.level === 0) {
        return resolve(this.treeData)
      } else {
        const data = [{ label: '二级A-1', leaf: true, parent: '一级A' }]
        setTimeout(() => { resolve(data) }, 500)
      }
    },
    // getData
    getData() {
      const data = [
        { label: '一级A', level: 1 },
        { label: '一级B', level: 1, children: [{ label: '二级B-1', leaf: true, parent: '一级B' }] }
      ]
      setTimeout(() => { this.treeData = data }, 500)
    }
  }
}
</script>

CSS

<style lang="scss" scoped>
::v-deep .main-select-el-tree .el-tree-node .is-current>.el-tree-node__content {
  font-weight: bold;
  color: $--color-blue;
}

::v-deep .main-select-el-tree .el-tree-node.is-current>.el-tree-node__content {
  font-weight: bold;
  color: $--color-blue;
}
</style>
  • 13
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值