vue3 - 组件间的传值

组件间传参

父传子v-on/props

父组件使用v-on:绑定要传的参数:parentData="parentData"

<template><div><Child1 :parentData="parentData"></Child1></div>
</template>
<script setup lang="ts">
import Child1 from './components/Child1.vue';
import { ref } from 'vue';const parentData = ref('父级组件参数:parentData');onMounted(() => {
});
</script>

子组件使用props接收

<template>
<div>父级组件参数:<p>{{ modelValue }}</p><p>{{ parentData }}</p>
</div>
</template>
<script setup lang="ts">
const props = defineProps({modelValue: {type: String,required: false},parentData: {type: String,default: '父级组件参数:default'}
});
</script>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

子传父emit

父组件自定义事件changeData传递给子组件

<template><div><h2>父级组件</h2><Child1 :parentData="parentData" v-model="defaultData" @changeData="changeData"></Child1></div>
</template>
<script setup lang="ts">
import Child1 from './components/Child1.vue';
import { onMounted, reactive, ref, watch } from 'vue';const defaultData = ref('v-model绑定参数:defaultData');
const parentData = ref('父级组件参数:parentData');const changeData = (data: string) => {console.log('子组件传给父组件参数:', data);parentData.value = data;
};
</script>

子组件触发事件将需要传递给父组件的参数给事件,使用defineEmits接收事件,emit触发事件。

<template><div><!-- 父组件参数 --><div>父级组件参数:<p>{{ modelValue }}</p><p>{{ parentData }}</p><button @click="emit('changeData', '子组件传给父组件参数')">子组件传给父组件参数</button></div></div>
</template>
<script setup lang="ts">
import { onMounted, reactive, ref, watch } from 'vue';
const props = defineProps({modelValue: {type: String,required: false},parentData: {type: String,default: '父级组件参数:default'}
});/*** 子组件传给父组件参数*  1. 定义事件*  2. 通过emit触发事件*  3. 父组件通过@changeData="changeData"接收事件*/
const emit = defineEmits(['changeData'])
</script>

父传子:依赖/注入:provide/inject

父组件使用provide定义要传递给后代组件的方法、参数。(当需要给深层的某个子组件传递参数时,使用props传参需要一层一层的传递,不好维护代码,可使用provide/inject来实现)

<template><div><h2>父级组件</h2><button @click="provideData = '更新后的父级组件provide参数:provideData'">更新provideData</button><Child1></Child1></div>
</template>
<script setup lang="ts">
import Child1 from './components/Child1.vue';
import { ref, provide  } from 'vue';const provideData = ref('父级组件provide参数:provideData');
provide('provideData1', provideData); // 传递响应式参数,父组件更新值,子组件跟着更新数据
provide('provideData2', provideData.value); // 直接传递值,父组件更新后子组件不会更新
</script>

子组件通过inject

<template><div class="child1"><div>父级组件参数:<p>inject:provideData1: {{ provideData1 }}</p><p>inject:provideData2: {{ provideData2 }}</p></div></div>
</template>
<script setup lang="ts">
import { inject, ref } from 'vue';const provideData1 = inject('provideData1');
const provideData2 = inject('provideData2');</script>
<style scoped lang='scss'>
.child1{border: 1px solid #ccc;
}
</style>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

状态管理pinia

1.安装:

npm install pinia

2.main.ts

创建一个 pinia 实例 (根 store) 并将其传递给应用

import { createApp } from 'vue'
import { createPinia } from 'pinia'
import App from './App.vue'const pinia = createPinia()
const app = createApp(App)app.use(pinia)
app.mount('#app')

使用pinia参考地址:https://pinia.vuejs.org/zh/core-concepts/

3.定义store

/src/stores/counter.ts

import { ref, computed } from 'vue'
import { defineStore } from 'pinia'export const useCounterStore = defineStore('counter', () => {const count = ref(0)const name = ref('Eduardo')const doubleCount = computed(() => count.value * 2)function increment() {count.value++}return { count, doubleCount, increment }
})

4.使用

<script setup>
import { useCounterStore } from '@/stores/counter'
// 在组件内部的任何地方均可以访问变量 `store` ✨
const store = useCounterStore()// ❌ 下面这部分代码不会生效,因为它的响应式被破坏了
// 与 reactive 相同: https://vuejs.org/guide/essentials/reactivity-fundamentals.html#limitations-of-reactive
const { name, doubleCount } = store
name // 将会一直是 "Eduardo" //
doubleCount // 将会一直是 0 //
setTimeout(() => {store.increment()
}, 1000)// 这一部分代码就会维持响应式
// 💡 在这里可以直接使用 `store.doubleCount`
const doubleValue = computed(() => store.doubleCount)
</script>

父传子:插槽 Slots

父组件使用slots传递html代码给子组件显示

<template><div><h2>父级组件</h2><Child1><div><p>父组件代码片段1</p></div><p>父组件代码片段2</p><template #header><p>父组件代码片段3</p></template></Child1></div>
</template>
<script setup lang="ts">
import { te } from 'element-plus/es/locales.mjs';
import Child1 from './components/Child1.vue';
import { ref, provide  } from 'vue';
</script>
<template><div class="child1"><slot name="header">子组件头部插槽(具名插槽)</slot><div>子组件内容1</div><slot>子组件默认插槽</slot><div>子组件内容2</div></div>
</template>
<script setup lang="ts">
import { ref } from 'vue'</script>
<style scoped lang='scss'>
.child1 {border: 1px solid #ccc;
}
</style>

父组件中具名插使用<template #插槽名>,子组件定义<slot name="header"></slot>,当父组件为给插槽传递内容时,会显示<slot></slot>标签之间的插槽默认内容,没有则不显示。

子传父:插槽 Slots

子组件定义传递的参数

<template><slot name="header" :count ="1" :text='text1'></slot><slot :count ="2" :text='text2'></slot>
</template>

父组件接收子组件的参数

<template #header="headerProps">{{ headerProps.count }} {{ headerProps.text }}
</template><template #header="{count,text}">{{ count }}{{text}}
</template><!-- 默认插槽 -->
<template v-slot="defaultProps">{{ defaultProps.count }} {{ defaultProps.text }}
</template><template v-slot="{count,text}">{{ count }}{{text}}
</template><template #default="defaultProps">{{ defaultProps.count }} {{ defaultProps.text }}
</template><template #default="{count,text}">{{ count }}{{text}}
</template>

注:这个传参方式主要在封装组件时使用,例如element plus组件中table

父传子

父组件使用子组件暴露的方法,执行方法,将参数传递给方法中

<template><div><Child1 ref='child'></Child1></div>
</template>
<script setup lang="ts">
import Child1 from './components/Child1.vue';
import { ref } from 'vue';const params = ref({name:'',type:''
})
const child = ref(null);onMounted(() => {child.value.open(params.value)
});
</script>
<script setup lang="ts">
const open = (params)=>{console.log('父组件传递的参数:',params)
}// 暴露方法给父组件
defineExpose({open
});
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/96837.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/96837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kafka 在 6 大典型用例的落地实践架构、参数与避坑清单

一、选型速查表场景关键目标推荐清单&#xff08;示例&#xff09;消息&#xff08;Messaging&#xff09;解耦、低延迟、可靠投递acksall、enable.idempotencetrue、retries>0、min.insync.replicas2、合理分区键、DLT网站活动追踪吞吐极高、可回放主题按类型拆分&#xff…

Node.js(1)—— Node.js介绍与入门

前面我们谈到一些前端开发的内容&#xff0c;学习了HTML、css和JavaScript&#xff0c;已经掌握了如何编写一些简单功能的网页。但是只属于前端部分&#xff0c;我们只能在本地打开文件进行浏览&#xff0c;不能让其他人打开我们编写的网站&#xff1b;这时就需要后端部分上场了…

Python办公——爬虫百度翻译网页版(自制翻译小工具——进阶更新版)

目录 专栏导读 前言 项目概述 功能特点 技术栈 核心架构设计 类结构设计 界面布局设计 核心功能实现 1. 智能语言检测 2. 异步翻译处理 3. HTTP请求处理 4. 结果解析与显示 界面设计亮点 1. 响应式布局 2. 用户体验优化 3. 现代化组件 技术难点与解决方案 1. 跨线程UI更新 2. U…

CentOS7 + Docker 部署 Dify 超详细图文教程

如今Agent在互联网上大行其道&#xff0c;网上吵得火热&#xff0c;各个企业也都想搭建自己的Agent。COZE的开源还有最近新出的JoyAgent也都让大家跃跃欲试&#xff0c;今天为大家带来的是Dify的部署方式&#xff0c;相比其他工作流平台&#xff0c;Dify对于整个Agent制作的流程…

vscode(MSVC)进行c++开发的时,在debug时查看一个eigen数组内部的数值

vscode进行c开发的时&#xff0c;在debug时查看一个eigen数组内部的数值问题描述解决方案拓展其他可视化使用visual studio时的可视化使用别的编译器的可视化问题描述 使用vscode进行c开发&#xff0c;编译器是MSVC&#xff0c;在debug的时候想查看一个eigen数组的数值&#x…

【51单片机】【protues仿真】基于51单片机八路抢答器数码管系统

目录 一、主要功能 二、使用步骤 三、硬件资源 四、软件设计 五、实验现象 一、主要功能 1、数码管显示 2、主持人按下开始&#xff0c;8位选手开始抢答 3、第一次使用要设置抢答时间&#xff0c;支持掉电存储 4、选手抢答成功&#xff0c;数码管会显示其号码 5、按下主…

深度学习:CUDA、PyTorch下载安装

目录 一、安装准备 二、安装CUDA 2.1 查看本机支持的 CUDA 版本及相关信息 2.2 卸载CUDA(可选) 2.3 下载cuda安装包 2.4 安装 2.5 配置环境变量 三、安装PyTorch 3.1 版本选择 3.2 下载安装 方法一&#xff1a;直接安装&#xff08;不建议&#xff0c;网差的话会死机…

MyBatis-Plus 快速入门 -常用注解

目录 1. 常用注解 TableName TableId TableField 2. IdType 枚举 3. 使用 TableField 的常见场景 4. 完整示例 5. 总结 在使用 MyBatis-Plus 的过程中&#xff0c;我们经常会用到一些注解来完成实体类与数据库表字段之间的映射关系。本文将带你快速入门&#xff0c;了解…

2025-08-23Excel 条件高亮工具,秒高亮显示符合筛选条件的行数据

Excel 条件高亮工具&#xff0c;秒高亮显示符合筛选条件的行数据 先看图【加班终结者】Excel 条件高亮工具&#xff08;试用版&#xff09; ——让错误数据一秒现形&#xff0c;免费先爽 30 次&#xff01; 你是不是也这样&#xff1f; • 财务对账&#xff0c;1000 行工资表里…

vue 一键打包上传

npm run build之后&#xff0c;将dist文件夹自动压缩&#xff0c;通过ssh自动连接服务器&#xff0c;把压缩包放到指定目录下&#xff0c;然后自动解压根目录创建gulpfile.js文件const gulp require(gulp); const GulpSSH require(gulp-ssh); const archiver require(archiv…

【Qt调试】无法查看QString内容

环境Qt版本&#xff1a;6.9.1问题Qt creator进入断点&#xff0c;Expressions不能查看变量&#xff08;类型&#xff1a;QString&#xff09;的内容。解决方法选择变量右键&#xff0c;勾选【Use Debugging Helpers】

防爆自动气象监测设备:高危环境的 “安全堡垒”

防爆自动气象监测设备&#xff1a;高危环境的 “安全堡垒” 柏峰【BF-FB】在化工园区、油气田、矿山等高危行业领域&#xff0c;丝毫马虎不得。而气象条件&#xff0c;这个看似平常的因素&#xff0c;实则在安全生产中扮演着举足轻重的角色。防爆自动气象监测设备的出现&#x…

《C++进阶:引用补充、内联函数与nullptr 核心用法》

&#x1f618;个人主页&#xff1a;Cx330❀ &#x1f440;个人简介&#xff1a;一个正在努力奋斗逆天改命的二本觉悟生 &#x1f4d6;个人专栏&#xff1a;《C语言》《LeetCode刷题集》《数据结构-初阶》《C知识分享》 &#x1f31f;人生格言&#xff1a;心向往之行必能至 前言…

通过python程序将实时监测数据写入excel软件进行保存是常用和非常实用的功能,本文教会大家怎么去搞定此功能

目录 一、功能介绍 二、具体的程序示例 三、实际应用建议 一、功能介绍 本方案的核心功能是持续监听一个数据源&#xff08;如传感器、API接口、消息队列、其他应用程序等&#xff09;&#xff0c;将获取到的实时数据流以追加的方式写入到Excel文件中。同时&#xff0c;方案…

在 Linux 中全局搜索 Word 文档内容的完整指南

文章目录 为什么不能直接使用 grep 搜索 Word 文档? 解决方案:使用 Pandoc 转换后搜索 步骤 1:安装 Pandoc 步骤 2:创建搜索脚本 步骤 3:执行搜索(两者选其一) 一行命令解决方案 高级用法与优化 1. 忽略大小写搜索 2. 显示匹配内容 3. 性能优化 注意事项 结论 在日常工作中…

基于STM32单片机智能农业大棚控制系统-插件款 DIY 设计开源(实物+程序+原理图+其他资料)

目录 一、项目成品展示 二、功能介绍 三、硬件组成 四、PCB展示 五、程序设计 六、资料分享 资料获取 查看主页介绍&#xff1a;兆龙电子单片机设计 一、项目成品展示 项目成品图片展示&#xff1a; 哔哩哔哩视频链接&#xff1a; STM32单片机智能农业大棚控制系统-插件…

如何实现二维CAD与3D建模工程图关联一体化出图 | 中望3D 2026新亮点

本文为CAD芯智库整理&#xff0c;未经允许请勿复制、转载&#xff01;原文转自&#xff1a;www.xwzsoft.com/h-nd-609.htmlwww.xwzsoft.com/h-nd-609.html许多企业在同时使用二三维CAD软件时&#xff0c;往往因为2D和3D是不同软件商开发&#xff0c;很容易遇到问题&#xff1a;…

深入理解 Roo Code 的自动批准功能

在软件开发过程中&#xff0c;效率与安全往往是两个需要不断平衡的主题。 Roo Code 中一项能够显著提升效率但也需要谨慎使用的功能——自动批准&#xff08;Auto-Approval&#xff09;。如果你经常与 AI 助手协作编码&#xff0c;这个功能可能会改变你的工作流&#xff0c;但错…

《一次高并发场景下疑难Bug的深度排查与复盘》

常规Bug如同路上的小石子,弯腰便可清理;但有些隐藏在架构深处、仅在特定场景下爆发的疑难Bug,却像深渊中的暗礁,不仅会让程序骤然停摆,更可能消耗团队数周甚至数月的精力。我曾亲历过这样一场“战役”—一个仅在高并发峰值时段出现、无规律触发系统崩溃的Bug,从最初的毫无…

互联网大厂Java面试实录:Spring Boot与微服务架构解析

第一轮&#xff1a;基础技术栈 面试官: 小C&#xff0c;你能否简要介绍一下Java SE 8中的Lambda表达式&#xff1f; 小C: Lambda表达式就是Java中的匿名函数&#xff0c;可以简化代码&#xff0c;让代码更优雅。我记得它可以用来替代匿名类&#xff0c;特别是在集合操作中很有用…