uniapp+Vue3 组件之间的传值方法

news/2025/3/15 22:37:54/

一、父子传值(props / $emit 、ref / $refs)

1、props / $emit

父组件通过 props 向子组件传递数据,子组件通过 $emit 触发事件向父组件传递数据。

 父组件:

// 父组件中<template><view class="container"><view class="row" v-for="(item, index) in listData" :key="item.pkId"><newsbox pageTitle="待办" :itemInfo="item"></newsbox></view></view>
</template>
<script setup>import { ref } from 'vue';
let listData = ref([{name: "张三", age: "18"}, {name: "李四", age: "19"}])</script>
<style lang="scss" scoped>
.container{padding: 10rpx 30rpx;.row{padding: 10rpx 0;}
}
</style>

子组件:

// 子组件中<template><view class="box"><text class="title">{{pageTitle}}</text>	<text class="name">{{itemInfo.name}}</text>	</view>
</template>
<script setup>defineProps({itemInfo: {type: Object,default: {}},pageTitle: {type: String,default: ""}})
</script>
<style lang="scss" scoped>
.box {.title {font-size: 32rpx;}.name {font-size: 28rpx;}
}
</style>

二、兄弟传值( $emit / $on )

借助中间代理, $emit 和 $on

1、说明

uni.$emit(eventName,OBJECT)

触发全局的自定义事件,附加参数都会传给监听器回调函数。

HarmonyOS Next 兼容性

代码示例

javascript">uni.$emit('update',{msg:'页面更新'})

uni.$on(eventName,callback)

监听全局的自定义事件,事件由 uni.$emit 触发,回调函数会接收事件触发函数的传入参数。

HarmonyOS Next 兼容性

代码示例 

javascript">uni.$on('update',function(data){console.log('监听到事件来自 update ,携带参数 msg 为:' + data.msg);
})

uni.$off(eventName, callback)

移除全局自定义事件监听器。

HarmonyOS Next 兼容性

Tips

  • 如果uni.$off没有传入参数,则移除App级别的所有事件监听器;
  • 如果只提供了事件名(eventName),则移除该事件名对应的所有监听器;
  • 如果同时提供了事件与回调,则只移除这个事件回调的监听器;
  • 提供的回调必须跟$on的回调为同一个才能移除这个回调的监听器;

代码示例

$emit$on$off常用于跨页面、跨组件通讯,这里为了方便演示放在同一个页面

	<template><view class="content"><view class="data"><text>{{val}}</text></view><button type="primary" @click="comunicationOff">结束监听</button></view></template><script>export default {data() {return {val: 0}},onLoad() {setInterval(()=>{uni.$emit('add', {data: 2})},1000)uni.$on('add', this.add)},methods: {comunicationOff() {uni.$off('add', this.add)},add(e) {this.val += e.data}}}</script><style>.content {display: flex;flex-direction: column;align-items: center;justify-content: center;}.data {text-align: center;line-height: 40px;margin-top: 40px;}button {width: 200px;margin: 20px 0;}</style>

注意事项

  • uni.$emituni.$onuni.$onceuni.$off 触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等
  • 使用时,注意及时销毁事件监听,比如,页面 onLoad 里边 uni.$on 注册监听,onUnload 里边 uni.$off 移除,或者一次性的事件,直接使用 uni.$once 监听
  • 注意 uni.$on 定义完成后才能接收到 uni.$emit 传递的数据
  • eventName 应避免使用 uni 开头,以免与 uni-app 内置事件冲突

三、provide/inject

简单讲解:provide和inject叫依赖注入,是vue官方提供的API,它们可以实现多层组件传递数据,无论层级有多深,都可以通过这API实现。
假设这是太老爷组件: provide(‘名称’, 传递的参数)向后代组件提供数据, 只要是后代都能接收

<template><div></div>
</template><script setup>
import { ref, provide } from 'vue'
const name = ref('天天鸭')
// 向后代组件提供数据, 只要是后代都能接收
provide('name', name.value)
</script>

最深层的孙组件: 无论层级多深,用 inject(接收什么参数) 进行接收即可 

<template><div>{{ name }}</div>
</template><script setup>
import { inject } from 'vue'
// 接收顶层组件的通信
const name = inject('name')
</script>


http://www.ppmy.cn/news/1579416.html

相关文章

【学习笔记】LLM技术基础

相比于预训练模型&#xff0c;大模型除了参数&#xff0c;数据量的大幅增长之外&#xff0c;还有能力的极大跃升。其目的已经不再是如之前NLP一样注重于解决特定任务&#xff0c;而是尝试成为通用任务求解器。为此&#xff0c;除了模型规模的增长&#xff0c;其训练过程相对也更…

什么是 React 的合成事件?

React 的合成事件 React 的合成事件&#xff08;Synthetic Events&#xff09;是 React 提供的一种跨浏览器的事件处理机制。它封装了原生事件&#xff0c;确保事件处理的性能和一致性。本文将深入探讨 React 合成事件的工作原理、特性、使用方式以及与原生事件的比较。 1. 什…

C++【类和对象】(超详细!!!)

C【类和对象】 1.运算符重载2.赋值运算符重载3.日期类的实现 1.运算符重载 (1).C规定类类型运算符使用时&#xff0c;必须转换成调用运算符重载。 (2).运算符重载是具有特殊名字的函数&#xff0c;名字等于operator加需要使用的运算符&#xff0c;具有返回类型和参数列表及函数…

小程序主包方法迁移到分包-调用策略

/** Date: 2024-12-10 15:59:32* Description: 加载异步代码*/import { type Type, type ReversedType, type ReversedTypeRecord } from /lazy/typetype Key keyof Type/** 只支持调用函数 */ export const lazierInit new Proxy<ReversedType>({} as any, {get<T …

MTK Android12 安装app添加密码锁限制

提示&#xff1a;通过安装前输入密码的需求&#xff0c;来熟悉了解PMS 基本的安装流程 文章目录 一、需求实现需求原因提醒 二、UML图-类图三、参考资料四、实现效果五、需求修改点修改文件及路径具体修改内容 六、源码流程分析PMS的复杂性代码量实现aidl 接口PackageManagerSe…

css中实现border距离视图左右两侧有距离

首先看效果图 再看css是如何实现 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>.main {background-color: aqua;display: block;width: 300px;padding: 0px 32px;box-sizing: border-box;}/…

用 UCS Moody 和Camarilla支点打造量化高胜率模型

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a;UCS Moody数学振荡器和Camarilla支点这两个量化工具&#xff0c;能显著提升交易决策的精准度。通过结合振荡器的动态趋势捕捉能力与支点策略的关键位预判&#xff0c;我优化了…

买瓜 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组

买瓜 题目来源 第十四届蓝桥杯大赛软件赛省赛C/C++ 大学 A 组 原题链接 蓝桥杯 买瓜 https://www.lanqiao.cn/problems/3505/learning/ 问题描述 题目描述 小蓝正在一个瓜摊上买瓜。瓜摊上共有 n n n 个瓜,每个瓜的重量为 A i A_i Ai​。小蓝刀功了得,他可以把任何瓜…