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

Vue3中v-model绑定函数报错如何实现?可行解决方案

问题原因

v-model 是 Vue 的双向绑定语法糖,实际等价于同时绑定 :value 属性和监听 @input 事件,要求绑定的值必须是可被赋值的变量/成员表达式,直接传入函数返回值属于只读表达式,无法完成回写逻辑,因此编译器会抛出对应错误。

实现方案

方案1:使用计算属性的 get/set 实现(推荐)

通过计算属性的 getter 处理输出值,setter 处理输入回写逻辑,完全符合 v-model 的绑定要求:

<template>
  <input v-model="helloText">
</template>

<script>
export default{
  data() {
    return {
      name: 'Jhon'
    }
  },
  computed: {
    helloText: {
      get() {
        return `Hello ${this.name}`
      },
      set(inputValue) {
        // 可自定义回写逻辑,示例为去掉输入内容的Hello前缀后赋值给name
        this.name = inputValue.replace(/^Hello /, '')
      }
    }
  }
}
</script>

方案2:手动拆分v-model语法糖

不使用v-model语法糖,分别绑定值和输入事件,适合简单的临时处理场景,可直接复用原有方法:

<template>
  <input :value="sayHello(name)" @input="handleInput">
</template>

<script>
export default{
  data() {
    return {
      name: 'Jhon'
    }
  },
  methods:{
    sayHello(name){
      return "Hello "+ name
    },
    handleInput(e) {
      const inputValue = e.target.value
      // 自定义输入处理逻辑
      this.name = inputValue.replace(/^Hello /, '')
    }
  }
}
</script>

补充:Vue3 组合式API写法示例

<template>
  <input v-model="helloText">
</template>

<script setup>
import { ref, computed } from 'vue'

const name = ref('Jhon')
const helloText = computed({
  get: () => `Hello ${name.value}`,
  set: (inputValue) => {
    name.value = inputValue.replace(/^Hello /, '')
  }
})
</script>

内容的提问来源于stack exchange,提问作者Jip Helsen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:27:00