Vue自定义input组件v-model绑定后修改ref无法更新UI如何解决
问题根因
- 子组件内部的
inputValue仅在初始化时赋值了一次props.value,后续父组件传入的value更新时,内部状态不会自动同步,导致父子状态不一致 clearValue仅修改了子组件内部的inputValue,没有通过emit通知父组件更新v-model绑定的值,父组件的绑定值没有变化,自然不会触发UI刷新- 输入事件触发时仅通知了父组件更新,没有同步修改子组件内部的
inputValue,也会导致内部状态和实际输入值不一致
修正方案
推荐用可写计算属性来对接v-model,不需要自己维护内部状态的同步逻辑,完整代码如下:
<template> <div> <input :id="id" type="text" :value="inputValue" @input="updateValue" /> <UiIcon type="x" @click.native="clearValue" /> </div> </template> <script lang="ts"> import { computed, defineComponent } from '@nuxtjs/composition-api'; import UiIcon from '~/components/ui/UiIcon.vue'; export default defineComponent({ name: 'UiInput', components: { UiIcon }, props: { id: { type: String, required: true, }, value: { type: String, default: '', }, }, setup(props, { emit }) { // 用可写计算属性对接v-model,自动同步父子状态 const inputValue = computed({ get: () => props.value, set: (newVal: string) => emit('input', newVal) }) const clearValue = () => { // 直接修改计算属性,自动触发父组件更新 inputValue.value = ''; }; const updateValue = (event: Event) => { inputValue.value = (event.target as HTMLInputElement).value; }; return { updateValue, clearValue, inputValue, }; }, });
调整说明
- 可写计算属性的
get始终返回父组件传入的最新值,不需要额外监听props变化就能保持状态同步 - 修改计算属性时自动触发
emit通知父组件更新v-model绑定值,父子状态始终保持一致 - 清空逻辑不需要额外修改其他变量,直接赋值计算属性即可同步更新父子状态和UI
内容的提问来源于stack exchange,提问作者Théo Lavaux
相关产品推荐
相关产品推荐

