vue3.0 实现自定义组件v-model

文章介绍了在Vue中如何使用v-model进行双向数据绑定,以及在封装通用输入表单组件时,如何通过prop和emit实现父子组件间的数据传递。示例展示了在子组件inputModel.vue中接收并更新父组件传递的modelValue属性。

这是我面试的时候遇到的一个机试题目。

在vue中我们通常form 表单输入可以通过 v-model 实现双向数据绑定例如:


<template>
    <input v-model="conut" />
    {{conut}}
</template>

<script lang='ts' setup>
    import {ref} from 'vue';
    const conut=ref(1)
</script>

在表单中输入时,页面展示的 conut 也会跟着相应改变

如果是封装的通用输入表单组件,一般会使用 prop+emit 来实现父子组件数据传递

例如:封装一个数字输入框组件

组件

index.vue

<template>
    <InputModel v-model="conut"></InputModel>
</template>

<script lang='ts' setup>
    import InputModel from "@/components/InputModel.vue";
    import {ref} from 'vue';
    const conut=ref(1)
</script>

直接引用子组件添加v-model关键字

子组件

inputModel.vue

<template>
  name:<input :value="modelValue" @input="inputValue">
</template>
<script setup lang='ts'>
    import {defineProps,defineEmits} from 'vue';
    //使用defineProps 接收父组件v-model的值
    const props=defineProps(['modelValue'])
    // 通过引入defineEmits()Api把值传给父组件
    const emit=defineEmits(['Update:modelValue'])
    const inputValue=(e)=>{
          const value=e.target.value;
          emit('Update:modelValue',value)
    }
</script>
<style scoped lang='scss'>

</style>
Vue 2.0中,使用v-model组件上相当于传递了value属性,并触发了input事件。例如: ``` <search-input v-model="searchValue"></search-input> ``` 相当于: ``` <search-input :value="searchValue" @input="searchValue=$event"></search-input> ``` 而在Vue 3.0中,v-model的默认属性变成了modelValue。例如: ``` <v-child v-model="numm"></v-child> ``` 等同于: ``` <v-child :modelValue="numm" @input="(e) => (numm = e.target.value)"></v-child> ``` 需要注意的是,Vue 3.0中的v-model可以在同一个组件上同时设置多个。另外,开发者也可以自定义v-model的修饰符。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Vue3.0Vue2.0的v-model的使用区别](https://blog.csdn.net/weixin_42555053/article/details/115453582)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [Vue2.0Vue3.0分别使用v-model封装组件[Vue必会]](https://blog.csdn.net/qq_43291759/article/details/118279953)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值