uniapp页面间通信

uniapp中通过eventChannel实现页面间通信的方法,这是一种官方推荐的高效传参方式。我来解释下这种方式的完整实现和注意事项:

  1. 发送页面(父页面) ‌:

    javascript 复制代码
    uni.navigateTo({
        url: '/pages/detail/detail',
        success: (res) => {
            // 通过eventChannel发送数据
            res.eventChannel.emit('sendData', {
                sTypeName: '详情页',
                sTypeCode: 'detail123'
            });
        }
    });
  2. 接收页面(子页面) ‌:

    javascript 复制代码
    onLoad(options) {
        const eventChannel = this.getOpenerEventChannel();
        eventChannel.on('sendData', (data) => {
            console.log('接收到的数据:', data);
            uni.setNavigationBarTitle({
                title: data.sTypeName
            });
            this.params = {
                type: data.sTypeCode
            };
        });
    }

关键点说明‌:

  1. eventChannel是uniapp提供的页面间通信机制
  2. 数据是在页面跳转成功后通过success回调发送的
  3. 子页面通过getOpenerEventChannel()获取通信通道
  4. 这种方式适合传递复杂对象,没有URL长度限制

注意事项‌:

  1. 确保子页面已加载完成再发送数据(建议放在onLoad中接收)
  2. 数据是实时传递的,不是持久化的
  3. 如果页面是通过redirectTo跳转的,则无法使用这种方式
  4. 建议对事件名使用常量定义,避免拼写错误

在uniapp中通过URL传递参数主要有以下几种方式:

  1. 基础URL传参方式(适合简单参数):
    直接在跳转URL后拼接参数,格式为?key=value&key2=value2

    javascript 复制代码
    uni.navigateTo({
        url: '/pages/detail/detail?id=123&name=test'
    });
  2. 接收参数方式:
    在目标页面的onLoad生命周期函数中获取

    javascript 复制代码
    onLoad(options) {
        console.log(options.id); // 输出:123
        console.log(options.name); // 输出:test
    }
  1. 传递对象参数(需要编码):

    javascript 复制代码
    const params = {
        id: 123,
        user: {name: '张三', age: 20}
    };
    uni.navigateTo({
        url: '/pages/detail/detail?data=' + encodeURIComponent(JSON.stringify(params))
    });

注意事项:

  1. URL长度有限制(不同浏览器不同,一般不超过2000字符)
  2. 传递对象时需要先JSON序列化再编码
  3. 参数会显示在地址栏中,敏感数据不建议用URL传递
  4. 获取的参数都是字符串类型,需要自行转换

对于复杂数据结构,建议使用eventChannel或Vuex等其它方式传递。

传递方式:

  1. ‌全局变量(globalData)
javascript 复制代码
// App.vue
App({
  globalData: {
    userInfo: null
  }
});

// 页面A
getApp().globalData.userInfo = { name: 'John' };
uni.navigateTo({ url: '/pages/B/B' });

// 页面B
onLoad() {
  const userInfo = getApp().globalData.userInfo;
  console.log(userInfo); // { name: 'John' }
}

2. ‌Vuex状态管理

Vuex是Vue.js的官方状态管理库,适合管理复杂的全局状态。通过定义statemutationsactions,可以在不同页面中共享和修改数据‌2 4。

javascript 复制代码
// store/index.js
import Vue from 'vue';
import Vuex from 'vuex';
Vue.use(Vuex);

const store = new Vuex.Store({
  state: {
    sharedData: null
  },
  mutations: {
    updateSharedData(state, payload) {
      state.sharedData = payload;
    }
  }
});

// 页面A
this.$store.commit('updateSharedData', { key: 'value' });
uni.navigateTo({ url: '/pages/B/B' });

// 页面B
onLoad() {
  const data = this.$store.state.sharedData;
  console.log(data); // { key: 'value' }
}

**3. ‌本地存储(Storage)**‌

使用uni.setStorageSyncuni.getStorageSync可以将数据存储在本地,适合需要持久化的数据传递‌1 2

javascript 复制代码
// 页面A
uni.setStorageSync('param1', 'value1');
uni.navigateTo({ url: '/pages/B/B' });

// 页面B
onLoad() {
  const param1 = uni.getStorageSync('param1');
  console.log(param1); // 'value1'
}

还有很多自行探索...

相关推荐
慎思笃行_3 小时前
uniapp 无线连接 手机基座
智能手机·uni-app
00后程序员张3 小时前
App 上架全流程指南,iOS 应用发布步骤、ipa 文件上传工具、TestFlight 分发与 App Store 审核经验分享
android·ios·小程序·https·uni-app·iphone·webview
2501_916013743 小时前
iOS App 上架流程详解,苹果应用发布步骤、App Store 审核规则、ipa 文件上传与测试分发实战经验
android·ios·小程序·https·uni-app·iphone·webview
小样还想跑3 小时前
UniApp ConnectSocket连接websocket
websocket·elasticsearch·uni-app
Nan_Shu_6144 小时前
学习:uniapp全栈微信小程序vue3后台(28)
前端·学习·微信小程序·小程序·uni-app
—Qeyser4 小时前
Laravel + UniApp AES加密/解密
前端·uni-app·laravel
游戏开发爱好者84 小时前
Nginx HTTPS 深入实战 配置、性能与排查全流程(Nginx https
运维·nginx·ios·小程序·https·uni-app·iphone
游戏开发爱好者86 小时前
TCP 抓包分析:tcp抓包工具、 iOS/HTTPS 流量解析全流程
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone
辛宝Otto_WebWorker6 小时前
自力更生!uniapp 使用鸿蒙 UTS 使用三方依赖、本地依赖
uni-app·harmonyos
Q_Q5110082857 小时前
python+uniapp基于微信小程序美食点餐系统
spring boot·python·微信小程序·django·flask·uni-app·node.js