el-select与el-tree结合使用实现树形结构多选框

 更新时间:2022年10月19日 16:30:15   作者:终归墟  
我们在实际开发中需要用到下拉树,elementUI是没有这个组件的,我们就要自己去写了,下面这篇文章主要给大家介绍了关于el-select与el-tree结合使用实现树形结构多选框的相关资料,需要的朋友可以参考下

前言

接上篇文章需求,选择树形结构的时候有多选的情况,用上一篇的单选并不能解决问题,下图是这次达到的效果

话不多说,上代码

html

<el-select v-model="value" multiple placeholder="请选择" :popper-append-to-body="false"
    @remove-tag="removetag"  collapse-tags @clear="clearall" clearable >
    <el-option :value="selectTree" class="setstyle" disabled>
		<el-tree :data="list" :props="defaultProps" ref="tree"
		show-checkbox check-strictly :expand-on-click-node="false" node-key="id"
		check-on-click-node @check-change="handleNodeClick"></el-tree>
	</el-option>
</el-select>

js

<script>
	export default {
		data() {
			return {
				value:[],
				selectTree:[],
				defaultProps:{
					children: 'children',
					label: 'label'
				},
				list: [{
					id: 1,
					label: '一级 2',
					children: [{
						id: 3,
						label: '二级 2-1',
						children: [{
							id: 4,
							label: '三级 3-1-1'
						}, {
							id: 5,
							label: '三级 3-1-2',
						}]
					}, {
						id: 2,
						label: '二级 2-2',
						children: [{
							id: 6,
							label: '三级 3-2-1'
						}, {
							id: 7,
							label: '三级 3-2-2',
						}]
					}]
				}],
			}
		},
		methods: {
			handleNodeClick(data,self,child) {
				console.log(this.$refs.tree.getCheckedNodes())
				let datalist = this.$refs.tree.getCheckedNodes()
				this.selectTree = [] //置空
				this.value = []
				datalist.forEach((item)=>{
					this.selectTree.push({id:item.id,label:item.label})
					this.value.push(item.label)
				})
			},
            removetag(){
				this.selectTree.splice(0,1)
				let setlist = this.$refs.tree.getCheckedNodes()
				setlist.splice(0,1)
				this.$nextTick(() => {
					this.$refs.tree.setCheckedNodes(setlist) 
				})
			},
			clearall(){
				this.selectTree = []
				this.$nextTick(() => {
					this.$refs.tree.setCheckedNodes([]) 
				})
			},
		},
	}
</script>

css   纠正样式问题,其中cursor修改禁用后的鼠标状态,

.setstyle {
	min-height: 200px;
	padding: 0 !important;
	margin: 0;
	overflow: auto;
	cursor: default !important;
}

思路:

通过el-tree来选择所需要的节点和获取数据,将el-select的选择关闭,防止点击时报错,通过el-tree获取的数据来关联el-select并渲染输入框的内容,而不是通过option来获取数据(所以el-option的状态时disabled)。

重点:

1.this.$refs.tree.getCheckedNodes() 获取选中的节点

2.cursor:default  修改鼠标状态

3.check-change 节点选中状态发生变化时触发

涉及内容:

popper-append-to-body是否将弹出框插入至 body 元素。在弹出框的定位出现问题时,可将该属性设置为 falseboolean
show-checkbox节点是否可被选择boolean
check-strictly在显示复选框的情况下,是否严格的遵循父子不互相关联的做法,默认为 falseboolean
expand-on-click-node是否在点击节点的时候展开或者收缩节点, 默认值为 true,如果为 false,则只有点箭头图标的时候才会展开或者收缩节点。boolean
check-on-click-node是否在点击节点的时候选中节点,默认值为 false,即只有在点击复选框时才会选中节点。boolean

第二版修改

在之前的基础上进行了优化,增加了删除的功能,

 原来的删除中,数组件不会跟随修改,这次优化后,使组件功能更加完善。

思路:

通过删除已选模块时触发的方法,对树组件中数据选择情况进行重新修改渲染,触发清空时,将已选数据置空,并且把树组件中已选项全部修改为未选。

涉及内容:

getCheckedNodes若节点可被选择(即 show-checkbox 为 true),则返回目前被选中的节点所组成的数组(leafOnly, includeHalfChecked) 接收两个 boolean 类型的参数,1. 是否只是叶子节点,默认值为 false 2. 是否包含半选节点,默认值为 false
setCheckedNodes设置目前勾选的节点,使用此方法必须设置 node-key 属性(nodes) 接收勾选节点数据的数组
node-key每个树节点用来作为唯一标识的属性,整棵树应该是唯一的String
remove-tag多选模式下移除tag时触发移除的tag值
clear可清空的单选模式下用户点击清空按钮时触发
collapse-tags多选时是否将选中值按文字的形式展示boolean

设置collapse-tags后,展示效果:

上图箭头所指向的模块是通过getCheckedNodes获取到的列表中的第一个元素,所以上面删除方法中使用了splice(0,1)来进行删除。

总结

到此这篇关于el-select与el-tree结合使用实现树形结构多选框的文章就介绍到这了,更多相关el-select el-tree树形结构多选框内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • vue项目中swiper轮播active图片实现居中并放大

    vue项目中swiper轮播active图片实现居中并放大

    这篇文章主要介绍了vue项目中swiper轮播active图片实现居中并放大方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • Vue v2.5 调整和更新不完全问题

    Vue v2.5 调整和更新不完全问题

    这篇文章主要介绍了Vue v2.5 调整和更新不完全问题的相关资料,需要的朋友可以参考下
    2017-10-10
  • vue路由跳转router-link清除历史记录的三种方式(总结)

    vue路由跳转router-link清除历史记录的三种方式(总结)

    这篇文章主要介绍了vue路由跳转router-link清除历史记录的三种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 前端vue按1920*1080设计图的页面适配屏幕缩放并适配4K屏详解

    前端vue按1920*1080设计图的页面适配屏幕缩放并适配4K屏详解

    最近在做一个数据可视化的项目,整个项目全是大屏展示,期间也是遇到很多问题,最令人头疼的就是大屏的适配,下面这篇文章主要给大家介绍了前端vue按1920*1080设计图的页面适配屏幕缩放并适配4K屏的相关资料,需要的朋友可以参考下
    2022-11-11
  • 脚手架(vue-cli)创建Vue项目的超详细过程记录

    脚手架(vue-cli)创建Vue项目的超详细过程记录

    用vue-cli脚手架可以快速的构建出一个前端vue框架的项目结构,下面这篇文章主要给大家介绍了关于脚手架(vue-cli)创建Vue项目的超详细过程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • vue2.x background:url()的踩坑记录

    vue2.x background:url()的踩坑记录

    这篇文章主要介绍了vue2.x background:url()的踩坑记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-04-04
  • 在Vue3.x中实现类似React.lazy效果的方法详解

    在Vue3.x中实现类似React.lazy效果的方法详解

    React 的 React.lazy 功能为组件懒加载提供了原生支持,允许开发者将组件渲染推迟到实际需要时再进行,虽然 Vue3.x 没有一个直接对应的 lazy 函数,但我们可以通过动态导入和 defineAsyncComponent 方法来实现类似的效果,需要的朋友可以参考下
    2024-03-03
  • Vue中 axios delete请求参数操作

    Vue中 axios delete请求参数操作

    这篇文章主要介绍了Vue中 axios delete请求参数操作,具有很好的参考价值,希望对大家有所 帮助。一起跟随小编过来看看吧
    2020-08-08
  • vue 双向绑定问题$emit无效的解决

    vue 双向绑定问题$emit无效的解决

    这篇文章主要介绍了vue 双向绑定问题$emit无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 解决vue2.x中数据渲染以及vuex缓存的问题

    解决vue2.x中数据渲染以及vuex缓存的问题

    本篇文章主要介绍了vue2.x中请求之前数据显示以及vuex缓存的问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07

最新评论