element-ui出的treeselect下拉树组件基本使用:Vue通用下拉树组件@riophae/vue-treeselect的使用-CSDN博客

vue-treeselect 问题合集、好用的树形下拉组件(vue-treeselect的使用、相关问题解决方案)-CSDN博客

需求1:treeselect下拉树组件只能选择叶子节点,其他父节点均为点击展开功能(不选中)

v-model绑定的值要设为null,不能设为'' ,否则会回显unknown 

options属性为绑定的树

normalizer就是把我们自己的后端返的数据格式按树插件需要的格式转换 ;

@select为选中某个节点时触发,

disable-branch-nodes属性是禁用节点属性(针对需求1这个属性一定要设置,否则不生效)

             <treeselect
                v-model="partId"
                :options="icdTree"
                :normalizer="tenantIdnormalizerPart"
                noOptionsText="暂无数据"
                placeholder="请选择"             
                @select="partChange"
                :disable-branch-nodes="true">
              </treeselect>
        //获取tree数据时,就要递归tree标记叶子节点了
        getIcdDict({level:1}).then(res => {
          const temp = res.data
          this.markLeafNodes(temp)
          this.icdTree = temp
          let findItem = this.getNode(this.icdTree,'diagnosisId',curBtn[0].searchKey.bodyId[0])
          this.partId = findItem.diagnosisId
        }),
        //标记叶子节点方法
        markLeafNodes(list) {
          list.forEach(item => {
            item.show = false
            if(item.children.length == 0){
              item.isLeaf = true
            }else{
              this.markLeafNodes(item.children)
            }
          })
        },
        //递归tree找到某个节点对象
        getNode(data, key, value) {
          let result = null;
          let fn = function (d) {
            if (Array.isArray(d)) { // 判断是否是数组
                for (let i = 0; i < d.length; i++) {
                  const e = d[i];
                  if (e[key] == value) { // 数据循环每个子项,并且判断子项下边是否有id值
                      result = e; // 返回的结果等于每一项
                      break;
                  } else if (e.children) {
                      fn(e.children); // 递归调用下边的子项
                  }
                }
            }
          }
          fn(data); // 调用一下
          return result;
        },
        tenantIdnormalizerPart(node, instanceId) {
          if (node.children && !node.children.length) {
            delete node.children; 
          }
          //这里判断node节点如果是叶子节点,则设置当前节点的isDisabled属性为false(节点不禁用,可选)
          if(node.isLeaf){
            node['isDisabled'] = false;
          }
          return {
            id: node.diagnosisId,
            label: node.diagnosisContent,
            children: node.children,
          };
        },

需求2:treeselect下拉树组件叶子节点添加按钮功能

参考文章:12.element-ui组件 el-tree 树菜单 鼠标滑过mouseenter,mouseleave移入移出节点,显示操作按钮 新增,删除等(element)_el-tree-select 鼠标移入事件-CSDN博客 

需要用到treeselect组件的插槽:slot="option-label",

插槽slot=“option-label” 是下拉框的值,

插槽slot=“value-label” 是输入框回显的值,

接上面代码

              <treeselect
                v-model="partId"
                :options="icdTree"
                :normalizer="tenantIdnormalizerPart"
                noOptionsText="暂无数据"
                placeholder="请选择"             
                @select="partChange"
                :disable-branch-nodes="true">
                    <div slot="option-label" slot-scope="{ node}" @mouseover="handleMsenter(node)" @mouseleave="handleMsLeave(node)">
                  <span>
                    <span>{{ node.label }}</span>
                    <span v-show="node.show && node.isLeaf" size="small" type="text" style="margin-left:50px;color:#1890ff" @mousedown="msAdd(node)">添加</span>
                  </span>
                </div>
              </treeselect>
//注意此处添加按钮如果使用el-button,和@click事件,那么点击事件是不会被触发的,此处使用span标签+@mousedown事件,就可以成功触发事件。

    handleMsenter(node){
      this.$set(node,'show',true)
    },
    handleMsLeave(node){
      this.$set(node,'show',false)
    },
    msAdd(node){
      //添加事件todo....
    },
   

    

 

GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:3 个月前 )
c345bb45 7 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 7 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐