背景。自定义表单。多选组件封装。当选项被多选后,el-checkbox-group中v-model的值以数组形式存储了选中的内容。 奇葩问题。存储的值时label属性。而渲染时需要使用插值 单独将选项的名称渲染出来。而在el-checkbox标签中:label要赋值option.value 很别扭。
< template> < el- form- item : required= "required" : label= "label" > < el- checkbox- groupv- model= "localValue" @change= "handleCheckedChange" : disabled= "disabled" : class = "{ 'checkbox-vertical' : alignDirection === 'vertical' , 'checkbox-horizontal' : alignDirection === 'horizontal' } "> < div v- for = "option in options" : label= "option.label" : key= "option.value" > < el- checkbox : label= "option.value" : key= "option.value" @change= "handleCheckedBoxChange(option, $event)" > { { option. label} } < / el- checkbox> < el- input v- if = "checkedOther" placeholder= "添加其他内容" > < / el- input> < / div> < / el- checkbox- group> < / el- form- item>
< / template> < script>
export default { props : { label : String, options : { type : Array, required : true , default : ( ) => [ ] } , value : { type : String, default : '' } , required : { type : Boolean, default : false } , disabled : { type : Boolean, default : false } , alignDirection : { type : String, default : 'vertical' } } , data ( ) { return { localValue : [ ] , checkedOther : false } ; } , created ( ) { } , watch : { value ( val ) { } , checkedOther ( val ) { } } , methods : { handleCheckedChange ( value ) { this . $emit ( 'change' , value) ; } , handleCheckedBoxChange ( option, checked ) { this . checkedOther = checked && option. remark === 'other' ; } }
} ;
< / script> < style scoped>
. checkbox- horizontal { display : flex; flex- direction: row; flex- wrap: wrap; gap : px;
} . checkbox- vertical { display : flex; flex- direction: column; gap : 5px;
}
< / style>