自定义组件的 v-model

一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的model 选项可以用来避免这样的冲突:

  1. Vue.component('base-checkbox', {
  2. model: {
  3. prop: 'checked',
  4. event: 'change'
  5. },
  6. props: {
  7. checked: Boolean
  8. },
  9. template: `
  10. <input
  11. type="checkbox"
  12. v-bind:checked="checked"
  13. v-on:change="$emit('change', $event.target.checked)"
  14. >
  15. `
  16. })

现在在这个组件上使用 v-model 的时候:

  1. <base-checkbox v-model="lovingVue"></base-checkbox>

这里的 lovingVue 的值将会传入这个名为 checked 的 prop。同时当 <base-checkbox> 触发一个 change 事件并附带一个新的值的时候,这个 lovingVue 的属性将会被更新。

注意你仍然需要在组件的 props 选项里声明 checked 这个 prop。

原来的没有封装的代码:

  1. <FormItem label="适用胸型" prop="chestShape">
  2. <Select multiple v-model="chestShape" @on-change="changeChestShape">
  3. <Option
  4. v-for="(item,index) in chestShapeReqList"
  5. :value="item.dictValue"
  6. :key="index"
  7. >{{ item.dictLabel }}</Option>
  8. </Select>
  9. </FormItem>
  10.  
  11. <FormItem label="有无钢圈" prop="hasSteel">
  12. <Select multiple v-model="hasSteel" @on-change="changeHasSteel">
  13. <Option
  14. v-for="(item,index) in hasSteelReqList"
  15. :value="item.dictValue"
  16. :key="index"
  17. >{{ item.dictLabel }}</Option>
  18. </Select>
  19. </FormItem>
  20.  
  21. <FormItem label="功能" prop="hasFunction">
  22. <Select multiple v-model="hasFunction" @on-change="changwHasFunction">
  23. <Option
  24. v-for="(item,index) in hasFunctionReqList"
  25. :value="item.dictValue"
  26. :key="index"
  27. >{{ item.dictLabel }}</Option>
  28. </Select>
  29. </FormItem>
  30.  
  31. <FormItem label="压力" prop="pressure">
  32. <Select multiple v-model="pressure" @on-change="changePressure">
  33. <Option
  34. v-for="(item,index) in pressureReqList"
  35. :value="item.dictValue"
  36. :key="index"
  37. >{{ item.dictLabel }}</Option>
  38. </Select>
  39. </FormItem>
  40.  
  41. <FormItem label="组合形式" prop="makeupType">
  42. <Select multiple v-model="makeupType" @on-change="changeMakeupType">
  43. <Option
  44. v-for="(item,index) in makeupTypeReqList"
  45. :value="item.dictValue"
  46. :key="index"
  47. >{{ item.dictLabel }}</Option>
  48. </Select>
  49. </FormItem>

这段代码里面的相识度很高  我们可以封装起来

子组件 :

新建文件  select/seclect.vue

  1. <template>
  2. <FormItem :label="label" :prop="prop">
  3. <Select :multiple="multiple" v-if="listData.length>0" :value="modelValue" @change="updateVal($event.target.value)" >
  4. <Option
  5. v-for="(item,index) in listData"
  6. :value="item.dictValue"
  7. :key="index"
  8. >{{ item.dictLabel }}</Option>
  9. </Select>
  10. </FormItem>
  11. </template>
  12. <script>
  13. export default {
  14. name: 'com-select',
  15. props: {
  16. listData: {
  17. type: Array,
  18. default: () => []
  19. },
  20. label:String,
  21. multiple:Boolean,
  22. prop:String,
  23. modelValue:Array,
  24. },
  25. model: {
  26. prop: 'modelValue',
  27. event: 'selectData'
  28. },
  29. data () {
  30. return {
  31.  
  32. }
  33. },
  34. computed: {
  35.  
  36. },
  37. methods: {
  38. updateVal(val){
  39. this.$emit('selectData',val)
  40. }
  41.  
  42. }
  43. }
  44. </script>

从官网上看到,v-model在内部为不同的输入元素使用不同的属性并抛出不同的事件:

text和textarea元素使用value属性和input事件

checkbox和radio使用checked属性和change事件

select使用value和change事件

因为自定的组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显式的去声明定义这些东西。这时,需要model选项,在定义组件的时候,指定prop的值和监听的事件。

  1. model: {
  2. prop: 'modelValue',
  3. event: 'selectData'
  4. },

model 选项中的prop   对应 =》   :value="modelValue"  的名字

model 选项中的   event   对应的是    this.$emit('selectData',val)  的  事件名字   this.$emit('selectData',val)

props  里面 的是   通过props传递,实现父组件值绑定到子组件的属性值
 
 

父组件:

引入子组件

  1. import SelectCom from '../../components/Select/Select'

使用组件

  1. components: {
  2. SelectCom
  3. },
  1. <SelectCom label="基础风格" :listData="productStyleList" v-model="sty" prop="style" :multiple="multiple" @selectData="styl(e)" />
  1. productStyleList 是传递进去的数组
  1. v-model="sty" 双向绑定的值
  1. @selectData="styl(e)" 触发的事件
  1.  

vue 自定义封装组件 使用 model 选项的更多相关文章

  1. vue自定义全局组件(自定义插件)

    有时候我们在做开发的时候,就想自己写一个插件然后就可以使用自己的插件,那种成就感很强.博主最近研究element-ui和axios的时候,发现他们是自定义组件,但是唯一有一点不同的是,在用elemen ...

  2. vue 自定义报警组件

    1.自定义报警组件 Alarm.vue <!-- 报警 组件 --> <template> <div class="alarm"> <!- ...

  3. vue自定义select组件

    1.目的 看了很多element-ui的源码,决定自己实现一个简单的select组件,遇到的几个难点,便记录下来. 2.难点一 element-ui中的select组件通过v-model可以绑定数据, ...

  4. vue 自定义分页组件

    vue2.5自定义分页组件,可设置每页显示条数,带跳转框直接跳转到相应页面 Pagination.vue 效果如下图: all: small(只显示数字和上一页和下一页): html <temp ...

  5. Vue自定义日历组件

    今天给大家介绍Vue的日历组件,可自定义样式.日历类型及支持扩展,可自定义事件回调.Props数据传输. 线上demo效果 示例 Template: <Calendar :sundayStart ...

  6. vue自定义分页组件---切图网

    vue2.5自定义分页组件 Pagination.vue,可设置每页显示条数,带跳转框直接跳转到相应页面,亲测有用.目前很多框架自带有分页组件比如elementUI,不过在面对一个拿到PSD稿,然后重 ...

  7. vue自定义日期组件

    vue-datepicker 基于 vuejs 2.x 可自定义主题的日期组件 github Usage 只需要在项目中加入 calendar.vue,就可以使用了. 向组件传入 prop 即可改变 ...

  8. vue 自定义image组件

    介绍 1:当图片加载失败时,给出错误提示. 2:当图片加载中时,给出加载提示. 3:图片处理模式:等比缩放/裁剪/填充/... 1.图片加载状态处理 通过给图片绑定load事件与error事件处理函数 ...

  9. Vue 自定义事件 && 组件通信

    1 App.vue 2 <template> 3 <!-- 4 组件的自定义事件: 5 1.一种组件间通信的方式,使用于:子组件===>父组件 6 2.使用场景:A是父组件,B ...

随机推荐

  1. lunwenzhunbei

    1,android sensors introduction http://developer.android.com/guide/topics/sensors/sensors_overview.ht ...

  2. Android单行跑马灯效果实现

    参考网址:https://www.jianshu.com/p/e6c1b825d322 起初,使用了如下XML布局: <TextView android:id="@+id/tv_per ...

  3. 【初识TypeScript】 配置环境后运行Hello World编译报错.

    第一次接触TypeScript,配置好环境后, 发现连编写个最基本的Hello World都报错,代码如下: const hello:string = "Hello World!" ...

  4. centos修改时区,同步时间

    查看当前系统时区 ls -la /etc/localtime 查看支持的时区 timedatectl list-timezones # 查看所有时区 timedatectl list-timezone ...

  5. C++中的通用结构定义,及相应的序列化、反序列化接口

    一个通用的C++结构定义如下: typedef struct tagCommonStruct { long len; void* buff; }CommonStruct_st; 此接口对应的普通序列化 ...

  6. C#实体类生成Create Table SQL

    using System; using System.Collections.Generic; using System.Text; using System.Reflection; namespac ...

  7. vue复合组件----注册表单

    <!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. assert 与if

    strlen的实现用不用加断言(assert)? http://en.cppreference.com/w/cpp/error/assert 自己写strlen实现会加assert判断空指针,Debu ...

  9. 【BASIS系列】SAP 中查看account登陆次数及时间的情况

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[BASIS系列]SAP 中查看account登 ...

  10. CTF夺旗赛丨网络内生安全试验场第四季圣诞赛明日开赛!

    期待许久的圣诞狂欢就要来喽 <Jingle bell>欢快的旋律 在耳边翩翩起舞 白胡子老爷爷骑着麋鹿准时来送礼物 2019圣诞节 i 春秋做你的圣诞老人 参加CTF欢乐圣诞赛 你提交答案 ...