Vue文档-使用自定义事件的表单输入组件案例解析

本文通过一个具体的Vue自定义组件案例,介绍了如何利用自定义事件实现非表单元素的v-model双向绑定效果,包括如何设置value属性及input自定义事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看使用自定义事件的表单输入组件这一节时,最初有不少困惑,反复看了几遍之后有点点眉目。

代码如下:

Vue.component('currency-input', {
    template: `
      <span>
        $<input
            ref="input"
            v-bind:value="value"
            v-on:input="undateValue($event.target.value)"
        >
      </span>
    `,
    props: ['value'],
    methods: {
        undateValue: function (value) {
            var formattedValue = value.trim().slice(0, value.indexOf('.') === -1 ? value.length : value.indexOf('.') + 3)
            if (formattedValue !== value) {
                this.$refs.input.value = formattedValue;
            }
            this.$emit('input', Number(formattedValue))
        }
    }
})

let evt1 = new Vue({
    el: '#evt1',
    data: {
        counter: 0,
        price: 12
    }
})
   <div id="evt1">
        <currency-input v-model="price"></currency-input>
    </div>

对于这个案例来说,文档是想让我们理解,在非表单元素中如何使用v-model并实现v-model的效果。(一般来说,v-model是针对表单的)
首先讲述了v-model的原理。

<input
  v-bind:value="something"
  v-on:input="something = $event.target.value">
  // 对于一般组件而言
  <custom-input
  v-bind:value="something"
  v-on:input="something = arguments[0]">
</custom-input>

v-model只是一个语法糖,将某个变量绑定在value属性上,并且监听input事件。
非表单元素不能直接使用v-model的原因在于,不存在value属性和input事件,所以通常也没必要这么写。
但是当某个自定义组件内部包含表单元素时,可以通过自定义事件来模拟这种效果。(因为非表单元素不存在input事件,所以对于非表单元素来说,input就是自定义事件,可以通过this.emit(input)vmodelvalueinputbindon:input使使vmodelinputinputarguments[0]this.emit(‘input′)来触发)。自定义组件设置了v−model之后,给子组件传入了value属性,自身绑定了一个input自定义事件。然后子组件的表单元素中写bind和on:input,使用这两个而不直接使用v−model的原因在于,想在input时,对数据进行一些处理,比如格式化,比如触发父组件的input的事件。arguments[0]就是this.emit时,传进去的参数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值