【Vue-Treeselect 和 vue3-treeselect】树形下拉框

本文介绍了如何在Vue2和Vue3中使用Vue-Treeselect实现树形下拉框功能,包括安装、基本属性配置、自定义验证规则以及处理空数据情况。同时,展示了如何处理默认选择问题和自定义id与name。对于Vue3,还提到了数据格式转换和回显功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Vue-Treeselect Vue2树形下拉框

链接

文档:Vue-Treeselect

实现

第一步:安装

npm install --save @riophae/vue-treeselect

第二步:实现

import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'

属性

:multiple="true" :是否允许多选
:options="list" :渲染的数据

:show-count="true" :展示下拉总数数据
:flat="true" :设置平面模式(选中的标签不联动子节点和父节点)
:limit="5" :展示多选的标签个数
:limitText="count => `及其它${count}项`" :多选的超出文字展示方式
:auto-deselect-descendants="true" :取消节点时取消其接点的子节点(平面模式下使用)
:auto-select-descendants="true":选择节点时取消其接点的子节点(平面模式下使用)    :disable-branch-nodes="true":只能选择末级节点

placeholder="请选择区域"

no-options-text="暂无数据" :列表为空的情况

no-children-text="暂无数据" :选项children为空的情况

空数据文字提示

列表为空的情况:

选项children为空的情况:

 

<treeselect
  v-model="searchForm.id" 
  :options="cateList" 
  no-options-text="暂无数据" 
  no-children-text="暂无数据" 
></treeselect>

默认选择出现unknown问题

解决方法:v-modal 绑定的值给null

自定义验证规则

 input是输入之后调用的方法,close是关闭下拉框调用的方法。

<el-form-item label="审批人" prop="name">
  <treeselect 
        v-model='form.name' 
        :options='options' 
      @input='change' 
      @close='change'
    ></treeselect>
<el-form-item>
cost valid = (rule, value, callback) => {
    if(!value) {    
           document.querySelector('.vue-treeselect__control').style.borderColor = "red"
           callback(new Error('请输入电话号码'))
    }  else {
           document.querySelector('.vue-treeselect__control').style.borderColor = "green"
    }
}
rules:[
    { required: true, validator: valid, trigger: 'input'}
]
change(val){
    this.$nextTick(()=>{
        this.$refs.form.validateField('name')
    }) 
}

自定义id和name

<treeselect 
    v-model="id" 
    :options="list" 
    :normalizer="normalizer" 
/>
data() {
  return {
    id: 0,
    list:[
      {
        id: 1,
        name: '1',
        
        children: [
          {
            id: 11,
            name: '11',
            children: [
              {
                id: 111,
                name: '111',
              }
            ]
          },
          {
            id: 12,
            name: '12',
          },
        ]
      },
      {
        id: 2,
        name: '2',
        children: [
          {
            id: 21,
            name: '21'
          },
          {
            id: 22,
            name: '22'
          },
        ]
      }
    ]

  };
},
normalizer(node) {
  if (node.children && !node.children.length) {
    delete node.children;
  }
  return {
    id: node.id,
    label: node.name,
    children: node.children
  };
},

vue3-treeselect Vue3树形下拉框

链接

github:https://github.com/megafetis/vue3-treeselect

实现

第一步:安装

npm install --save vue3-treeselect

第二步:页面

<treeselect class="vegetable"
  ref="cateSelect"
  v-model="form.id" 
  :options="cateList" 
  :clearable="false" 
  :searchable="false" 
  :disable-branch-nodes="true" 
  no-options-text="暂无数据" 
  no-sub-options-text="暂无数据"
  placeholder="请选择种类"
  @select="handleSelect"
></treeselect>

  vue3-treeselect 插件适用的数据格式是:id、label、children,后端得到的数据需要转格式。

<script lang="ts">
import {defineComponent, onActivated, ref} from "vue";
import { getCateList } from "@src/api/api";
import Treeselect from "vue3-treeselect"
import 'vue3-treeselect/dist/vue3-treeselect.css'

export default defineComponent({
  components: {
    Treeselect
  },
  setup(props) {

    // 进入页面获取种类列表
    onActivated(() => {
      getCate()
    })

    // 格式化后端返回的数据
    const dg = (list: any) => {
      list && list.forEach((v: any) => {
        v.label = v.name 
        v.children = v.child
        if (v.children && v.children.length > 0) {
          dg(v.children)
        }
      })
    }

    // 获取种类列表
    const cateList: any = ref([])
    const getCate = async () => {
      getCateList().then((res: any) => {
        dg(res.list)
        cateList.value = res.list
      }).catch(() => { })
    }

    // 获取选中的id
    const form = ref(<any>{
      id: null,
      name: ''
    });

    // 选择id的同时获取文本
    handleSelect(e) {
      form.value.name = e.name
    }

    return {
      form,
      cateList,
      getCate,
      dg,
      handleSelect
    }
  }
})
</script>
.vegetable{
  height: 37px;
  width: 300px;
}
::v-deep .vegetable .vue-treeselect__control {
  height: inherit;
} 

详情页回显

<treeselect class="vegetable_treeselect"
  ref="cateSelect"
  v-model="form.agentiaCategoryId" 
  :searchable="false" 
  :options="cateList" 
  :clearable="false" 
  :disable-branch-nodes="true" 
  no-options-text="暂无数据" 
  no-children-text="暂无数据" 
  placeholder="请选择果蔬品类"
  @select="handleSelect"
></treeselect>
const cateSelect = ref(null)
const getInfo = () => {
  
  getDetail().then((res:any) => {

    form.value = res;

    nextTick(() => {
      cateSelect.value.select(cateSelect.value.getNode(form.value.id))
    })

  }).catch(() => {

  })
}    
return {
  getInfo 
}

新增页清空渲染

<treeselect class="vegetable_treeselect"
  ref="cateSelect"
  v-model="form.agentiaCategoryId" 
  :searchable="false" 
  :options="cateList" 
  :clearable="false" 
  :disable-branch-nodes="true" 
  no-options-text="暂无数据" 
  no-children-text="暂无数据" 
  placeholder="请选择果蔬品类"
  @select="handleSelect"
  v-if="render"
></treeselect>
const render = ref(true)

onActivated(() => {

  render.value = false

  nextTick(() => {
    render.value = true
  })

})

### 调整 Vue-Treeselect 组件的下拉框宽度 为了自定义 `vue-treeselect` 的下拉框宽度,可以通过覆盖默认样式来实现。具体方法是在项目中的 CSS 文件里添加特定的选择器以修改组件尺寸。 #### 方法一:通过类名覆盖样式 可以在项目的全局样式文件中添加如下代码: ```css /* 修改下拉框整体宽度 */ .vue-treeselect__control { width: 300px !important; /* 设置所需的宽度 */ } /* 如果需要调整弹出菜单的宽度 */ .vue-treeselect__menu { min-width: 300px !important; } ``` 上述代码片段会强制设置 `.vue-treeselect__control` `.vue-treeselect__menu` 类对应的元素宽度为指定像素值[^1]。 #### 方法二:使用 scoped 样式作用域 如果希望仅影响某个页面或组件内的 treeselect 控件,则可以采用局部样式的方式,在单文件组件 (SFC) 中应用scoped属性: ```html <template> <div class="customized-select"> <!-- 使用treeselect组件 --> <vue-treeselect ... /> </div> </template> <style scoped> .customized-select .vue-treeselect__control, .customized-select .vue-treeselect__menu { width: 300px !important; } </style> ``` 这种方法能够确保样式的更改只应用于当前组件内部,而不会干扰其他地方使用的相同控件。 #### 方法三:利用 props 属性配置 部分情况下也可以尝试直接给 `<vue-treeselect>` 添加内联样式或者绑定 style 对象来进行简单的宽度控制;不过这种方式可能不如前两种灵活有效。 ```javascript // 在模板中传递 inline-style 或者 :style 绑定表达式 <vue-treeselect v-bind:style="{width:&#39;300px&#39;}" .../> ``` 以上三种方式都可以用来改变 vue-treeselect 下拉框的实际显示大小,开发者可以根据实际需求选择最合适的方法进行实施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

宾果的救星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值