defineModel踩坑

709 阅读1分钟

vue3.4前版本的组件间双向绑定

以前v-model:xxx="xxx"。父组件:

    <my-comp v-model:xxx="xxx" />

在子组件中更新需要使用

defineProps({
    xxx:{
        type:String
    }
})
emit('update:xxx',newValue)

可以更新成功

vue3.4引入的新功能defineModel

    3.4版本中引入了defineModel的方法使双向绑定更加简单
父组件依旧是:

    <my-comp v-model:xxx="xxx" />

子组件:

const xxx = defineModel('xxx',{
    type:String
})
xxx.value = '222'   //父组件同步更新

踩坑点

父组件:

<test v-model:id="id" />

<script setup lang="ts">
    const id = ref('')
</script>

子组件:

const id = defineModel('id',{
    type:String
})
const clickHanlder = ()=>{
    id.value = '222'
    console.log(id.value)   //打印的是''
}

    双向绑定了一个id,点击button的时候更新了父子组件的id值,页面显示正确,但是在子组件中修改后打印为修改前的值。这和我们期待的结果不一样啊!!

解决方法

子组件:

const id = defineModel('id',{
    type:String
})
const clickHanlder = ()=>{
    id.value = '222'
    console.log(id.value)   //打印的是''
    nextTick(()=>{
        console.log(id.value)  //打印的是'222'
    })
}

    一般遇到这种情况无非就是组件生命周期的问题,加上nextTick后正常打印,所以大概可以判断出,defineModel的执行时机是下一个update周期。问题解决。

思考

    是否有其他的解决方法,毕竟使用nextTick和原本的想法不一样,且不太美观。如果大家有更好的方法欢迎在评论区留言。有问题的地方也欢迎在评论区指出。