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

Nuxt 3中Element Plus自定义Input组件的v-model实现方案

Nuxt3 + Element Plus 自定义Input组件v-model失效问题

我在Nuxt3中基于Element Plus搭建自定义Input组件时,遇到了v-model绑定失效的问题。参照Vue3的v-model规则编写了代码,但无法正常工作,以下是我的代码:

父组件代码

<template>
  <Input :modelValue="inputname" @update:modelValue="inputname=$event"/>
</template>
<script setup>
const inputname = ref("");
</script>

子组件代码

<template>
  <el-form-item prop="name">
    <el-input type="text" v-model="props.modelValue" @input="$emit('update:modelValue', $event)"/>
  </el-form-item>
</template>
<script setup>
defineEmits(["update:modelValue"]);
const props = defineProps({
  modelValue: {
    type: String,
    required: false,
    default: "",
  },
});
</script>

我需要一个简洁可靠的v-model实现方案,同时想知道是否必须用modelValue作为prop名称,还是可以自定义命名。


解决方案

1. 修复子组件核心问题

你的代码失效原因是直接对只读的props使用v-model,Vue规定props不可直接修改。正确做法是在子组件内部声明本地变量,同步props值后再通过emit更新父组件状态:

修正后的子组件代码

<template>
  <el-form-item prop="name">
    <el-input type="text" v-model="localValue" @input="$emit('update:modelValue', localValue)"/>
  </el-form-item>
</template>
<script setup>
const emit = defineEmits(["update:modelValue"]);
const props = defineProps({
  modelValue: {
    type: String,
    required: false,
    default: "",
  },
});

// 声明本地变量同步props初始值
const localValue = ref(props.modelValue);

// 监听props变化,同步到本地变量
watch(props, (newProps) => {
  localValue.value = newProps.modelValue;
}, { immediate: true });
</script>

2. 简化父组件写法

父组件无需手动拆解modelValue和update:modelValue,直接使用Vue3的v-model语法即可:

简化后的父组件代码

<template>
  <Input v-model="inputname" />
</template>
<script setup>
const inputname = ref("");
</script>

3. 自定义v-model的prop名称

不需要强制使用modelValue,可以自定义prop和对应的emit事件名称。比如将prop命名为username:

子组件(自定义prop)

<template>
  <el-form-item prop="name">
    <el-input type="text" v-model="localValue" @input="$emit('update:username', localValue)"/>
  </el-form-item>
</template>
<script setup>
const emit = defineEmits(["update:username"]);
const props = defineProps({
  username: {
    type: String,
    required: false,
    default: "",
  },
});

const localValue = ref(props.username);

watch(props, (newProps) => {
  localValue.value = newProps.username;
}, { immediate: true });
</script>

父组件调用(对应自定义prop)

<template>
  <Input v-model:username="inputname" />
</template>
<script setup>
const inputname = ref("");
</script>

内容的提问来源于stack exchange,提问作者Kishan Bhensadadiya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:46:01