You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:09:04