[转] vue 自定义组件使用v-model

匿名 (未验证) 提交于 2019-12-02 23:55:01

<input v-model="something">

v-model指令其实是下面的语法糖包装而成:

<input   :value="something"   @:input="something = $event.target.value">

在一个组件上使用 v-model 时,会简化为:

<custom-input   :value="something"   @input="value => { something = value }"> </custom-input>

v-model

  • value
  • input

利用 $emit 触发 input 事件:

this.$emit('input', value);

组件1:

Vue.component('my-component', {   template: `<div>   <input type="text" :value="currentValue" @input="handleInput"/>   </div>`,   computed:{     currentValue:function () {       return this.value     }   },   props: ['value'], //接收一个 value prop   methods: {     handleInput(event) {       var value = event.target.value;       this.$emit('input', value); //触发 input 事件,并传入新值     }   } });    
上面是将prop属性绑定到data里,以便修改 prop 数据(Vue不允许直接修改prop属性的值)#查看原理#

组件2:

Vue.component("my-counter", {   template: `<div>   <h1>{{value}}</h1>   <button @click="plus">+</button>   <button @click="minu">-</button>   </div>`,   props: {     value: Number //接收一个 value prop   },   data: function() {     return {       val: this.value     }   },   methods: {     plus() {       this.val = this.val + 1       this.$emit('input', this.val) //触发 input 事件,并传入新值     },     minu() {       if(this.val>0){         this.val = this.val-1         this.$emit('input', this.val) //触发 input 事件,并传入新值       }     }   } });

<input v-model="something">

v-model指令其实是下面的语法糖包装而成:

<input   :value="something"   @:input="something = $event.target.value">

在一个组件上使用 v-model 时,会简化为:

<custom-input   :value="something"   @input="value => { something = value }"> </custom-input>

v-model

  • value
  • input

利用 $emit 触发 input 事件:

this.$emit('input', value);

组件1:

Vue.component('my-component', {   template: `<div>   <input type="text" :value="currentValue" @input="handleInput"/>   </div>`,   computed:{     currentValue:function () {       return this.value     }   },   props: ['value'], //接收一个 value prop   methods: {     handleInput(event) {       var value = event.target.value;       this.$emit('input', value); //触发 input 事件,并传入新值     }   } });    
上面是将prop属性绑定到data里,以便修改 prop 数据(Vue不允许直接修改prop属性的值)#查看原理#

组件2:

Vue.component("my-counter", {   template: `<div>   <h1>{{value}}</h1>   <button @click="plus">+</button>   <button @click="minu">-</button>   </div>`,   props: {     value: Number //接收一个 value prop   },   data: function() {     return {       val: this.value     }   },   methods: {     plus() {       this.val = this.val + 1       this.$emit('input', this.val) //触发 input 事件,并传入新值     },     minu() {       if(this.val>0){         this.val = this.val-1         this.$emit('input', this.val) //触发 input 事件,并传入新值       }     }   } });
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!