el-select和el-tree结合使用-树形结构多选框

阅读数:299 评论数:0

跳转到新版页面

分类

html/css/js

正文

一、基本思路

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

二、实现

1、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>
popper-append-to-body 是否将弹出框插入至body元素。在弹出框的定位出现问题时,可将该属性设置为false。
show-checkbox 节点是否可被选择。
check-strictly 在显示复选框的情况下,是否严格遵循父子不互相关联的做法,默认为false。
expand-on-click-node 是否在点击节点的时候展开或者收缩节点,默认为true,如果为false,则只有点箭头图标的时候才会展开或收缩节点。
check-on-click-node  是否在点击节点的时候选中节点,默认为false,即只在点击复选框时才会选中节点。
remove-tag 多选模式下移除tag时触发
collapse-tags 多选时是否将选中值按文字的形式展示。
   

 

2、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) {
				// 获取选择中的节点
				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>

(1)getCheckedNodes

若节点可被选择(即show-checkbox为true),则返回目前被选中的节点所组成的数组。

(leafOnly, includeHalfChecked)接收两个boolean类型的参数,leafOnly表示是否只是叶子节点,默认值为false,第二个参数表示是否包含半选节点,默认值为false。

(2)setCheckedNodes

设置目前勾选的节点,使用此方法必须设置node-key属性。

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

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

4、关于check-strictly引发的问题

	1.设置:tree复选框 check-strictly = false(默认) 父子关联:
		选中父级,勾选所有子选项;取消父级选中,同时取消子选项勾选
		选中子选项,父选项变为半选中状态,如果勾选所有子选项,父选项为选中状态
	2.设置:tree复选框  check-strictly = true 父子无关联,出现:
		父级的选中和取消选中,都不会对子选项的状态有任何的影响
		子选项的选中和取消,都不会对父选项的状态有任何的影响

 

 




相关推荐

1、安装依赖 npm install svg-sprite-loader --save-dev 2、配置build文件夹中的webpack.base.conf.js 3、在src/component

在列表渲染时使用key属性 当Vue.js用v-for正在更新已渲染过的元素列表时,它默认用&ldquo;就地复用&rdquo;策略,如果数据项的顺序被改变,Vue将不会移动D

一、vue.js devtools开发工具的使用 1、安装 在chrome或firefox浏览器的扩展插件仓库里搜索vue devtool。 2、debugger的使用 假设我们想调试App.vue这

在一些情况下,我们可能会需要对一个prop进行双向绑定,但它破坏了单向数据流。 在vue 2.3.0,重新引入了.sync修饰符,这是一个语法糖。 例子: <

&lt;div id="app"&gt; &lt;div v-on:click="dodo"&gt;

在登陆页的mouted生命周期方法中,添加 <pre class

ref被用来给元素或子组件注册引用信息,引用信息将会注册在父组件的$refs对象上。如果在普通的DOM元素上使用,引用指向的就是DOM元素,如果用在子组件上,引用就指向组件实例。 <!-- `vm.$

在使用Vue中经常看到HTML中有标签属性前面添加了“:”,有些没有。 其实是v-bind的缩写。 v-bind 缩写: ‘:’ 用法:动态绑定一个或多个特性,或一个组件prop到表达式。在绑定cl

module.exports = { "plugins": { "postcss-import": {},

一、概述 Vuex是一个专门为Vue.js应用程序开发的全局状态管理功能。它采用集中式存储管理应用的所有组件的状态, 并以相应的规则保证状态以一种可预测的方式发生变化。 每一个Vuex应用的核心就是s