vue3 自定义 v-model(无参数和带参数)【setup版】(两种方案)

vue2 自定义 v-model 详见 https://sunshinehu.blog.csdn.net/article/details/136942322

vue3 自定义 v-model【方案一】

子组件 Child.vue

html 复制代码
<script setup>
defineProps(["modelValue"]);
const emits = defineEmits();
</script>

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

父组件

html 复制代码
<script setup>
import { ref } from "vue";
import Child from "./Child.vue";

const msg = ref("");
</script>

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

技术要点

vue3 中,若 v-model 未配置参数,则

  • 父组件给子组件传入了名为 modelValue 的 prop
  • 父组件监听了子组件的自定义事件 update:modelValue

v-model 带参数

vue3 支持多个v-model,且可带参数

父组件

html 复制代码
<script setup>
import { ref } from "vue";
import Child from "./Child.vue";

const title = ref("");
const msg = ref("");
</script>

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

子组件

html 复制代码
<script setup>
defineProps(["title", "msg"]);
const emits = defineEmits(["update:title", "update:msg"]);
</script>

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

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

vue3 自定义 v-model【方案二】推荐

html 复制代码
<!-- 组合式 API vue3.4+ -->
<script setup>
const model = defineModel()
</script>

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

defineModel() 返回的值是一个 ref

  • 它的 .value 和父组件的 v-model 的值同步
  • 当它被子组件变更时,会触发父组件绑定的值一起更新

v-model 带参数

以参数 "title" 为例

html 复制代码
<!-- 组合式 API vue3.4+ -->
<script setup>
const title = defineModel('title')
</script>

<template>
  <input type="text" v-model="title" />
</template>

父组件

html 复制代码
<MyComponent v-model:title="bookTitle" />
相关推荐
微臣愚钝2 小时前
前端【8】HTML+CSS+javascript实战项目----实现一个简单的待办事项列表 (To-Do List)
前端·javascript·css·html
lilu88888883 小时前
AI代码生成器赋能房地产:ScriptEcho如何革新VR/AR房产浏览体验
前端·人工智能·ar·vr
LCG元3 小时前
Vue.js组件开发-实现对视频预览
前端·vue.js·音视频
傻小胖4 小时前
shallowRef和shallowReactive的用法以及使用场景和ref和reactive的区别
javascript·vue.js·ecmascript
阿芯爱编程4 小时前
vue3 react区别
前端·react.js·前端框架
烛.照1034 小时前
Nginx部署的前端项目刷新404问题
运维·前端·nginx
YoloMari4 小时前
组件中的emit
前端·javascript·vue.js·微信小程序·uni-app
浪浪山小白兔5 小时前
HTML5 Web Worker 的使用与实践
前端·html·html5
疯狂小料5 小时前
React 路由导航与传参详解
前端·react.js·前端框架
customer086 小时前
【开源免费】基于SpringBoot+Vue.JS贸易行业crm系统(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·开源