vue3的v-model

基本用法

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

从 Vue 3.4 开始,推荐的实现方式是使用defineModel()宏:

vue 复制代码
<script setup>
const model = defineModel()
</script>

<template>
  <span>My input</span> <input v-model="model">
</template>

在子组件中使用defineModel声明一个model变量,在模板中使用v-model绑定这个变量

vue 复制代码
// App.vue
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'

const msg = ref('Hello World!')
</script>

<template>
  <h1>{{ msg }}</h1>
  <Child v-model="msg" />
</template>

在父组件声明一个响应变量msg,再用v-model绑定msg,这样msg的值传给了子组件

效果:在子组件中修改model的值,父组件的msg也随之变化。

底层原理

vue 复制代码
<script setup>
const model = defineModel()
</script>

<template>
  <span>My input</span> <input v-model="model">
</template>

可以拆解成由defineProps()和defineEmit()的组合

vue 复制代码
<!-- Child.vue -->
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])
</script>

<template>
  <input
    :value="props.modelValue"
    @input="emit('update:modelValue', $event.target.value)"
  />
</template>
vue 复制代码
// App.vue
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'

const msg = ref('Hello World!')
</script>

<template>
  <h1>{{ msg }}</h1>
  <Child v-model="msg" />
</template>

被拆解成

vue 复制代码
<!-- APP.vue -->
<Child
  :modelValue="msg"
  @update:modelValue="$event => (msg = $event)"
/>

在子组件中用props.modelValue接受父组件传来的msg的值,在模板中用:value进行响应式渲染。

当模板中input的value被修改的时候,使用emit中update:modelValue向父组件传value的值,然后父组件的msg的值被修改成value的值。

v-model的参数

在组件上的v-model可以接受一个参数:

vue 复制代码
// App.vue
<script setup>
import Child from './Child.vue'
import { ref } from 'vue'

const msg = ref('Hello World!')
</script>

<template>
  <h1>{{ msg }}</h1>
  <Child v-model:title="msg" />
</template>

在子组件中,我们可以通过将字符串作为第一个参数传递给 defineModel() 来支持相应的参数。

vue 复制代码
<script setup>
const title = defineModel('title')
</script>

<template>
  <span>My input</span> <input v-model="model">
</template>

如果需要额外的 prop 选项,应该在 model 名称之后传递

js 复制代码
const title = defineModel('title', { required: true })
相关推荐
郭老二4 小时前
【前端】vue3:编译步骤
前端
不在逃避q5 小时前
Trae/Vs Code/Cursor命令行无法跑npm命令
前端·arcgis·npm
夏殇之殁5 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
The Chosen One9855 小时前
高进度算法模板速记(待完善)
java·前端·算法
陈随易5 小时前
MoonBit抓包模块pcap,查看电脑的每一次联网通信
前端·后端·程序员
新中地GIS开发老师6 小时前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
用户059540174467 小时前
大模型对话记忆持久化踩坑实录:用 Playwright 自动化测了 300 次,终于揪出会话丢失的真凶
前端·css
丙氨酸長鏈7 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
kyriewen8 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒8 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端