vue实现tree-select组件(树选择器)
vue
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
项目地址:https://gitcode.com/gh_mirrors/vu/vue

·
组件效果
思路
主要用iview的Dropdown、Input和Tree组件
实现,Dropdown作为外层组件,实现下拉收缩效果,Input实现数据回显,Tree加载数据选项。重点是Tree作为Dropdown的list插槽实现下拉选项的效果
实现
- 模板部分
trigger为custom,手动控制下拉框的显示,Input设为只读
<Dropdown
ref="dropdownRef"
style="width:100%"
trigger="custom"
:visible="showDrop"
:disabled="disabled"
>
<Input
v-model="showVal"
style="width: 100%;"
readonlys
icon="ios-arrow-down"
placeholder="请选择"
@click.native="showDropItem"
/>
<Tree
class="i-tree"
slot="list"
style="width: 100%;"
:data="treeData"
@on-select-change="handleChange"
></Tree>
</Dropdown>
- js逻辑
组件加载时初始化TreeData,handleChange事件处理树的点击逻辑,点击Input控制下拉框展示和关闭
mounted() {
let list = [];
this.$post(this.url)
.then((res) => {
res.goodsTypes.forEach((item) => {
list.push({
title: item.title,
value: item.value,
expand: false,
selected: false,
children: item.children || [],
});
});
this.treeData = list;
})
.catch((err) => {
console.log(err);
});
},
methods: {
// 选择事件
handleChange(e, node) {
this.val = node.value;
this.showVal = node.title;
this.showDrop = false;
this.$emit("on-change", this.val, this.formKey, this.itemKey);
},
// 控制下拉框展示和关闭
showDropItem() {
this.showDrop = !this.showDrop;
},
},
- 加些样式
<style scoped>
.i-tree {
max-height: 300px;
overflow: auto;
width: 100%;
}
.i-tree /deep/ .ivu-tree-title {
width: 100%;
}
</style>
- 加个鼠标监听器
mounted() {
// 加入全局监听
document.addEventListener("click", this.autoHidden);
},
destroyed() {
// 移除全局监听
document.removeEventListener("click", this.autoHidden);
},
methods: {
// 点击其他地方控制下拉框收起
autoHidden(e) {
if (this.$refs.dropdownRef) {
// 判断鼠标点击的dom不在dropdownRef中,且下拉框为显示状态
if (!this.$refs.dropdownRef.$el.contains(e.target) && this.showDrop) {
this.showDrop = false;
}
}
},
},
这样点击其他区域下拉框就会自动收缩了




vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:28 天前 )
9e887079
[skip ci] 11 个月前
73486cb5
* chore: fix link broken
Signed-off-by: snoppy <michaleli@foxmail.com>
* Update packages/template-compiler/README.md [skip ci]
---------
Signed-off-by: snoppy <michaleli@foxmail.com>
Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 1 年前
更多推荐
所有评论(0)