uni-app 跳转页面传参

uni-app Vue2 和 Vue3 页面跳转传参方法

在 uni-app 中,无论是 Vue2 还是 Vue3,页面跳转传参的方式基本一致,主要通过 uni.navigateTouni.redirectTo 等 API 实现。以下是常见的方法:


URL 拼接传参

通过 url 拼接参数,目标页面通过 onLoad 生命周期钩子接收参数。

javascript 复制代码
// 跳转页面并传参
uni.navigateTo({
  url: '/pages/detail/detail?id=123&name=test'
});

目标页面接收参数:

javascript 复制代码
// 目标页面
export default {
  onLoad(options) {
    console.log(options.id); // 123
    console.log(options.name); // test
  }
}

Vue2 中使用 Vuex:

javascript 复制代码
// store.js
export default new Vuex.Store({
  state: {
    pageParams: {}
  },
  mutations: {
    setPageParams(state, params) {
      state.pageParams = params;
    }
  }
});

// 发送页面
this.$store.commit('setPageParams', { id: 123, name: 'test' });
uni.navigateTo({ url: '/pages/detail/detail' });

// 目标页面
computed: {
  pageParams() {
    return this.$store.state.pageParams;
  }
}
 

通过事件通道传参(Vue3 推荐)

  • 方法1
    Vue3 中可以使用 uni.$emituni.$on 实现跨页面通信。

发送参数:

javascript 复制代码
// 发送页面
uni.navigateTo({
  url: '/pages/detail/detail',
  success: () => {
    uni.$emit('updateData', { id: 123, name: 'test' });
  }
});

接收参数:

javascript 复制代码
// 目标页面
export default {
  mounted() {
    uni.$on('updateData', (data) => {
      console.log(data.id); // 123
      console.log(data.name); // test
    });
  },
  beforeUnmount() {
    uni.$off('updateData');
  }
}
  • 方法2
js 复制代码
// 发送方
		uni.navigateTo({
			url: '/pages/user/order/payment',
			// 页面跳转传参数(navigateTo 调用成功后)
			success: (res) => {
				res.eventChannel.emit('orderInfo', detail)
			},
			events: {
				// 监听b.vue返回的参数
				successful(data) {
					console.log(JSON.stringify(data, null, 2))
				},
			}
		});
js 复制代码
// 接收方
	import {
		getCurrentInstance
	} from 'vue';
	const instance = getCurrentInstance();
	onLoad(() => {
		const eventChannel = instance.proxy.getOpenerEventChannel();
		eventChannel.on('orderInfo', (data) => {
			console.log('data', data)
		});
	});

通过本地缓存

对于需要持久化的数据,可以使用 uni.setStorageSyncuni.getStorageSync

发送参数:

javascript 复制代码
uni.setStorageSync('pageParams', { id: 123, name: 'test' });
uni.navigateTo({ url: '/pages/detail/detail' });

接收参数:

javascript 复制代码
// 目标页面
export default {
  onLoad() {
    const params = uni.getStorageSync('pageParams');
    console.log(params); // { id: 123, name: 'test' }
  }
}

使用 uni.$once 实现一次性传参

Vue3 中可以通过 uni.$once 实现一次性事件监听。

发送参数:

javascript 复制代码
uni.navigateTo({
  url: '/pages/detail/detail',
  success: () => {
    uni.$emit('onceData', { id: 123, name: 'test' });
  }
});

接收参数:

javascript 复制代码
// 目标页面
export default {
  mounted() {
    uni.$once('onceData', (data) => {
      console.log(data); // { id: 123, name: 'test' }
    });
  }
}

总结

  • 简单参数:使用 URL 拼接传参。
  • 复杂数据:Vue2 用 Vuex,Vue3 用 事件通道。
  • 临时数据 :使用 uni.$emituni.$on
  • 持久化数据 :使用本地缓存。
    根据具体需求选择合适的方式。
相关推荐
2501_9445255424 分钟前
Flutter for OpenHarmony 个人理财管理App实战 - 账户详情页面
android·java·开发语言·前端·javascript·flutter
计算机学姐24 分钟前
基于SpringBoot的电影点评交流平台【协同过滤推荐算法+数据可视化统计】
java·vue.js·spring boot·spring·信息可视化·echarts·推荐算法
2601_9498574328 分钟前
Flutter for OpenHarmony Web开发助手App实战:快捷键参考
前端·flutter
wangdaoyin201035 分钟前
若依vue2前后端分离集成flowable
开发语言·前端·javascript
心柠1 小时前
vue3相关知识总结
前端·javascript·vue.js
Amumu121381 小时前
Vue Router(二)
java·前端
a1117762 小时前
图书借阅管理系统(FastAPI + Vue)
前端·vue.js·fastapi
常年游走在bug的边缘2 小时前
掌握JavaScript作用域:从函数作用域到块级作用域的演进与实践
开发语言·前端·javascript
极致♀雨3 小时前
vue2+elementUI table表格勾选行冻结/置顶
前端·javascript·vue.js·elementui
林shir3 小时前
3-15-前端Web实战(Vue工程化+ElementPlus)
前端·javascript·vue.js