vue自定义组件v-model

自定义组件使用v-model

vue中的v-model指令实现了表单的双向绑定,这是官网的一个栗子:

<input type="text" v-model="message">
<p>{{message}}</p>
// v-model只是语法糖,真正的实现形式:
<input type="text" :value="message" @input="message = $event.target.value">
  • 将输入框的值绑定到message变量上,这只是单向的,改变message的值可以改变input的value,但是改变input的输入不会改变message。
  • 监听input事件,当输入类内容时改变message变量,从而实现了双向绑定。
// HTML部分
<div id="app">
    // 4.父组件的value值绑定到price
    <price-input :value="price" @input="onInput"></price-input>
</div>
// js部分
Vue.component('custom-input',{
    // 1.监听input,输入时触发自定义组件内部的updateVal事件
    template: `<input :value='value' @input='updateVal($event.target.value)' type='text'></input>`,
    // 5.通过props传递,实现父组件值绑定到输入框的value
    props: ['value'],
    methods: {
        // 2.触发父组件上的input事件
        updateVal(val){
            this.$emit('input', val);
        }
    }
});
 
var app = new Vue({
    el: '#app',
    data(){
        price: ''
    },
    methods: {
        // 3.传递过来的值赋给父组件的price变量,实现了输入框到父元素的单向绑定
        onInput(val){
            this.price = val;
        }
    }
})

通过上面的分析,默认情况下,一个组件上的 v-model 会把 value 用作 prop 且把 input 用作 event。所以当我们在一个自定义组件上使用v-model并不能实现双向绑定,因为自定的组件并没有默认的value和input事件,在使用时,我们需要按照上面那样显式的去声明定义这些东西。这时,model选项就派上用场了,在定义组件的时候,指定prop的值和监听的事件。

<template>
    <input type="text" :value="uname" @input="updateVal($event.target.value)">
</template>
Vue.component('my-input',{
    model: {
        prop: 'uname',
        // 随便命名事件,对应下面$emit即可
        event: 'changeXXX'
    },
    props: {
        uname: {
            type: String,
            default: 'tom'
        }
    },
    methods: {
        updateVal(val){
            this.$emit('changeXXX',val)
        }
    }
})

父组件内使用时,使用v-model就可以啦

// name是父组件中的属性
<my-input v-model="name" value="some value"></my-input>
<p>{{name}}</p>
// 等价于
<my-input :uname='name' @changeXXX='val => {foo = val}' value='some value'></my-input>

版权声明:本文为CSDN博主「Liu_Jun_Tao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Liu_Jun_Tao/article/details/90232658

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值