vue 自定义组件 v-model

平时在开发项目写组件时,父子组件间相互传值,父组件传递过去的值通过props,遵循单向数据流规则,子组件不可修改父组件传递过来的值,如需修改需要使用this.$emit('自定义属性', this.XXX),类似这种情况可以使用 v-model 更为合适

平时我们使用 v-model 一般用在 input 标签上

1  <input v-model= 'content' ></input>
2  
3  export default{
4        data(){
5             return {
6                  content: ' '
7             }
8        }
9  }

等价于

 1 <input v-bind:value='content' v-on:input='content = $event.target.value' ></input>             

用在组件上类似于

1 Vue.component( 'base-input' , {
2        props: ['value'],
3        template:` <input v-bind:value = 'value'  v-on:input = "$emit( 'input', $emit.target.value )" ></input> `
4 })

一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件

所以当我们把 v-model 用在自定义组件上时

 1 父组件:
 2 <Child  v-model = 'flag' ></Child>
 3 export default {
 4      data(){
 5         return {
 6             flag: true
 7         }
 8     }
 9 }
10 
11 子组件:
12 <button @click = "$emit( 'input',!value )" ></button>
13 export default {
14      props: {
15          value: Boolean
16      }
17 }

父组件使用 v-model 绑定在data中定义的属性 flag 传递给子组件(Child),子组件通过 props 接收,名为 value ,通过按钮触发对父组件中 flag 进行修改 ( $emit( 'input',!value ) )

 

通过在model属性中自定义事件:

如果遇到单选框、复选框等类型的输入控件可能会将 value attribute 用于不同的目的,model 选项可以用来避免这样的冲突:

 1 父组件:
 2  <Child  v-model = ‘flag’></Child>
 3 export default {
 4         data() {
 5               return { 
 6                    flag:true
 7               }
 8         }
 9 }
10 
11 子组件:
12 <button @click = " $emit('aliasFlag', !flag)"></button>
13 export default {
14          props:{
15                 flag: Boolean
16           },
17          model:{
18                 prop: 'flag',
19                 event: 'aliasFlag'
20          }
21 }

通过使用 model 里的 event 方法自定义属性名,prop代表和props里的变量相对应

 

posted @ 2022-03-29 16:17  Naynehcs  阅读(4626)  评论(1编辑  收藏  举报