【vue3】vue3在单个组件实例上创建多个v-model 绑定

默认情况下,组件上的 v-model 使用 modelValue 作为 propupdate:modelValue 作为事件。我们可以通过向 v-model 传递参数来修改这些名称。正因为可以修改名称,vue3支持在单个组件上,绑定多个不同名字的v-model,来看示例。

父组件index.vue

<script lang="ts">
import { ref } from "vue"
import ModelTest from './modelTest.vue'
export default {
    components:{ModelTest},
    setup(){
        const defaultName = ref("jack")
        const firstName = ref("hello")
        const lastName = ref("HELLO")
        return {
            defaultName,
            firstName,
            lastName
        }
    },
}
</script>
<template>
    <div>
        <div>{{defaultName}}</div>
        <div>{{firstName}}</div>
        <div>{{lastName}}</div>
        <ModelTest 
	        v-model="defaultName" 
	        v-model:firstName="firstName" 
	        v-model:lastName="lastName">
        </ModelTest>
    </div>
</template>

子组件,modelTest.vue

<script lang="ts">
interface Data {
  [key: string]: unknown
}

interface eventData {
    target:{
        value:string
    }
}

interface SetupContext {
  attrs: Data
  emit: (event: string, ...args: unknown[]) => void
}
export default {
    props:{
        firstName:String,
        lastName:String,
        modelValue:String,//modelValue就是不带名字的默认v-model,触发修改用emit("update:modelValue")
    },
    setup(props:Data,{emit}:SetupContext){

        const changDefaultName = (val:eventData)=>{
            //TODO
            emit("update:modelValue",val.target.value)
        }

        const changFirstName = (val:eventData)=>{
            //TODO
            emit("update:firstName",val.target.value)
        }

        const changLastName = (val:eventData)=>{
            //TODO
            emit("update:lastName",val.target.value)
        }

        return {
            changDefaultName,
            changFirstName,
            changLastName
        }
    }
}
</script>
<template>
    <div>
        <input type="text" :value="modelValue" @input="changDefaultName">
        <input type="text" :value="firstName" @input="changFirstName">
        <input type="text" :value="lastName" @input="changLastName">
    </div>
</template>

在上边的子组件中,我们在setup中使用emit触发状态改变,如果不需要在子组件做其他操作,只需要修改数据,那么可以直接在模板里触发emit

<template>
    <div>
        <input 
	        type="text" 
	        :value="modelValue" 
	        @input="$emit('update:modelValue', $event.target.value)">
        <input 
	        type="text" 
	        :value="firstName"
	        @input="$emit('update:firstName', $event.target.value)">
        <input 
	        type="text" 
	        :value="lastName" 
	        @input="$emit('update:lastName', $event.target.value)">
    </div>
</template>

有帮助的话,点个赞呗!关于vue3的一切疑问,大家可以在评论区留言提问。

上一篇:js发布-订阅模式(观察者模式)
下一篇:读vue3源码和vue3设计与实现,用Proxy实现简单的响应式

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值