使用 vue3-tel-input电话组件时,为什么通过v-model绑定的默认值无效而 通过:value绑定有效?

问题: 使用第三方 vue3-tel-input电话组件时,通过v-model绑定具有初始值的电话变量,但input框内显示的初始值为空?
排查过程

  • v-model绑定改为 :value绑定后,电话变量初始值竟然能够显示
  • vue3-tel-input组件上绑定有自定义的 input 事件
  • vue3-tel-input组件的子组件,暴露了 value属性和
    e m i t ( ′ i n p u t ′ , v a l u e , t h i s . p h o n e O b j e c t , t h i s . emit('input', value, this.phoneObject, this. emit(input,value,this.phoneObject,this.refs.input) 的触发事件,
    以触发父类通过 @input绑定的方法逻辑。
  • 查看 vue3-tel-input子组件源码,并没有定义 modelValue属性和 @update:modelValue触发事件。
知识点解析:
  • v-model 为vue语法糖,绑定在 <input>组件上编译后的等价展开不同。
    • 绑定在<input>元素,编译后,为 :value@input的组合。@input提供了默认实现。
    • 绑定在组件上,编译后,为 :modelValue@update:modelValue事件。@update:modelValue提供了默认实现。
********************绑定在<input>上*************************
编译前: 
<input v-model="formModel.phoneNumber" />
编译后:
<input
  :value="formModel.phoneNumber"
  @input="formModel.phoneNumber = $event.target.value"
/>
********************绑定在组件上*************************
编译前: 
<vue-tel-input v-model="value">
编译后:
<vue-tel-input
  :modelValue="formModel.phoneNumber"
  @update:modelValue="newValue => formModel.phoneNumber = newValue"
/>
  • 属性绑定的变量,值只会单向传递,例如通过 :value:modelValue,如果没有额外的触发事件,即子组件中值的变化不会影响到父组件通过 :value:modelValue绑定变量的值。

解决方案

  • 方案一: 使用v-model绑定。优点在于简单,通过默认的input触发事件可以实现双向数据绑定,也可以自定义input事件;
    缺点在于,vue3-tel-input子组件内没有modelValue属性,没有默认实现默认值渲染。适合于没有默认值的场景
  • 方案二: 通过 :value 和自定义 input事件进行变量绑定和数据更新操作逻辑。由于组件内已经暴露 value属性,所以能够实现默认值渲染,也可以自定义input事件逻辑,灵活性高,适合有默认值的场景

拓展
封装组件,v-model绑定变量,通过在子组件中,暴露 modelValue属性和 update:modelValue触发事件实现双向数据绑定。

-----------------父组件-------------------------
<script setup>
import {reactive} from "vue";
import SonItem from "@/views/SonItem.vue";
let formModel = reactive({
  value: 'Hello World'
})
</script>
<template>
  <div class="about">
    <h4>Parent {{formModel.value}}</h4>
    <SonItem v-model="formModel.value"></SonItem>
  </div>
</template>

-----------------子组件-------------------------
<template>
  <input type="text" :value="props.modelValue" @input="$emit('update:modelValue', $event.target.value)">
</template>

<script setup>
let props = defineProps({
  modelValue:{
    type: String
  }
});
</script>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue.js 2.0 中,`v-model` 是一个非常强大的指令,用于实现数据绑定和表单输入的双向数据同步。自定义组件使用 `v-model` 可以让你的用户输入自动更新组件的内部状态,并反之亦然。 以下是一个简单的自定义组件(例如一个名为 `CustomInput` 的输入框组件)的 `v-model` 示例: ```html <template> <div> <input type="text" v-model="inputValue"> <p>你输入的是: {{ inputValue }}</p> </div> </template> <script> export default { data() { return { inputValue: '', }; }, }; </script> ``` 在这个例子中: - `<input type="text" v-model="inputValue">`:将输入框的值绑定到 `inputValue` 数据属性上,用户在输入框中修改的任何内容都会实更新 `inputValue`。 - `<p>你输入的是: {{ inputValue }}</p>`:当 `inputValue` 发生变化,对应的文本也会根据新的值显示。 如果你在父组件使用这个自定义组件: ```html <template> <div> <custom-input></custom-input> </div> </template> <script> import CustomInput from './CustomInput.vue'; export default { components: { CustomInput, }, }; </script> ``` 并且希望父组件的数据影响子组件,你可以在父组件的数据中设置默认值并传递给子组件: ```html <template> <div> <custom-input :value="parentValue"></custom-input> </div> </template> <script> export default { data() { return { parentValue: '初始值', }; }, components: { CustomInput: { props: ['value'], // 定义接收父组件传入的值 data() { return { inputValue: this.value, // 在子组件中设置默认值 }; }, }, }, }; </script> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值