vue系列学习(二)——自定义组件的 v-model的理解

以下摘自官网:

vue系列学习(二)——自定义组件的 v-model的理解

vue系列学习(二)——自定义组件的 v-model的理解

vue系列学习(二)——自定义组件的 v-model的理解

说实话,这段话我完全没看懂,于是讲过查相关资料,以及网上大神的解释,我终于搞明白了,所以必需记录一下

1,首先我们来看下普通的表单控件的双向绑定v-modal

<input v-model="message" placeholder="edit me">
<p>Message is: {{ message }}</p>

那么v-modal到底是如何实现双向绑定的呢?实际上,v-modal只是一个语法糖,上段代码的实际实现如下:

<input type="text" placeholder="edit me"
      :value="message" 
      @input="message=$event.target.value">
<p>Message is: {{ message }}</p>

这样就情戏多了吧?实际上v-modal做了两件事情

(1)将输入框的值绑定到message变量上,这个是单向绑定,意味着改变message变量的值可以改变input的value,但是改变value不能改变message

(2)监听input事件,当输入框输入内容就单向改变message的值,从而p标签内的message的内容就改变了

2,好了,接下来我们看官网上所说的自定义组件的v-modal,那么自定义组件想实现双向绑定,直接用v-modal是否就可以呢?例如下面这段代码:

<div id="app">
    <input-msg v-model="message"></input-msg>
    <p>{{message}}</p>
</div>

new Vue({
    el: '#app',
    data: {
         message: ''
    }
});

//自定义组件
Vue.component('input-msg', {
    template: '<input type='text'>'
});

当然,这是不生效的 ,v-modal没有如此大的穿透力,可以进行父子组件的双向绑定

那么以我们的正常思路,想要实现父子组件的双向绑定,改如何实现呢?直接看代码:

<div id="">
    <inputapp-msg :value="message" @input="onInput"></input-msg>
    <p>{{message}}</p>
</div>

var app = new Vue({
     el: '#app',
     data: {
         message: ''
     },
     methods: {
          onInput: function(val) {
               this.message= val;
          }
      }
 });

//子组件
Vue.component('input-msg', {
    // 2,input监听,当value改变时,触发updateVal事件
    template: '<input :value="value" @input="updateVal($event.target.value)" type="text">',
    // 1,父组件的value值通过props传递给子组件
    props: ["value"],
    methods: {
         updateVal: function(val) {
            // 3,手动触发父组件的input事件并将值传给父组件
            this.$emit('input', val);
         }
     }
});

这样就实现了父子组件的动态绑定,显然这样写起来比较麻烦,那么就来使用自定义组件的v-modal语法糖吧 

<div id="app">
    <input-msg v-model="message"></input-msg>
    <p>{{message}}</p>
</div>

var app = new Vue({
     el: '#app',
     data: {
         message: ''
     }
 });

//子组件
Vue.component('price-input', {
   model: {
      prop: 'value',
      event: 'input'
    },
    props: ["value"],

    template: `<input :value="value" @input="$emit('input', $event.target.value)" 
               type="text">`

});

 这样就可以了,是不是简洁了很多?这就是自定义组件v-modal的用法,主要是子组件中需要定义modal:{},这个是关键。

 

上一篇:vue3.0 传送门teleport


下一篇:理解vue中less的scoped和/deep/工作原理