20250407-组件v-model

基本用法

v-model 可以在组件上使用以实现双向绑定。

首先看下 v-model 在原生元素上的用法:

html 复制代码
<input v-model="searchText" />

在代码背后,模板编译器会对 v-model 进行更冗长的等价展开。因此上面的代码其实等价于下面这段:

html 复制代码
<input
  :value="searchText"
  @input="searchText = $event.target.value"
/>

而当使用在一个组件上时,v-model 会被展开为如下的形式:

html 复制代码
<CustomInput
  :model-value="searchText"
  @update:model-value="newValue => searchText = newValue"
/>

要让这个例子实际工作起来,<CustomInput>组件内部需要做两件事:

1、将内部原生<input>元素的 value attribute 绑定到 modelValue prop。

2、当原生的 input 事件触发时,触发一个携带了新值的 update:modelValue 自定义事件。

html 复制代码
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue']
}
</script>

<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>

子类代码:

html 复制代码
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue']
}
</script>

<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  />
</template>

父类代码:

html 复制代码
<script>
import CustomInput from './CustomInput.vue'

export default {
  components: { CustomInput },
  data() {
    return {
      message: 'hello'
    }
  }
}
</script>

<template>
  <CustomInput v-model="message" /> {{ message }}
</template>

另一种在组件内实现 v-model 的方式是使用一个可写的,同时具有 getter 和 setter 的 computed 属性。get 方法需返回 modelValue prop,而 set 方法需触发相应的事件:

html 复制代码
<!-- CustomInput.vue -->
<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  computed: {
    value: {
      get() {
        return this.modelValue
      },
      set(value) {
        this.$emit('update:modelValue', value)
      }
    }
  }
}
</script>

<template>
  <input v-model="value" />
</template>
相关推荐
拖孩4 分钟前
微信群太多,管理麻烦?那试试接入AI助手吧~
前端·后端·微信
一切顺势而行7 分钟前
kafka总结
java
乌兰麦朵20 分钟前
Vue吹的颅内高潮,全靠选择性失明和 .value 的PUA!
前端·vue.js
Code季风21 分钟前
Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)
前端·微服务·架构·go·gin
蓝倾21 分钟前
如何使用API接口实现淘宝商品上下架监控?
前端·后端·api
舂春儿23 分钟前
如何快速统计项目代码行数
前端·后端
毛茸茸23 分钟前
⚡ 从浏览器到编辑器只需1秒,这个React定位工具改变了我的开发方式
前端
Pedantic23 分钟前
我们什么时候应该使用协议继承?——Swift 协议继承的应用与思
前端·后端
Software攻城狮24 分钟前
vite打包的简单配置
前端
Codebee24 分钟前
如何利用OneCode注解驱动,快速训练一个私有的AI代码助手
前端·后端·面试