vue项目中使用vue-treeselect插件及遇到的问题

11 篇文章 0 订阅

vue-treeselect地址链接https://www.vue-treeselect.cn

一、安装

npm install --save @riophae/vue-treeselect

二、使用

在这里插入图片描述

import Treeselect from "@riophae/vue-treeselect";//引入插件
import "@riophae/vue-treeselect/dist/vue-treeselect.css";//引入插件样式

相关代码如下

<template>
  <div>
   <treeselect
        class="contract_input" style="float:left;" v-model="searchData.positionId" :appendToBody="true" 
            :normalizer="normalizer" placeholder="选择位置" :options="positionArr" :multiple="false"
      />
  </div>
</template>
<script>
import Treeselect from "@riophae/vue-treeselect";
// import the styles
import "@riophae/vue-treeselect/dist/vue-treeselect.css";
export default {
  name: "test",
  components: {
    Treeselect
  },
  data(){
    return {
      positionArr:[
      {
          positionId: "1",
          positionName: "字节跳动科技有限公司",
          children: [
            {
              positionId: "11",
              positionName: "产品研发部",
              children: [
                {
                  positionId: "112",
                  positionName: "java",
                  children: [
                    
                    {
                      positionId: "1124",
                      positionName: "spring cloud eureka",
                      isDisabled: true,
                    },
                    {
                      positionId: "1125",
                      positionName: "zookeeper",
                      isDisabled: true,
                    },
                  ],
                },
                
              ],
            },
            {
              positionId: "12",
              label: "销售部门",
              children: [
                {
                  positionId: "121",
                  positionName: "产品经理",
                },
              
                {
                  positionId: "124",
                  positionName: "销售三部",
                },
              ],
            },
            {
              positionId: "13",
              positionName: "财务部",
              children: [
                {
                  positionId: "131",
                  positionName: "财务一部",
                },
                {
                  positionId: "132",
                  positionName: "财务二部",
                },
               
                {
                  positionId: "137",
                  positionName: "财务七部",
                },
              ],
            },
          ],
        },
        {
          positionId: "2",
          positionName: "PDD科技有限公司",
          children: [
            {
              positionId: "21",
              positionName: "产品研发部",
              children: [
                {
                  positionId: "212",
                  positionName: "java",
                },
               
              ],
            },
            {
              positionId: "22",
              positionName: "销售部门",
              children: [
                {
                  positionId: "221",
                  positionName: "产品经理",
                },
                {
                  positionId: "222",
                  positionName: "销售一部",
                },
          
              ],
            },
            {
              positionId: "23",
              positionName: "财务部",
              children: [
                {
                  positionId: "231",
                  positionName: "财务一部",
                },
                {
                  positionId: "232",
                  positionName: "财务二部",
                },
              
              ],
            },
          ],
        },],
      searchData:{
        positionId: null,
      },
      normalizer(node) {
        console.log(node);
        if(node.children==null || node.children=='null'){
          delete node.children
        }
        return {
          id: node.positionId,
          label: node.positionName,
          children: node.children,
        }
      },
  ``},
  },
  methods:{
  //选中的时候的数组
    nodeSelect(node, instanceId) {
      console.log(node, instanceId, "select");
      this.addForm.positionId=node.positionId;
      this.addForm.positionName=node.positionName;
    },
  }
 }
</script>

四、遇到的问题小结

1.首先是vue-treeselect 下拉数据被遮挡问题
在这里插入图片描述
数据被遮罩
在这里插入图片描述
添加 :appendToBody="true",就正常显示了

2.什么都不选择时,treeselect值默认显示unkonwn
在这里插入图片描述

在这里插入图片描述
解决办法:将绑定的参数的默认值设为null

在这里插入图片描述
3.自定义键名
如果通过AJAX加载的选项数据与vue-treeselect要求的数据结构不同,例如,您的数据具有name属性,但vue-treeselect需要label,则可能需要自定义键名。在这种情况下,您可以提供一个称为函数的prop normalizer,在数据初始化期间它将传递给树中的每个节点。使用此函数创建并返回转换后的对象。
比如
在这里插入图片描述
这时候就要转化下了
在这里插入图片描述

二、多选

html

<treeselect class="contract_input" style="float:left;" v-model="addForm.permId" :appendToBody="false" 
            :normalizer="normalizer" placeholder=""  :options="editCities" :multiple="true" @select="getTree" :value-consists-of="valueConsistsOf"/>

js

normalizer(node) {
        if(node.children==null || node.children=='null'){
          delete node.children
        }
        return {
          id: node.permId,
          label: node.permName,
          children: node.sysPermChildren,
        }
      },
      valueConsistsOf: "ALL",//input框显示所有选中的项

在这里插入图片描述

数据返回格式,会返回一个选中的项的数组(只存放id),一个所有项的数组
在这里插入图片描述选中项过多时,隐藏其他的项
在这里插入图片描述

<treeselect  class="contract_input" style="float:left;" v-model="addForm.permId" :appendToBody="false" 
            :normalizer="normalizer" placeholder="" :limit="5" :limitText="count=>`+${count}`" :options="editCities" :multiple="true" @select="getTree" :value-consists-of="valueConsistsOf"/>

在这里插入图片描述
三、提示 No options available.

在这里插入图片描述

给组件加上 noOptionsText="暂无数据"

<treeselect style="width:100%;" v-model="addForm.entryPositionArr" :appendToBody="false" 
                    :normalizer="normalizer" placeholder="选择位置" noOptionsText="暂无数据" :options="positionArr" :multiple="true"/>

在这里插入图片描述

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

coderdwy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值