当前位置: 首页 > news >正文

Vue3一个组件绑定多个 v-model,自定义 prop 和 event 名称

Vue3一个组件绑定多个 v-model,自定义 prop 和 event 名称

Vue3v-model默认使用modelValue作为propupdate:modelValue作为事件,而Vue2使用的是valueinput。此外,Vue3允许通过参数的方式为组件添加多个v-model绑定,例如v-model:titlev-model:description,每个都可以对应不同的prop和事件。

例一

一个简单的双绑定
多个v-model绑定,比如用户信息和权限设置。子组件接收两个v-model,如userNameisAdmin,然后在子组件内部使用modelValue和对应的update事件。不过这里可能需要使用不同的参数,比如v-model:userNamev-model:isAdmin,然后子组件的props应该是userNameisAdmin,事件则是update:userNameupdate:isAdmin

基础用法 - 用户信息组件

ChildComponent.vue

<template>
  <div>
    <input 
      :value="userName" 
      @input="$emit('update:userName', $event.target.value)"
    >
    <input
      type="checkbox"
      :checked="isAdmin"
      @change="$emit('update:isAdmin', $event.target.checked)"
    >
  </div>
</template>

<script setup>
defineProps(['userName', 'isAdmin']);
defineEmits(['update:userName', 'update:isAdmin']);
</script>

<!-- 父组件使用 -->
<!-- <UserForm 
  v-model:user-name="userData.name" 
  v-model:is-admin="userData.adminStatus" 
/> -->

例二

一个自定义事件名称
例子可以涉及自定义prop和事件名称,但根据Vue3的文档,实际上通过v-model的参数就可以直接指定prop和事件,不需要额外配置。例如,v-model:title="pageTitle"会自动使用title作为propupdate:title作为事件

自定义参数 - 分页组件

Pagination.vue

<template>
  <div>
    <button @click="$emit('update:currentPage', currentPage - 1)">上一页</button>
    <span>{{ currentPage }}/{{ totalPages }}</span>
    <button @click="$emit('update:currentPage', currentPage + 1)">下一页</button>
  </div>
</template>

<script setup>
defineProps(['currentPage', 'totalPages']);
defineEmits(['update:currentPage']);
</script>

<!-- 父组件使用 -->
<!-- <Pagination 
  v-model:current-page="page" 
  :total-pages="totalPages"
/> -->

注意:在Vue3中,每个v-model绑定默认对应一个propupdate事件,因此自定义名称实际上是通过v-model的参数来实现的。例如,v-model:userName对应prop userName和事件update:userName

例三

更复杂的对象传递,比如绑定整个对象,需要使用计算属性的gettersetter

对象参数 - 颜色选择器

ColorPicker.vue

<template>
  <input 
    type="color" 
    :value="color" 
    @input="$emit('update:color', $event.target.value)"
  >
  <input
    type="range"
    :value="opacity"
    @input="$emit('update:opacity', $event.target.value)"
    min="0"
    max="1"
    step="0.1"
  >
</template>

<script setup>
defineProps({
  color: String,
  opacity: Number
});
defineEmits(['update:color', 'update:opacity']);
</script>

<!-- 父组件使用 -->
<!-- <ColorPicker 
  v-model:color="style.color" 
  v-model:opacity="style.opacity"
/> -->

关键点总结:

  1. 使用 v-model:参数名 语法实现多个绑定
  2. 子组件通过 defineProps 接收参数
  3. 通过 update:参数名 事件触发更新
  4. 参数名会自动转换为kebab-case(如userName → user-name
  5. 支持任意数量的v-model绑定
  6. 可以组合使用普通propsv-model参数

相关文章:

  • 【区块链 + 金融服务】寿险业直保再保协同平台 | FISCO BCOS 应用案例
  • 【计算机网络】一二章
  • java面试题之多线程
  • 怎么鉴别金媒v10.51和v10.5的区别!单单从CRM上区分!
  • Git 新建本地分支并关联到远程仓库
  • 在制作电脑的过程中,如何区分整机性能问题和应用自身性能问题
  • 【2025 最新 Cursor AI 教程 05】用 Cursor AI 解决常见开发问题
  • SpringMVC-登录校验
  • 【Leetcode】328. 奇偶链表
  • element-ui progress 组件源码分享
  • 初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo
  • vue中js简单创建一个事件中心/中间件/eventBus
  • P1591 阶乘数码
  • BFS,DFS带图详解+蓝桥杯算法题+经典例题
  • 如何在前端发版时实现向客户端推送版本更新消息
  • Java Date 判断两个Date范围在第几季度
  • 使用 Path 对象来定义路径
  • 在Vue3中使用Echarts的示例
  • 用户行为路径分析(Google Analytics数据挖掘)
  • Linux系统移植篇(十一)Linux 内核启动流程
  • “上海-日喀则”直飞航线正式通航,将于5月1日开启首航
  • 事关稳就业稳经济,10张海报看懂这场发布会的政策信号
  • “下山虎”张名扬一回合摘下“狮心”:你们再嘘一个给我听听
  • 中国人民对外友好协会代表团访问美国
  • 亚振家居控制权将变更:济南域潇集团实控人成新控股股东
  • 李彦宏:DeepSeek不是万能,多模态将是未来基础模型的标配