vue3以及vue2自定义封装v-model

在v2的时候,默认的prop字段是value,emit触发的名称是input,对于其他非输入框的例如checkbox的prop应该是checked,emit触发的名称应该是change。这些prop跟emit对应的用于原生组件使用。v3则由默认的value改成modelValue,并且emit触发的名称由input改成update。并且允许加上修饰符(绑定自己定义的属性名称),例如:emit(‘update:values’, e);因此v3可以绑定多个属性为双向绑定。

v2通过 原生组件@input事件得到的是组件事件对象event,需要通过event,需要通过eventevent.target.value来获取值,而v3则是直接得到组件绑定值。

下面是通过v3,ts实现v-model双向绑定测试代码

<script setup lang="ts">
interface Props {
  values?: string
}
const props = withDefaults(defineProps<Props>(), {
  values: () => '',
});
type Emit = {
  (e: 'update:values', value: string): void,
}
const emit = defineEmits<Emit>();
const inputEvent = (e) => {
  emit('update:values', e);
};
const inputEvent2 = (e) => {
/*
如果是v2写法应该是emit('input', e.target.value) //未测试,而父组件v-model后面就不需要属性修饰符了。
**/
  emit('update:values', e.target.value);
};
/**
 * 父组件使用
 * <ModelTest v-model:values="ipCount"/>
 * ipCount是父组件传给子组件的对象变量。
 * v3通过 :model-value方式绑定传入的prop值,并通过相关事件的emit往父组件传回值。
 * v2通过 :value方式绑定输入的prop值,并通过相关事件的emit往父组件传回绑定的$event.target.value值
 */
</script>
<template>
  <ElInput :model-value="props.values" @input="inputEvent" />
  <input :value="props.values" @input="inputEvent2" >
</template>

目前测试代码中两个输入框可同时实现双向数据绑定。但总感觉还有地方没理解到位。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值