【小白读vue官方文档】vue给自定义组件设置v-model

【小白读vue官方文档】vue给自定义组件设置v-model

众所周知v-model是一个语法糖,通过v-bind实现父组件向子组件传指,通过$emit实现子组件向父组件传指,这样就完成了双向数据绑定。

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

如果是原生的html元素,实例对象上有默认的value和input属性,v-model很自然地就把value和input拿来用:把v-model="lovingVue"中的lovingVue通过v-bind绑定给value,并通过监听input事件修改父组件的值。而在自定义组件中,我们可以自己定义属性来替代value和input的角色。

官方的文档给出的案例大致如下:
我在官方文档的用例上做了一点修改,通过子组件的model属性,将绑定的props(属性)指向自定义的属性myChecked, 将监听的事件指向自定义的事件myChange。

    <div id="app">
        <base-checkbox v-model="lovingVue"></base-checkbox>
        <p>{{lovingVue}}</p>
    </div>
    <script>
        Vue.component('base-checkbox', {
            model: {
                prop: 'myChecked',
                event: 'myChange'
            },
            props: {
                myChecked: Boolean
            },
            template: `
    <input
      type="checkbox"
      v-bind:checked="myChecked"
      v-on:change="$emit('myChange', $event.target.checked)"
    >
  `
        })
        var vm = new Vue({
            el:'#app',
            data:{
                lovingVue:true
            },
            // methods:{
            //     handleChange(v){
            //         console.log(v)
            //         this.lovingVue = v
            //     }
            // }
        })
    </script>

为了更好地理解这一过程,我们把v-model的语法糖拆解,换成v-bind和v-on来表达:

    <div id="app">
        <base-checkbox :my-checked="lovingVue" @my-change="(v)=>{this.lovingVue=v}"></base-checkbox>
        <p>{{lovingVue}}</p>
    </div>
    <script>
        Vue.component('base-checkbox', {
            // model: {
            //     prop: 'myChecked',
            //     event: 'myChange'
            // },
            props: {
                myChecked: Boolean
            },
            template: `
    <input
      type="checkbox"
      v-bind:checked="myChecked"
      v-on:change="$emit('my-change', $event.target.checked)"
    >
  `
        })
        var vm = new Vue({
            el:'#app',
            data:{
                lovingVue:true
            },
            // methods:{
            //     handleChange(v){
            //         console.log(v)
            //         this.lovingVue = v
            //     }
            // }
        })
    </script>
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值