vue 自定义封装组件 使用 model 选项
2023-09-11 14:22:19 时间
自定义组件的 v-model
一个组件上的 v-model
默认会利用名为 value
的 prop 和名为 input
的事件,但是像单选框、复选框等类型的输入控件可能会将 value
特性用于不同的目的。model
选项可以用来避免这样的冲突:
Vue.component('base-checkbox', { model: { prop: 'checked', event: 'change' }, props: { checked: Boolean }, template: ` <input type="checkbox" v-bind:checked="checked" v-on:change="$emit('change', $event.target.checked)" > ` })
现在在这个组件上使用 v-model
的时候:
<base-checkbox v-model="lovingVue"></base-checkbox>
这里的 lovingVue
的值将会传入这个名为 checked
的 prop。同时当 <base-checkbox>
触发一个 change
事件并附带一个新的值的时候,这个 lovingVue
的属性将会被更新。
注意你仍然需要在组件的 props
选项里声明 checked
这个 prop。
原来的没有封装的代码:
<FormItem label="适用胸型" prop="chestShape"> <Select multiple v-model="chestShape" @on-change="changeChestShape"> <Option v-for="(item,index) in chestShapeReqList" :value="item.dictValue" :key="index" >{{ item.dictLabel }}</Option> </Select> </FormItem> <FormItem label="有无钢圈" prop="hasSteel"> <Select multiple v-model="hasSteel" @on-change="changeHasSteel"> <Option v-for="(item,index) in hasSteelReqList" :value="item.dictValue" :key="index" >{{ item.dictLabel }}</Option> </Select> </FormItem> <FormItem label="功能" prop="hasFunction"> <Select multiple v-model="hasFunction" @on-change="changwHasFunction"> <Option v-for="(item,index) in hasFunctionReqList" :value="item.dictValue" :key="index" >{{ item.dictLabel }}</Option> </Select> </FormItem> <FormItem label="压力" prop="pressure"> <Select multiple v-model="pressure" @on-change="changePressure"> <Option v-for="(item,index) in pressureReqList" :value="item.dictValue" :key="index" >{{ item.dictLabel }}</Option> </Select> </FormItem> <FormItem label="组合形式" prop="makeupType"> <Select multiple v-model="makeupType" @on-change="changeMakeupType"> <Option v-for="(item,index) in makeupTypeReqList" :value="item.dictValue" :key="index" >{{ item.dictLabel }}</Option> </Select> </FormItem>
这段代码里面的相识度很高 我们可以封装起来
子组件 :
新建文件 select/seclect.vue
<template> <FormItem :label="label" :prop="prop"> <Select :multiple="multiple" v-if="listData.length>0" :value="modelValue" @change="updateVal($event.target.value)" > <Option v-for="(item,index) in listData" :value="item.dictValue" :key="index" >{{ item.dictLabel }}</Option> </Select> </FormItem> </template> <script> export default { name: 'com-select', props: { listData: { type: Array, default: () => [] }, label:String, multiple:Boolean, prop:String, modelValue:Array, }, model: { prop: 'modelValue', event: 'selectData' }, data () { return { } }, computed: { }, methods: { updateVal(val){ this.$emit('selectData',val) } } } </script>
从官网上看到,v-model在内部为不同的输入元素使用不同的属性并抛出不同的事件:
text和textarea元素使用value属性和input事件
checkbox和radio使用checked属性和change事件
select使用value和change事件
因为自定的组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显式的去声明定义这些东西。这时,需要model选项,在定义组件的时候,指定prop的值和监听的事件。
model: { prop: 'modelValue', event: 'selectData' },
model 选项中的prop 对应 =》 :value="modelValue" 的名字
model 选项中的 event 对应的是 this.$emit('selectData',val) 的 事件名字 this.$emit('selectData',val)
props 里面 的是 通过props传递,实现父组件值绑定到子组件的属性值
父组件:
引入子组件
import SelectCom from '../../components/Select/Select'
使用组件
components: {
SelectCom
},
<SelectCom label="基础风格" :listData="productStyleList" v-model="sty" prop="style" :multiple="multiple" @selectData="styl(e)" />
productStyleList 是传递进去的数组
v-model="sty" 双向绑定的值
@selectData="styl(e)" : 触发的事件
相关文章
- (尚031)Vue_案例_自定义事件(组件间通信第2种方式:vue自定义事件)
- (尚018-第二章2.1)Vue使用vue-cli创建模板项目
- 【Vue】通过Animate.css实现第三方动画效果示例(图文+实例)
- Vue2.0 搭建Vue脚手架(vue-cli)
- vue动态加载组件
- Vue - 安装引入 WangEditor V5 富文本编辑器后控制台报错(Nuxt.js 项目同样适用):$attrs is readonly 、 $listeners is readonly
- Vue中 .env .env.development .env.production 详细说明
- vue 圆形进度条组件解析
- vue本地项目运行,同一区域网内可访问
- vue项目常用
- cordova封装一个vue应用
- Cordova结合Vue学习Camera
- Vue--名称案例,监听键盘事件@keyup--实时获取数据-----watch属性方法获取
- Vue知识点总结(21)——对象的变更检测(超级详细)
- VUE-015-解决 vue install 引发的 failed Error: not found: python2 问题
- vue-router有哪几种导航钩子?(具体怎么用的)
- vue学习笔记十:Vue中引入jquery
- ant design vue 1.7.8版本treeSelect组件坑
- vue-router4之重定向与别名
- Vue实战第1章:学习和使用vue-router
- Vue 之 插件 轮播组件 vue-awesome-swiper 的简单使用整理
- Vue 之 Toast 消息提示插件的简单封装
- 18.0 vue3 vue-router的配置
- vue造轮子,封装组件库-主要前置知识与总结
- Vue使用v-viewer插件实现图片预览和缩放和旋转等功能