uni-app 跳转页面传参

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

在 uni-app 中,无论是 Vue2 还是 Vue3,页面跳转传参的方式基本一致,主要通过 uni.navigateTo、uni.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.$emit 和 uni.$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.setStorageSync 和 uni.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.$emit 和 uni.$on。
  • 持久化数据 :使用本地缓存。
    根据具体需求选择合适的方式。
相关推荐
康小汪5 小时前
AI 写 Vue 总写成同一个味道:给它装 Skills,装的不是知识是边界
前端·vue.js·人工智能·ai编程·最佳实践
智能运维指南6 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
白山编程大哥7 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list
Flynt8 小时前
我把热榜那篇"禁用 axios"逐条实测了一遍:结论大体对,坑在它没讲的地方
前端·javascript·axios
Csvn9 小时前
bundle优化
前端
北冥有鱼9 小时前
发版后动态路由点击报 `Failed to fetch dynamically imported module`」问题上的完整排查与修复过程
前端·vue.js
静默回滚9 小时前
视频压到 25 MB 以内,码率要算、音轨要扣、余量要留
前端
用户37203749260189 小时前
把 10MB 中文语义模型塞进浏览器:STSB 做到教师模型的 93%,但线上 top1 只有 42%
前端
光锥智能9 小时前
海康机器人举行2026移动机器人新品发布会:箱式存拣升级,「明智」系列发布
java·前端·机器人
计算机魔术师9 小时前
Anthropic 上市文件最吓人的一幕,不是亏损 807 亿
前端