Vue3——组件传值

父传子

props ——最推荐的方法(TOP1级别)

父组件文件

<sidebar :text="textname" ></sidebar> //父组件通过 :text 将父组件的数据textname传递给子组件
const textname:Ref<dataFather[]> = ref([{name:'刘亦菲',age:18
},
{name:'迪丽热巴',age:17
}]);

子组件文件

<div v-for="item in formattedText">  //不处理 即为 v-for = item in props.text {{ item }}
</div>
let props = defineProps(['text']) //子组件通过defineprops获取到父组件传过来名为text的数据
const formattedText = computed(() => //将数据通过computed处理一下 不用也可以直接使用props.text.map((item:any) => `我叫${item.name},今年刚满${item.age}`)
);

$attrs ——推荐(TOP2级别)

父组件文件

<Sidebar :childData="childData" :changeData="changeData"></Sidebar>
//父组件给子组件传递一个数据和一个方法 也可以是多个数据和方法 
const childData = ref([{ name: '张三', age: 18 },{ name: '李四', age: 19 },{ name: '王五', age: 20 },
]);//定义给子组件的数据
function changeData() {//定义给子组件的方法childData.value[0] = { name: '张三', age: 20 };
}

子组件文件

let restParams = defineProps(['childData'])//先拿到指定的props 剩余的参数可以用下面的attrs拿到
let _attrs = useAttrs();//获取剩余参数console.log('剩余参数====》',_attrs.changeData,restParams.childData)
//or
let _attrs = useAttrs();//获取剩余参数console.log('剩余参数====》',_attrs.changeData,_attrs.childData) //直接用attrs直接获取到所有的参数 
let data = _attrs.childData
data.map(item=>console.log('剩余参数====》',item.name,item.age))

父传孙——透传
二次封装第三方库的时候可以使用attrs来传递参数
子组件文件

//父组件的改动如下:新加了两个参数 newVersion、placeholder 
<Sidebar :childData="childData" :changeData="changeData" newVersion="new" placeholder="请你不要这样的看着我"></Sidebar>
//子组件
<HyInput v-bind="$attrs"></HyInput> <span v-show="newVersion==='new'">这是一个全新版本</span>
import HyInput from '@/components/hyinput/hyinput.vue';//假设这是一个第三方库
defineProps(['newVersion']);//子组件所需的数据 
//假设newVersion是自己封装的新UI和老UI的切换 Or 其他新的功能对第三方库的一个增强方法、函数等 其余的还是使用第三方库 将剩下的参数传递给第三方库v-bind="$attrs"

孙组件——HyInput.vue

//孙组件获取参数方法
let attrs = useAttrs();//通过v-bind='$attrs'透传过来的数据 
console.log(attrs)//这里也可以直接拿到剩下的参数 // let attrs = useAttrs();
// console.log(attrs);
let {childData,changeData,placeholder} = defineProps(['childData','changeData','placeholder']);//这里的一个newVersion 新版本的参数已经在子组件拿去了 然后将剩下的参数传到这个组件里来 
//两个方式选一个

refs & ref 的方式来修改

父组件代码

//template<Sidebar ref="sidebarRef"></Sidebar><div @click="getChildRef($refs)">点我修改子组件的数据</div>
// script
import Sidebar from '@/components/sidebar/sidebar.vue';let childRef = useTemplateRef('sidebarRef');let childRef = useTemplateRef('sidebarRef');function getChildRef(refs) { // 使用refs 可以获取到所有的子组件的refrefs.sidebarRef.dataList = '我先来show一把'; //通过refs修改子组件的数据for (const key in refs) {console.log(refs[key].dataList);//无需.value 打印出来是 我先来show一把}childRef.value.dataList = '爸爸来收你的爱了'; //通过ref来修改子组件的数据}
onMounted(() => {//接收子组件的ref只能在onMounted生命周期函数中获取/*** 执行的顺序 父组件的setup > 父beforeMounted > 子setup > 子beforeMounted > 子mounted > 父mounted* ref的挂载在 子mounted 所以需要在父组件的mounted中才能获取到 如果在setup中获取则获取不到 */console.log(childRef.value.dataList);})

子组件文件

        <div>{{ dataList }}</div>
let dataList = ref('给爸爸的爱');
defineExpose({dataList//必须主动将数据暴露出去 vue2中无需暴露 但是vue3为了保护单项数据流 所以需要做一个主动暴露 
})

如果是异步加载组件

const Sidebar = defineAsyncComponent(() => import('@/components/sidebar/sidebar.vue'));//异步引入侧边栏组件
//则不能在onMounted里面获取/*** 执行的顺序 父组件的setup > 父beforeMounted >父mounted > 子setup > 子beforeMounted > 子mounted * ref的挂载在 子mounted 所以在父组件的mounted中获取不到了 * 如果你想用nextTick 也是不行的 他的执行顺序是 父mounted > 父nextTick > 子mounted > 子nextTick */

通过v-model的相互传递值

父组件

 <hy-input v-model="textSearch"></hy-input>const HyInput = defineAsyncComponent(()=>import('@/components/hyinput/hyinput.vue'));//const textSearch = ref('')//定义搜索框内容

子组件

<template><div class="hy-input"><input type="text"class="hy-input__inner" :value="modelValue"@input="$emit('update:modelValue', $event.target.value)"/></div>
</template><script setup lang="ts" name="hy-input">
defineProps(['modelValue']);//接收父组件传递的modelValue属性
const emit = defineEmits(['update:modelValue']);//将modelValue作为自定义事件update:modelValue的参数传递给父组件
</script><style scoped>.hy-input__inner{border: 1px solid #ccc;border-radius: 2px;color: #ccc;}
</style>

provide 注入

父组件

let fatherData = ref([{name: 'father',age: 18
},
{name: 'mother',age: 20
}
]
);
function changeData(params) {fatherData.value = params;
}
/*** * @description: provide(key, value) 在祖先组件中提供数据,使其所有后代组件可以注入使用。* @param key:标识提供数据的键,可以是字符串或 Symbol。* @param 要提供的数据,可以是任意类型(推荐响应式数据)。*/
provide('fatherDatas', {fatherData,changeData});//父组件向子组件传递数据
//也可以将fatherData changeData 分开注入

子组件 or 孙组件

//template
<button @click="changeData(childNewData)">changeData</button>
//script
let childNewData = [{name:'didi',age:19}
]
let defaultInjectValue = {fatherData:childNewData,changeData:() => {}
}
/*** @description inject(key, [defaultValue]) 在后代组件中注入祖先组件提供的数据。* @param key:与 provide 中相同的键。* @param defaultValue(可选):当未找到匹配的提供者时使用的默认值。*/
let {fatherData,changeData} = inject('fatherDatas',defaultInjectValue);

解决 Prop 钻取问题
共享全局状态:某些数据需要被多个组件共享,但不需要像 Vuex/Pinia 那样复杂的全局状态管理。
提供全局工具或服务:将某些工具函数或服务(如 API 客户端、路由实例)提供给所有组件使用。
跨组件生命周期协作:祖先组件需要控制后代组件的生命周期行为,或后代组件需要通知祖先组件。
组件库设计中的高级用法:组件库中的组件需要与使用者提供的配置或上下文进行交互。

子传父

props

父组件

<sidebar :getChildData="getChildData"></sidebar>
const childData = ref();
function getChildData(childValue:string[]){childData.value = childValue;
}

子组件文件 通过父组件的传递的函数来传递数据

let props = defineProps(['getChildData'])//子组件通过defineprops获取到父组件传过来名为getChildData的接收函数
let sendMyComputed = ()=>{ //将父组件的getChildData函数通过传递参数给父组件接收props.getChildData(formattedText.value)
}

emit——自定义事件 子传父

父组件文件

<sidebar @send-father-data="getChildData"></sidebar> //自定义一个send-father-data的事件 通过getChildData来接收子组件传过来的值const childData = ref();
function getChildData(childValue){childData.value = childValue; //将子组件传过来的childValue赋值给定义的childData
}

子组件

<div @click="sendFatherData">sendFatherData
</div>
let emit = defineEmits(['send-father-data']);//通过defineEmits 来接收自定义事件
let sendFatherData = () => {emit('send-father-data',textname.value) //将textname.value通过emit发送到'send-father-data'
}

$parent

父组件文件

let fatherData = ref('给儿子修改的数据 这都是爱');defineExpose({fatherData,//主动暴露})

父组件文件

//template<div @click="changeFatherData($parent)" >点我修改爸爸</div>
//script
function changeFatherData(parent:any) {parent.fatherData = '爸爸,爸爸 儿子永远爱你';
}

异步(defineAsyncComponent)组件中直接访问 $parent ,父组件未完全初始化,依赖收集失败
能修改 但是响应式数据会出问题

通过provide注入方法 子组件inject接收来修改父组件or祖组件

父组件

let fatherData = ref([{name: 'father',age: 18
},
{name: 'mother',age: 20
}
]
);
function changeData(params) {fatherData.value = params;
}
/*** * @description: provide(key, value) 在祖先组件中提供数据,使其所有后代组件可以注入使用。* @param key:标识提供数据的键,可以是字符串或 Symbol。* @param 要提供的数据,可以是任意类型(推荐响应式数据)。*/
provide('fatherDatas', {fatherData,changeData});//父组件向子组件传递数据
//也可以将fatherData changeData 分开注入

子组件 or 孙组件


//template
<button @click="changeData(childNewData)">changeData</button>
//script
let childNewData = [{name:'didi',age:19}
]
let defaultInjectValue = {fatherData:childNewData,changeData:() => {}
}
/*** @description inject(key, [defaultValue]) 在后代组件中注入祖先组件提供的数据。* @param key:与 provide 中相同的键。* @param defaultValue(可选):当未找到匹配的提供者时使用的默认值。*/
let {fatherData,changeData} = inject('fatherDatas',defaultInjectValue);

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

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

相关文章

DOP数据开放平台(真实线上项目)

什么是数据开放平台&#xff1f; 数据开放平台是一种通过公开应用程序编程接口&#xff08;API&#xff09;或结构化数据&#xff0c;允许第三方开发者或机构访问、使用和共享数据的平台‌&#xff0c;旨在促进数据流通、打破信息孤岛并激发创新应用。 DOP数据开放平台简单演示…

InfluxDB 3 Core数据库管理指南:从概念到实操的完整流程

本文深入解析InfluxDB 3 Core的数据库管理核心概念&#xff0c;涵盖数据库与历史版本的兼容性差异、关键限制&#xff08;数据库/表/列数量&#xff09;、以及创建/查看/删除数据库的完整命令行操作。通过结构化流程和实用建议&#xff0c;帮助用户高效管理时序数据存储&#x…

JVM(11)——详解CMS垃圾回收器

CMS (Concurrent Mark-Sweep) 垃圾回收器。它是 JDK 1.4 后期引入&#xff0c;并在 JDK 5 - JDK 8 期间广泛使用的一种以低停顿时间 (Low Pause Time) 为主要目标的老年代垃圾回收器。它是 G1 出现之前解决 Full GC 长停顿问题的主要方案。 一、CMS 的设计目标与定位 核心目标…

使用Java和iText库填充PDF表单域的完整指南

PDF表单是企业和机构常用的数据收集工具&#xff0c;而通过编程方式自动填充PDF表单可以大大提高工作效率。本文将详细介绍如何使用Java和iText库来实现PDF表单的自动化填充。 为什么选择iText库&#xff1f; iText是一个强大的PDF操作库&#xff0c;具有以下优势&#xff1a…

跟着AI学习C#之项目实践Day6

&#x1f4c5; Day 6&#xff1a;实现文章搜索功能&#xff08;Search System&#xff09; ✅ 今日目标&#xff1a; 实现按 标题、内容、作者 搜索文章使用 LINQ 构建动态查询条件添加搜索框 UI 界面可选&#xff1a;使用全文搜索优化&#xff08;如 SQL Server 全文索引&am…

Learning to Prompt for Continual Learning

Abstract 持续学习背后的主流范式是使模型参数适应非平稳数据分布&#xff0c;其中灾难性遗忘是核心挑战。典型方法依赖于排练缓冲区或测试时已知的任务标识来检索已学知识并解决遗忘问题&#xff0c;而这项工作提出了一种持续学习的新范式&#xff0c;旨在训练一个更简洁的记…

【论文阅读笔记】知网SCI——基于主成分分析的空间外差干涉数据校正研究

论文词条选择 —— 知网 【SCI】【数据分析】 题目&#xff1a;基于主成分分析的空间外差干涉数据校正研究 原文摘要&#xff1a; 空间外差光谱技术(SHS)是一种新型的高光谱遥感探测技术&#xff0c;被广泛应用于大气观测、天文遥感、物质识别等领域。通过空间外差光谱仪获取…

如何用VS Code、Sublime Text开发51单片机

文章目录 一、前置工作二、VS Code2.1 Code Runner配置2.2 编译快捷键 三、Sublime Text3.1 Build System创建3.2 编译快捷键 四、使用STC-ISP下载代码到单片机 使用VS Code开发51单片机的好处自不必多说&#xff0c;直接进入正题。本博客的目标是让你能够使用VS Code或者Subli…

信息抽取数据集全景分析:分类体系、技术演进与挑战_DEEPSEEK

信息抽取数据集全景分析&#xff1a;分类体系、技术演进与挑战 摘要 信息抽取&#xff08;IE&#xff09;作为自然语言处理的核心任务&#xff0c;是构建知识图谱、支持智能问答等应用的基础。近年来&#xff0c;随着深度学习技术的发展和大规模预训练模型的兴起&#xff0c;…

利用 Python 脚本批量查找并删除指定 IP 的 AWS Lightsail 实例

在 AWS Lightsail 管理中&#xff0c;随着实例数量的增多&#xff0c;我们常常会遇到这样一个问题&#xff1a; “我知道某个公网 IP 地址&#xff0c;但不知道它关联的是哪台实例。” 或者&#xff1a; “我有一批老旧的实例只知道 IP&#xff0c;需要一键定位并选择删除。…

CompletableFuture 深度解析

本文将探讨 Java 8 引入的 CompletableFuture&#xff0c;一个在异步编程中实现非阻塞、可组合操作的强大工具。我们将从 CompletableFuture 的基本概念、与传统 Future 的区别、核心 API 用法&#xff0c;到复杂的链式调用、组合操作以及异常处理进行全面解析&#xff0c;并通…

给自己网站增加一个免费的AI助手,纯HTML

助手效果图 看完这篇文章&#xff0c;你将免费拥有你自己的Ai助手&#xff0c;全程干货&#xff0c;先到先得 获取免费的AI大模型接口 访问这个地址 生成key https://openrouter.ai/mistralai/mistral-small-3.2-24b-instruct:free/api 或者调用其他的免费大模型&#xff0c;这…

ASProxy64.dll导致jetbrains家的IDE都无法打开。

在Windows11中,无法打开jetbrains的IDE的软件,经过排查,发现与ASProxy64.dll有关。 E:\idea\IntelliJ IDEA 2024.1.7\bin>idea.bat CompileCommand: exclude com/intellij/openapi/vfs/impl/FilePartNodeRoot.trieDescend bool exclude = true # # A fatal error has bee…

springboot+Vue逍遥大药房管理系统

概述 基于springbootVue开发的逍遥大药房管理系统。该系统功能完善&#xff0c;既包含强大的后台管理模块&#xff0c;又具备用户友好的前台展示界面。 主要内容 一、后台管理系统功能 ​​核心管理模块​​&#xff1a; 用户管理&#xff1a;管理员与普通用户权限分级药品分…

探索阿里云智能媒体管理IMM:解锁媒体处理新境界

一、引言&#xff1a;开启智能媒体管理新时代 在数字化浪潮的席卷下&#xff0c;媒体行业正经历着前所未有的变革。从传统媒体到新媒体的转型&#xff0c;从内容生产到传播分发&#xff0c;每一个环节都在寻求更高效、更智能的解决方案。而云计算&#xff0c;作为推动这一变革…

[附源码+数据库+毕业论文]基于Spring+MyBatis+MySQL+Maven+jsp实现的新生报道管理系统,推荐!

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了新生报道管理系统的开发全过程。通过分析高校新生入学报到信息管理的不足&#xff0c;创建了一个计算机管理高校新生入学报到信息的方案。文章介绍了新生报道管…

给定一个整型矩阵map,求最大的矩形区域为1的数量

题目: 给定一个整型矩阵map,其中的值只有0和1两种,求其中全是1的 所有矩形区域中,最大的矩形区域为1的数量。 例如: 1 1 1 0 其中,最大的矩形区域有3个1,所以返回3。 再如: 1 0 1 1 1 1 1 1 1 1 1 0 其中,最大的矩形区域有6个1,所以返回6。 解题思…

第8章-财务数据

get_fund # 查看股票代码000001.XSHE在2022年9月1日的总市值 q query( valuation ).filter( valuation.code 000001.XSHE ) df get_fundamentals(q, 2022-09-01) print(df[market_cap][0]) # 获取第一行的market_cap值 这段代码看起来是用于查询股票在特定日期的总…

SQL关键字三分钟入门:ROW_NUMBER() —— 窗口函数为每一行编号

在进行数据分析时&#xff0c;我们常常需要为查询结果集中的每条记录生成一个唯一的序号或行号。例如&#xff1a; 为每位员工按照入职时间排序并编号&#xff1b;按照订单金额对订单进行排序&#xff0c;并给每个订单分配一个顺序编号&#xff1b;在分组数据内为每条记录编号…

微信小程序如何实现通过邮箱验证修改密码功能

基于腾讯云开发&#xff08;Tencent Cloud Base&#xff09;实现小程序邮箱验证找回密码功能的完整逻辑说明及关键代码实现。结合安全性和开发效率&#xff0c;方案采用 ​​云函数 小程序前端​​ 的架构&#xff0c;使用 ​​Nodemailer​​ 发送邮件。Nodemailer 是一个专为…