[vue3] 自定义组件的v-model

父组件

ts 复制代码
<script setup>
    const txt = ref('');
 </script>
 
 <template>
  <CustomInput v-model="txt" />
 </template>

子组件

defineProps defineEmits

<CustomInput> 组件内部需要做两件事:

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

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

ts 复制代码
<script setup>
const props = defineProps({
  'modelValue': String,
})
const emit = defineEmits(["update:modelValue"])
</script>

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

另一种在组件内实现 v-model 的方式是使用一个可写的,同时具有 getter 和 setter 的 computed 属性

computed 绑定

使用computed 属性时, get 方法需返回 modelValue prop,而 set 方法需触发相应的事件

子组件

ts 复制代码
<script setup>
const value = computed({
  get() {
    return props.modelValue
  },
  set(value) {
    emit("update:modelValue", value)
  }
})
</script>

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

v-model 绑定多个属性

父组件

ts 复制代码
<template>
    <CustomInput v-model:first-name="first" v-model:last-name="last" />
</template>

子组件

ts 复制代码
 <script setup>
 const props = defineProps({
  firstName: String,
  lastName: String,
})
// 在computed中 使用
const emit = defineEmits(['update:firstName', 'update:lastName'])
</script>

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

参考:

搞懂 vue3 中 v-model 的用法

相关推荐
qq_366577511 小时前
Vue3创建项目,只能localhost访问问题处理
前端·javascript·vue.js
笨笨狗吞噬者2 小时前
【uniapp】小程序实现自由控制组件JSON文件配置
vue.js·微信小程序·vite
龙国浪子2 小时前
小说写作软件中的文本高亮功能:基于 TipTap 的多彩标记技术实现
vue.js·electron
武昌库里写JAVA3 小时前
Java如何快速入门?Java基础_Java入门
java·vue.js·spring boot·后端·sql
Irene19913 小时前
Element UI 及其 Vue 3 版本 Element Plus 发展现状
前端·vue.js·ui
Account_Ray3 小时前
vue3 的专属二维码组件 vue3-next-qrcode 迎来 4.0.0 版本
前端·vue.js·nuxt.js
帧栈3 小时前
开发避坑指南(70):Vue3 Http请求头携带token下载pdf文件解决方案
前端·vue.js
q_19132846955 小时前
基于SpringBoot2+Vue2的宠物健康医疗论坛系统
vue.js·spring boot·mysql·健康医疗·宠物·计算机毕业设计
一 乐6 小时前
健身达人小程序|基于java+vue健身达人小程序的系统设计与实现(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·小程序
小云朵爱编程15 小时前
Vue项目Iconify的使用以及自定义图标,封装图标选择器
前端·javascript·vue.js