vue在自定义CheckBox组件上使用v-model实现双向绑定

前言:看了vue自定义组件的 v-model这一小节后。感觉有点不是很好(既然使用的是复选框、那么大多数应该绑定的是个数组,而示例中是个Boolean类型的)。自己写了一个绑定数组的组件。但总感觉不太优雅。希望大家看到后多补充意见。

代码如下:

<template>
    <span>
        <label v-for="(item,index) of hobbys">
            <input @change="valueChange($event)" type="checkbox" :key="index" :value="item" name="hobby[]">{{item}}
        </label>
    </span>
</template>

<script>
	export default {
		name: "sg-check-box",
        model:{
			event:'change',
            prop:'checked'
        },
        props:{
			checked:Boolean
        },
        data(){
			return{
				hobbys:[
					'游泳','爬山','打球'
                ],
                values:[],//将values抛出到父组件
            }
        },
        methods:{
	        valueChange(event){
                let {checked,value} = event.target;
                if(checked&&!this.values.includes(value)){//如果当前选中并且values中没有对应的值。将此值添加到values中
	        		this.values.push(value)
                }else if (!checked&&this.values.includes(value)){//如果当前取消选中并且values中存在对应的值。将此值从values中移除
                	let index = this.values.findIndex(hobby=>hobby===value)
                    this.values.splice(index,1)
                }
	        	this.$emit('change',this.values)
            }
        }
	}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值