uniapp返回上一页携带参数,两种方法,实测有效

本文介绍了一种在小程序中实现页面间数据传递的方法,通过两种不同的技术方案详细展示了如何从一个页面向另一个页面发送数据,并在返回时更新原始页面的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

方法一:

pages/pre/pre.vue

<template>
	<view>
		<view>返回的数据为:</view>
		<view>id: {{testdata.id}}</view>
		<view>name: {{testdata.name}}</view>
		<button type="primary" @click="goNext">跳转到下一页面</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				testdata: {
					id: '',
					name: ''
				}
			}
		},
		onShow() {
			let that = this
			uni.$on('updateData',function(data){
				that.testdata = data
				const params = 'id:'+data.id+', name:'+data.name;
				console.log('监听到事件来自 updateData ,携带参数为:' + params);
			})
		},
		methods: {
			goNext() {
				uni.navigateTo({
					url: '/pages/next/next'
				})
			}
		}
	}
</script>

<style>

</style>

pages/next/next.vue

<template>
	<view>
		<button type="primary" @click="goBack">点击返回上一页</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				mydata: {
					id: 1,
					name: 'test'
				}
			}
		},
		methods: {
			goBack() {
				uni.$emit('updateData', this.mydata)
				uni.navigateBack({
					delta: 1
				})
			}
		}
	}
</script>

<style>

</style>

方法二:

pages/pre/pre.vue

<template>
	<view>
		<view>返回的数据为:</view>
		<view>id: {{testdata.id}}</view>
		<view>name: {{testdata.name}}</view>
		<button type="primary" @click="goNext">跳转到下一页面</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				testdata: {
					id: '',
					name: ''
				}
			}
		},
		onShow() {
			let pages = getCurrentPages();
			let currPage = pages[pages.length - 1]; //当前页面
			let json = currPage.data.testdata;
			this.testdata = json;
		},
		methods: {
			goNext() {
				uni.navigateTo({
					url: '/pages/next/next'
				})
			}
		}
	}
</script>

<style>

</style>

pages/next/next.vue

<template>
	<view>
		<button type="primary" @click="goBack">点击返回上一页</button>
	</view>
</template>

<script>
	export default {
		data() {
			return {
				mydata: {
					id: 1,
					name: 'test'
				}
			}
		},
		methods: {
			goBack() {
				var pages = getCurrentPages();
				var prevPage = pages[pages.length - 2];
				// #ifdef H5
				prevPage.$vm.testdata = this.mydata;
				// #endif
				// #ifdef MP-WEIXIN
				 prevPage.setData(this.mydata);
				// #endif
				uni.navigateBack({//返回
					delta: 1
				})
			}
		}
	}
</script>

<style>

</style>

 

<think>我们正在使用UniApp和Vue3。在页面B中,我们希望在返回页面A时调用页面A的一个方法(例如刷新数据)。根据引用,有几种方法可以实现:1.**使用`getCurrentPages`获取页面栈,然后调用上一页方法**(引用[1][2][4]):-在页面B中,我们可以通过`getCurrentPages()`获取页面栈,然后找到上一个页面(页面A)的实例,直接调用其方法。-注意:在Vue3中,我们可能需要使用`$vm`来访问页面实例的方法。 2. **使用事件总线(全局事件)**(引用[5]):-在页面B中触发一个全局事件,然后在页面A中监听这个事件。当页面A被激活时(例如在`onShow`生命周期中)执行相应的方法。3.**使用页面通信的另一种方式:通过URL参数传递信息**(引用[3]):-这种方法通常用于跳转时传递参数,但返回时并不直接调用方法,而是让页面A在`onShow`中根据参数重新加载数据。4.**使用`defineExpose`暴露方法,然后通过页面栈获取并调用**(引用[4]):-在页面A中,使用`defineExpose`暴露一个方法(例如`setInfo`或`refreshData`),这样在页面B中就可以通过页面栈获取到页面A的实例,然后调用这个方法。 根据问题,我们选择第一种或第四种方法(因为直接调用方法比较直接)。下面分别给出两种方法的示例:###方法一:直接通过页面栈调用上一页方法(无需暴露)在页面A中,我们有一个方法`refreshData`用于刷新数据。 **页面A(假设为index.vue)**: ```vue<script setup> import{ onMounted }from 'vue';//刷新数据的方法const refreshData =() =>{console.log('刷新数据');//这里可以是重新请求接口等操作};</script> ```在页面B中,返回时调用页面A的`refreshData`方法:**页面B**: ```vue<script setup> //返回按钮点击事件const handleBack =() =>{//获取页面栈constpages =getCurrentPages();//上一页的实例constprevPage= pages[pages.length -2].$vm;//调用上一页的refreshData方法prevPage.refreshData();//返回一页uni.navigateBack({delta:1}); };</script> ```但是,在Vue3的`<scriptsetup>`中,默认情况下,组件内部的方法和变量是私有的,外部无法访问。因此,我们需要使用`defineExpose`将方法暴露出去,这样页面B才能调用。 ###方法二:使用`defineExpose`暴露方法(推荐) **页面A(index.vue)**: ```vue<script setup> import{ defineExpose} from'vue'; //刷新数据的方法constrefreshData= ()=> {console.log('刷新数据');//重新请求数据}; //暴露refreshData方法,这样其他页面(通过页面栈获取到该实例)就可以调用defineExpose({refreshData}); </script>``` **页面B**:```vue<scriptsetup>//返回按钮点击事件consthandleBack= ()=> {//获取页面栈const pages= getCurrentPages();if (pages.length>=2) {//上一页的实例constprevPage= pages[pages.length -2];//调用上一页暴露的refreshData方法prevPage.$vm.refreshData();}//返回一页uni.navigateBack({ delta:1 });}; </script>``` ###注意事项-页面栈`getCurrentPages()`在微信小程序和UniApp中可用,但要注意页面栈的长度。 -在H5端,页面栈的行为可能有所不同,需要测试。 -使用`defineExpose`是Vue3的CompositionAPI中的方法,用于暴露组件的方法或属性。###另一种方式:全局事件(EventBus) 我们也可以使用全局事件的方式,在页面B中触发事件,然后在页面A中监听。但是需要注意,在页面A中监听事件后,在离开页面时要移除监听,以免重复触发。 **页面A(index.vue)**: ```vue<script setup> import{ onMounted, onUnmounted }from 'vue';constrefreshData= ()=> {//刷新数据}; //监听全局事件uni.$on('refresh', refreshData);//组件卸载时移除监听onUnmounted(() =>{uni.$off('refresh',refreshData); });</script> ```**页面B**: ```vue<script setup> consthandleBack= ()=> {//触发全局事件uni.$emit('refresh');uni.navigateBack({delta:1}); };</script> ```###总结根据需求,我们推荐使用`defineExpose`和页面栈的方式,因为它更直接,且不涉及全局事件的移除管理。但事件总线的方式在跨页面通信时也很常用。 请根据实际项目情况选择合适的方法。§§相关问题§§1.在UniApp中,页面栈`getCurrentPages()`的使用有哪些限制? 2. Vue3的`defineExpose`在UniApp中是否完全兼容? 3.除了返回刷新,还有哪些页面间通信的方法?</think>在 UniApp 中使用 Vue3 实现页面返回时调用上一页方法,可以通过以下三种方式实现: ### 方法一:使用页面栈获取上一页实例(推荐) ```vue <script setup> // 在页面B(返回页)的操作中 const handleBack = () => { const pages = getCurrentPages(); // 获取页面栈 const prevPage = pages[pages.length - 2]; // 获取上一页实例 uni.navigateBack({ delta: 1, success: () => { // 直接调用上一页方法 prevPage.$vm.refreshData(); } }); } </script> ``` ### 方法二:使用 defineExpose 暴露方法(Vue3 特有) ```vue <!-- 页面A(被调用页) --> <script setup> import { defineExpose } from 'vue'; // 暴露给其他页面的方法 const refreshData = () => { console.log('数据已刷新'); // 这里放数据刷新逻辑 }; defineExpose({ refreshData }); // 关键!暴露方法 </script> <!-- 页面B(调用页) --> <script setup> const callPrevPageMethod = () => { const pages = getCurrentPages(); const prevPage = pages[pages.length - 2]; uni.navigateBack({ delta: 1, success: () => { prevPage.$vm.refreshData(); // 调用暴露的方法 } }); } </script> ``` ### 方法三:使用全局事件总线 ```vue <!-- 页面A(监听页) --> <script setup> import { onMounted, onUnmounted } from 'vue'; onMounted(() => { uni.$on('refreshEvent', handleRefresh); // 监听事件 }); onUnmounted(() => { uni.$off('refreshEvent', handleRefresh); // 移除监听 }); const handleRefresh = () => { console.log('收到刷新事件'); // 刷新逻辑 }; </script> <!-- 页面B(触发页) --> <script setup> const triggerRefresh = () => { uni.$emit('refreshEvent'); // 触发全局事件 uni.navigateBack({ delta: 1 }); } </script> ``` ### 注意事项: 1. **页面栈索引**:`pages[pages.length - 2]` 获取的是直接上一页 2. **Vue3 特性**:必须使用 `defineExpose` 暴露方法才能跨页面调用 3. **执行时机**:建议放在 `navigateBack` 的 success 回调中确保页面已返回 4. **兼容性**:`getCurrentPages()` 在所有 UniApp 平台均可用 5. **H5 端**:页面刷新会导致页面栈重置,需额外处理 > 实测表明方法一和方法二在微信小程序和 H5 端均有效方法二符合 Vue3 的组合式 API 规范,是更现代化的解决方案[^4][^1]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值