Vue的单选/多选效果

本文介绍如何使用Vue.js实现单选和多选效果,包括DOM结构、CSS样式及JavaScript逻辑。通过两种方法实现多选功能:一种利用数组includes()和filter()方法,另一种通过数组元素布尔属性切换。

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

Vue的单选/多选效果

includes()方法判断是否包含某一元素,返回true或false表示是否包含元素,对NaN一样有效

filter()方法用于把Array的某些元素过滤掉,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素:生成新的数组

一、单选

DOM文档中结构如下:

<ul class="box">
	<li v-for="c,index of cities" :class="{checked:index==n}" @click="changeList(index)">{{c}}</li>
</ul>

CSS样式如下:

<style type="text/css">
body{margin:0;}
ul{
	padding:0; list-style:none; 
	margin:150px 150px;
}
li{
	width:80px; height:50px; 
	display:inline-block;
	border-radius:8px; border:1px #000 solid;
	text-align:center; line-height:50px;
	cursor:pointer; 
	transition:all 0.3s linear;
	margin-left:5px;
}
li:hover{
	background-color:#0CF; color:#fff; 
	border:1px #fff solid;
}	
li.checked{
	background-color:#0CF; color:#fff; 
	border:1px #fff solid;
}
</style>

JavaScript样式如下:

<script src="vue.js"></script>
<script>
var app = new Vue({
	el : ".box",
	data : {
		cities : ["上海","北京","广州","重庆","西安"],
		n : 0
	},
	methods :{
		changeList(index){
			this.n = index;//this指向app
		}
	}
})
</script>

效果如图所示:

选中“北京”时:

 

二、多选

CSS样式如下:

<style type="text/css">
body{margin:0;}
.box{ margin:150px 150px;}
ul{
	padding:0; 
	list-style:none;
}
li{
	width:50px; height:30px; display:inline-block;
	text-align:center; line-height:30px;
	cursor:pointer;margin-left:5px;
}
li:before{ 
	display:inline-block; width:10px; height:10px; 
	line-height:10px; content:""; border:1px #000 solid; 
	margin-right:2px; transition:all 0.3s linear;
}	
li.checked:before{ 
	background-color:#0CF; 
	border:1px #fff solid;
}
li.checked{color:#0CF;}
</style>

方法一:

DOM文档中结构如下:

<ul class="box">
    <li v-for="c,index of cities" :class="{checked:arr.includes(index)}" @click="checkedBox(index)">{{c}}</li>
</ul>

JavaScript样式如下:

<script src="vue.js"></script>
<script>
var app = new Vue({
	el : ".box",
	data : {
		cities : ["上海","北京","广州","重庆","西安"],
		arr : []
	},
	methods :{
		checkedBox(i){
			if(this.arr.includes(i)){
				//includes()方法判断是否包含某一元素,返回true或false表示是否包含元素,对NaN一样有效
				//filter()方法用于把Array的某些元素过滤掉,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素:生成新的数组
				this.arr=this.arr.filter(function (ele){return ele != i;});
				//this.arr=this.arr.filter((ele)=>ele!=i);
				//filter()为假时删除
			}else{
				this.arr.push(i);
			}
		}
	}
})

方法二:

DOM文档中结构如下:

<ul class="box">
    <li v-for="c,index of cities"
    :class="{checked:c.bOn}"
    @click="checkbox(index)">{{c.city}}</li>
</ul>

JavaScript样式如下:

<script src="vue.js"></script>
<script>
var app = new Vue({
	el : ".box",
	data : {
		cities : [{city:"北京",bOn:false},
		{city:"上海",bOn:false},
		{city:"重庆",bOn:false},
		{city:"广州",bOn:false},
		{city:"西安",bOn:false}]
	},
	methods : {
		checkbox(i){
			this.cities[i].bOn = !this.cities[i].bOn;
		}
	}
})

效果如图所示:

多选效果: 

 

### 判断 el-tree-select 单选功能的实现方法 在使用 `el-tree-select` 组件时,可以通过 `v-bind` 的 `attrs` 属性动态绑定组件的配置项,并结合组件的内部逻辑判断是否设置了单选功能。以下是具体实现方式: #### 1. 利用 `multiple` 属性判断单选模式 `el-tree-select` 的核心属性之一是 `multiple`,该属性决定了组件的行为模式。如果 `multiple` 被设置为 `true`,则表示模式;否则为单选模式。 ```javascript // 在 Vue 组件中通过 attrs 获取 multiple 属性 const isMultiple = this.$refs.treeSelect.$attrs.multiple; if (isMultiple) { console.log("当前为模式"); } else { console.log("当前为单选模式"); } ``` 上述代码通过 `$attrs` 获取传递给组件的 `multiple` 属性值[^1]。 #### 2. 动态绑定 `multiple` 属性 在父组件中,可以通过 `v-bind` 的方式动态绑定 `multiple` 属性。例如: ```vue <template> <el-tree-select ref="treeSelect" v-bind="treeSelectAttrs" @change="handleSelectChange" /> </template> <script> export default { data() { return { treeSelectAttrs: { multiple: true } // 动态绑定 multiple 属性 }; }, methods: { handleSelectChange(value) { if (Array.isArray(value)) { console.log("当前为模式"); } else { console.log("当前为单选模式"); } } } }; </script> ``` 通过监听 `change` 事件,可以进一步确认当前模式。如果返回值为数组,则表明处于模式;否则为单选模式[^2]。 #### 3. 自定义方法判断模式 在某些场景下,可能需要封装一个方法来判断组件的单选模式。例如: ```javascript methods: { getSelectionMode() { const multiple = this.$refs.treeSelect.$attrs.multiple; return multiple ? "模式" : "单选模式"; } } ``` 调用该方法时,可以直接获取当前的模式状态。 #### 4. 结合懒加载和节点择逻辑 在 `el-tree-select` 中,如果启用了懒加载(`lazy` 属性),也需要考虑其对单选模式的影响。例如,当 `check-strictly` 属性被设置为 `true` 时,父子节点的择关系将被解耦,这可能会改变用户对单选的预期行为。 ```javascript const isStrictlyChecked = this.$refs.treeSelect.$attrs.checkStrictly; if (isStrictlyChecked) { console.log("父子节点择关系解耦"); } ``` 结合 `multiple` 和 `check-strictly` 属性,可以更全面地判断组件的行为模式[^3]。 --- ### 示例代码 以下是一个完整的示例代码,展示如何通过 `v-bind` 和 `attrs` 判断 `el-tree-select` 的单选模式: ```vue <template> <el-tree-select ref="treeSelect" v-bind="treeSelectAttrs" @change="handleSelectChange" /> </template> <script> export default { data() { return { treeSelectAttrs: { multiple: true } // 动态绑定 multiple 属性 }; }, methods: { handleSelectChange(value) { if (Array.isArray(value)) { console.log("当前为模式"); } else { console.log("当前为单选模式"); } }, getSelectionMode() { const multiple = this.$refs.treeSelect.$attrs.multiple; return multiple ? "模式" : "单选模式"; } } }; </script> ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值