前言
Vue Treeselect 是一个功能强大、灵活多样的 Vue 树形选择组件,为开发者提供了便捷的方式来实现树状结构的数据选择功能。无论是构建多级级联选择器、实现搜索和远程加载、还是定制化样式和主题,Vue Treeselect 都展现了其出色的表现和丰富的特性。
不论您是初学者还是经验丰富的Vue开发者,本文都将为您提供有用的知识和实用的操作技巧,用于您更好地利用Vue Treeselect来满足项目需求。
背景
项目中需要开发一个,选中一个选项禁用的功能(失去焦点禁用,点击输入框解除禁用并可删除),多规则选项,最多可增加5组数据(如下图所示),还得具备筛选功能。这么一个需求,接下来我会先从安装以及案例进行说明,
初始化:
选中
选中后:
多个规则下:
安装
VueTreeselect官网地址:https://vue-treeselect.js.org/
中文地址原来的不能用了,我找到一个新的:www.javasoho.com/vuetreesele…
首先安装插件
npm install --save @riophae/vue-treeselect
接着在所需要的页面中引入组件及样式
组件
<treeselect v-model="value" :multiple="true" :options="options" />
**multiple 是否开启多选**
<script>
// import the component
import Treeselect from '@riophae/vue-treeselect'
// import the styles
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
// register the component
components: { Treeselect },
data() {
return {
// define the default value
value: null, 选中的数据
// define options 源数据
options: [ {
id: 'a',
label: 'a',
children: [ {
id: 'aa',
label: 'aa',
}, {
id: 'ab',
label: 'ab',
} ],
}, {
id: 'b',
label: 'b',
}, {
id: 'c',
label: 'c',
} ],
}
},
}
</script>
至此就可以使用了,api的详解还请大家自行去官网查询。接下来,给大家演示背景中,实战应用的需求。
应用
1.引入组件
大家看到背景中的需求以及图片,想必脑中已经勾勒出了整体的步骤,以及编写代码中的一些注意事项,接下来开始编码
<div v-for='(item,index) in datalist' :key='index'>
<treeselect
:multiple="true"
:options="options3"
:flat="true"
:clearable="false"
:sort-value-by="sortValueBy"
:normalizer="normalizer1"
:default-expand-level="1"
placeholder="请选择"
v-model="item.alldata"
@close="closemenu(item.startRoleId,1)"
@open="closemenu(item.startRoleId,2)"
no-results-text="没有匹配内容"
no-options-text="暂时没有内容"
no-children-text="暂时没有内容"
:disable-branch-nodes="true"
:allow-clearing-disabled="true"
:allow-selecting-disabled-descendants="true"
:clearOnSelect="true"
:limit = '6'
:limitText="count => `+${count}`"
/>
</div>
上面的代码可以多规则添加,数据源来源于一个,这样可以减少一些不必要的代码。
2.属性
下面是使用到的属性:
Name | Type、Defalut/类型、默认值 | Description/描述 |
---|---|---|
multiple | Type: Boolean Default: false |
设置为 true 允许选择多个选项(又名多选模式) |
flat | Type: Boolean Default: false |
分支节点和叶子节点不会相互影响 |
clearable | Type: Boolean Default: true |
是否显示重置值的“×”按钮 |
sort-value-by | Type: String Default: ORDER_SELECTED |
是否显示重置值的“×”按钮 |
clearable | Type: Boolean Default: true |
所选选项应按其顺序显示在触发器中,并在数组中 value 排序。仅当 :multiple="true" 时才使用 。 Acceptable values: "ORDER_SELECTED" , "LEVEL" or "INDEX" 可接受的值: "ORDER_SELECTED" 或 "LEVEL" "INDEX" |
normalizer | Type: Fn( node, instanceId) 🡒 node“ Default: node => node |
自定义键名 |
clearable | Type: Number Default: 0 |
加载时应自动扩展多少级分支节点。设置为 Infinity 默认展开所有分支节点 |
no-results-text | Type: String Default: No results found... |
没有匹配的搜索结果时显示的文本 |
noOptionsText | Type: String Default: No options available. |
没有可用选项时显示的文本 |
noChildrenText | Type: String Default: No sub-options. |
分支节点没有子节点时显示的文本。 |
disableBranchNodes | Type: Boolean Default: false |
是否阻止选择分支节点 |
allowClearingDisabled | Type: Boolean Default: false |
是否允许重置值,即使有禁用的选定节点 |
allowSelectingDisabledDescendants | Type: Boolean Default: false |
选择/取消选择祖先节点时,是否应选择/取消选择其禁用的后代。您可能希望将其与 allowClearingDisabled prop 结合使用 |
clearOnSelect | Type: Boolean Default: false |
选择选项后是否清除搜索输入。仅当 :multiple="true" 时才使用 。对于单选模式,无论道具值如何,它始终在选择后清除输入 |
limit | Type: Number Default: Infinity |
限制所选选项的显示。其余部分将隐藏在字符串中 limitText |
limit | Type: Fn(count ) 🡒 String Default: count => and ${count} more |
处理所选元素超过定义限制时显示的消息的函数 |
:limitText=”count => +${count}
” 这个我是改写成了只展示数字,总共选择了多少个选项
上面的代码,绑定的选中数据都会放入各自的item.alldata
这个数组中。现在整个基础功能已经完善的差不多了。
禁用事件编码
接下来就是实现失焦禁用的功能。
当时我做到这的时候,第一时间去查了api发现他有一个禁用的属性,
然后思路来了,我动态添加设置那不就行嘛,我采用了递归进行处理,然后我调用打开菜单的时候让isDisabled
设置为true
,关闭的时候设置为false
,其中还要对比数据源中那些之前被选中(还需要禁用掉),代码如下所示:
closemenu(item,a) {
this.dishFunc3(this.options3(源数据), item, a==1?true:false);
},
dishFunc3(menuTreeList, list, disabled) {
if (menuTreeList.length > 0) {
menuTreeList.forEach((v, k) => {
list.forEach((item, index) => {
if (v.code == item) {
this.$set(v, "isDisabled", disabled);
}
});
if (v.children) {
this.dishFunc3(v.children, list, disabled);
}
});
return menuTreeList;
}
},
到这整个数据都走通了,还要注意一点的是 回显的时候还需要调用一下closemenu
方法不让选中的数据不是禁用状态。
总结
以上所述都是实战遇见的思路和经验,希望能为jym带来启发和帮助。如果jym对 Vue Treeselect 或相关主题有任何疑问或需求,可以随时交流。
参考资料:
官网:
vue-treeselect.js.org/
中文官网:
www.javasoho.com/vuetreesele…
原文链接:https://juejin.cn/post/7343616758325329957 作者:给你俩小拳头