uniapp页面通信学习笔记

1、利用url传参进行通讯

A页面向B页面传递参数


uni.navigateTo({  url: 'test/test?id=1&url=' + encodeURIComponent('https://dcloud.io')  
});

B页面接收A页面传递的参数


export default {  onLoad: function (option) { //option为object类型,会序列化上个页面传递的参数  console.log(option.id); //打印出上个页面传递的参数。console.log(option. url); //打印出上个页面传递的参数。}  
}

2、uni.$emit()和uni.$on() 进行通讯

自 HBuilderX 2.0.0 起支持 uni.$emit、 uni.$on 、 uni.$once 、uni.$off ,可以方便的进行页面的通讯 ,触发的事件都是 App 全局级别的,跨任意组件,页面,nvue,vue 等。

具体如何使用呢?我们假设一个场景,进入app,是未登陆状态,需要在我的页面点击登陆,进入登陆页面进行登陆。登陆成功之后,返回到我的页面,实时显示登陆后的用户信息。

监听事件

首先,在我的页面监听事件

// 我的页面  
onLoad(){  // 监听事件  uni.$on('login',(usnerinfo)=>{  this.usnerinfo = usnerinfo;  })  
},  
onUnload() {  // 移除监听事件  uni.$off('login');  },

因为事件监听是全局的,所以使用 uni.$on ,需要使用 uni.$off 移除全局的事件监听,避免重复监听。

触发事件

进入登陆页面,触发事件


// 登陆页面  
uni.$emit('login', {  avatarUrl: 'https://img-cdn-qiniu.dcloud.net.cn/uploads/nav_menu/10.jpg',  token: 'user123456',  userName: 'unier',  login: true  
});

使用 uni.$emit 触发事件后,对应的 uni.$on 就会监听到事件触发,在回调中去执行相关的逻辑。

更多使用场景

以上只是一个简单的场景应用。而我们开发中会遇到很多页面间通讯场景,如:

  • vue 与 nvue,nvue 与 vue 间的通讯

  • tabbar 页面之间的通讯

  • 父页面与多级子页面间的通讯

基本上述场景均可以实现,本质上就是一个页面通知另一个面我发生了变化,你需要处理一下。

绝大部分页面的通讯都可以使用 uni.$emit、 uni.$on 、 uni.$once 、uni.$off 四个事件完成。

Tips

  • 如果页面没有打开,将不能 注册监听事件 uni.$on 和 uni.$once 。

  • 一次性的事件,直接使用 uni.$once 监听,不需要移除。

 3、使用 EventBus 进行通讯

// 将eventBus对象注册到Vue的原型上


Vue.prototype.$eventBus = new Vue()

// 在 A 页面添加点击事件向 B 页面发送消息


<button @click=“sendMsg”>Send</button>sendMsg() {this.$eventBus.$emit(“getId”, 12)
}

// 在 B 页面注册监听事件


created() {this.$eventBus.$on(“getId”, function(id) {this.id = id }
}

4、利用“全局变量”进行通讯

1、公用模块

定义一个专用的模块,用来组织和管理这些全局的变量,在需要的页面引入。

注意,这种方式只支持多个vue页面或多个nvue页面之间公用,vue和nvue之间不公用。

示例如下:
在 uni-app 项目根目录下创建 common 目录,然后在 common 目录下新建 helper.js 用于定义公用的方法。


const websiteUrl = 'http://uniapp.dcloud.io';  
const now = Date.now || function () {  return new Date().getTime();  
};  
const isArray = Array.isArray || function (obj) {  return obj instanceof Array;  
};  export default {  websiteUrl,  now,  isArray  
}

接下来在 pages/index/index.vue 中引用该模块。

<script>  import helper from '../../common/helper.js';  export default {  data() {  return {};  },  onLoad(){  console.log('now:' + helper.now());  },  methods: {  }  }  
</script>

这种方式维护起来比较方便,但是缺点就是每次都需要引入。

2、挂载 Vue.prototype

将一些使用频率较高的常量或者方法,直接扩展到 Vue.prototype 上,每个 Vue 对象都会“继承”下来。

注意这种方式只支持vue页面

示例如下:
在 main.js 中挂载属性/方法

Vue.prototype.websiteUrl = 'http://uniapp.dcloud.io';  
Vue.prototype.now = Date.now || function () {  return new Date().getTime();  
};  
Vue.prototype.isArray = Array.isArray || function (obj) {  return obj instanceof Array;  
};

然后在 pages/index/index.vue 中调用


<script>  export default {  data() {  return {};  },  onLoad(){  console.log('now:' + this.now());  },  methods: {  }  }  
</script>

这种方式,只需要在 main.js 中定义好即可在每个页面中直接调用。

Tips

  • 每个页面中不要在出现重复的属性或方法名。

  • 建议在 Vue.prototype 上挂载的属性或方法,可以加一个统一的前缀。比如 $url、global_url 这样,在阅读代码时也容易与当前页面的内容区分开。

 3、globalData

小程序中有个globalData概念,可以在 App 上声明全局变量。Vue 之前是没有这类概念的,但 uni-app 引入了globalData概念,并且在包括H5、App等平台都实现了。

在 App.vue 可以定义 globalData ,也可以使用 API 读写这个值。

globalData支持vue和nvue共享数据。

globalData是一种比较简单的全局变量使用方式。

定义:App.vue


<script>  export default {  globalData: {  text: 'text'  },  onLaunch: function() {  console.log('App Launch')  },  onShow: function() {  console.log('App Show')  },  onHide: function() {  console.log('App Hide')  }  }  
</script>  <style>  /*每个页面公共css */  
</style>

js中操作globalData的方式如下:

赋值:getApp().globalData.text = 'test'

取值:console.log(getApp().globalData.text) // 'test'

如果需要把globalData的数据绑定到页面上,可在页面的onshow声明周期里进行变量重赋值。HBuilderX 2.0.3起,nvue页面在uni-app编译模式下,也支持onshow。

5、Vuex

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。

HBuilderX 2.2.5+起,支持vue和nvue之间共享。参考

这里以登录后同步更新用户信息为例,简单说明下 Vuex 的用法,更多更详细的 Vuex 的内容,建议前往其官网 Vuex 学习下。

举例说明:

在 uni-app 项目根目录下新建 store 目录,在 store 目录下创建 index.js 定义状态值。


const store = new Vuex.Store({  state: {  login: false,  token: '',  avatarUrl: '',  userName: ''  },  mutations: {  login(state, provider) {  console.log(state)  console.log(provider)  state.login = true;  state.token = provider.token;  state.userName = provider.userName;  state.avatarUrl = provider.avatarUrl;  },  logout(state) {  state.login = false;  state.token = '';  state.userName = '';  state.avatarUrl = '';  }  }  
})

然后,需要在 main.js 挂载 Vuex

import store from './store'  
Vue.prototype.$store = store

最后,在 pages/index/index.vue 使用


<script>  import {  mapState,  mapMutations  } from 'vuex';  export default {  computed: {  ...mapState(['avatarUrl', 'login', 'userName'])  },  methods: {  ...mapMutations(['logout'])  }  }  
</script>

注意事项

* .vue 和 .nvue 并不是一个规范,因此一些在 .vue 中适用的方案并不适用于 .nvue。Vue 上挂载属性,不能在 .nvue 中使用。**

6、nvue 和 vue 相互通讯

步骤
1、在nvue页面使用uni.postMessage(data),发送数据,data只能为json数据,
2、在app.vue页面里使用 onUniNViewMessage 进行监听,接受数据
代码示例
nvue页面


<template><div @click="test"><text>点击页面发送数据</text></div>
</template>
<script>export default {methods: {test(e) {uni.postMessage({test: "数据",value:"数据"});}}}
</script>

App.vue


<script>export default {onUniNViewMessage:function(e){console.log("App.vue收到数据")console.log(JSON.stringify(e.data))  },onLaunch: function() {console.log('App Launch');}}
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

将Windows的文件打包为Linux、Ubuntu可打开的格式

设置共享文件夹具体操作 设置共享文件夹 上述这篇文章完整讲述了如何设置一个可以在Windows及虚拟机之间互传文件的文件夹 7zip下载地址 Download 打包具体操作 a. 安装7-ZIP以后&#xff0c;直接在你想要打包的文件上点右键菜单&#xff0c;会有一个7-ZIP的子菜单栏&#…

STM32 HEX文件和BIN文件格式区别keil中的配置与生成

一、区别 HEX 文件: 是包括地址信息的,在烧写或下载HEX文件的时候,一般都不需要用户指定地址,因为HEX文件内部的信息已经包括了地址。HEX文件是用ASCII来表示二进制的数值。例如一般8-BIT的二进制数值0x3F,用ASCII来表示就需要分别表示字符3和字符F,每个字符需要一个BYTE…

【LeetCode每日一题】——946.验证栈序列

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 栈 二【题目难度】 中等 三【题目编号】 946.验证栈序列 四【题目描述】 给定 pushed 和 p…

C++OpenCV(6):图像阈值操作

&#x1f506; 文章首发于我的个人博客&#xff1a;欢迎大佬们来逛逛 &#x1f506; OpenCV项目地址及源代码&#xff1a;点击这里 文章目录 图像阈值化 图像阈值化 阈值又叫临界值&#xff0c;是指一个效应能够产生的最低值或最高值。 例如我们选择的阈值为125&#xff0c;则…

[SQL挖掘机] - union/union all 使用注意事项

因为当使用union和union all操作符时&#xff0c;有一些注意事项需要考虑&#xff1a; 1. 列数和数据类型匹配&#xff1a; 要使用union或union all合并结果集&#xff0c;两个或多个查询的 select 语句必须返回相同数量和类型的列。确保每个查询返回相同的列数&#xff0c;并…

WPF实战学习笔记12-创建备忘录接口

创建备忘录接口 添加文件 新建文件 MyToDo.Api ./Controllers/MemoController.cs ./Service/IMemoService.cs ./Service/MemoService.cs MyToDo.Share ./Parameters/QueryParameter.cs QueryParameter.cs 查询参数类 using System; using System.Collections.Generic…

智能网关实现混凝土搅拌机无人自动化

“以前的搅拌站生产时&#xff0c;是需要人工巡检的&#xff0c;运送物料和搅拌时产生的大量粉尘污染和噪音&#xff0c;让工人苦不堪言。但是如果有了物联网搅拌站监测系统智慧园区项目落地后&#xff0c;工人也不用去现场忍受噪音和粉尘了。” 行业痛点 传统模式下的混泥土…

机器学习实战11-基于K-means算法的文本聚类分析,生成文本聚类后的文件

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍机器学习实战11-基于K-means算法的文本聚类分析&#xff0c;生成文本聚类后的文件。文本聚类分析是NLP领域的一个核心任务&#xff0c;通过将相似的文本样本分组&#xff0c;可以帮助我们发现隐藏在文本数据中的模式和结…

力扣题库刷题笔记73--矩阵置零

1、题目如下&#xff1a; 2、个人Python代码实现 3、个人Python代码思路 a、声明2个空数组p、q&#xff0c;用于存放值为0的元素matrix[i][j]的下标 b、首先遍历二维数组matrix&#xff0c;找到值为0的元素matrix[i][j]&#xff0c;将下标i加入数组p&#xff0c;将下标j加入数…

在Android中使用新版proguard混淆器的方式

文章目录 一、Proguard混淆器二、新版混淆器使用方式(插件版)三、R8与proguard四、参考链接 一、Proguard混淆器 Proguard是Android开发时经常会用到的一个混淆工具&#xff0c;在Android SDK中已经集成了一个免费的Proguard版本&#xff0c;位于/tools/proguard目录中。对于A…

微信小程序-----刷新页面3种方式

微信小程序要实现页面刷新&#xff0c;简单的说就是在不同的地方重新执行 onLoad 周期函数。 需要注意在刷新时是否要初始化变量。因为小程序都是异步操作&#xff0c;所以很多时候&#xff0c;可能会造成服务器相应慢的问题&#xff0c;导致页面显示的时候会有延迟、造成闪烁的…

高通WLAN框架学习(37)-- TDLS(Tunneled Direct Link Setup)通道直接链路建立

一 TDLS概述 隧道直连设置(TDLS)基于IEEE 802.11z-2010IEEE标准802.11z标准(无线局域网介质访问控制(MAC)和物理层(PHY)规范。 TDLS允许与同一AP关联的设备之间建立直接链路。Wi-Fi Direct允许设备之间直接连接,而不需要AP。Wi-Fi联盟认证可用于IEEE 802.11a和802.11g设备的T…

[SQL挖掘机] - WHERE语句

介绍: 往往我们在获取数据的时候, 会有一些限制条件, 这些限制条件很多就是需要通过where进行体现. 当我们在进行数据库查询时, 有时候我们需要从表中筛选出符合特定条件的数据. 这时就可以使用 where 子句来添加一个条件, 以便只选择满足条件的数据行. where 子句用于在查询…

如何创建vue2,vue3项目

前提需安装node.js和Vue CLI node.js:https://nodejs.org/zh-cn Vue CLI&#xff1a; npm install -g vue/cli 如何创建一个vue2项目 &#xff08;1&#xff09; 使用cmd终端直接创建 进入到vue项目所创建的目录里&#xff08;我是直接创建在桌面上&#xff09; 选择vue2 …

入局元宇宙,所谓的无限可能到底在哪里?

最近的热点新闻表明&#xff0c;人们似乎认为元宇宙已经走向“死亡”。但实际上&#xff0c;市场应该重新定义对元宇宙的看法&#xff0c;以及正视它最大的机会所在——游戏领域。 1937年5月6日&#xff0c;一架名为兴登堡号的巨大氢能齐柏林飞艇飞临新泽西州曼彻斯特镇上空&a…

学好Linux的必经之路

学习动机的培养对于一个人学习习惯的形成有着重要的作用。当我们在学习某一个事物时&#xff0c;建立属于我们自己的学习方法&#xff0c;以此培养我们学习Linux系统的学习动机。 当前&#xff0c;Linux系统属于热门的计算机操作系统&#xff0c;因此学习Linux显得重要起来。同…

面试题汇总——设计模式

简单介绍 设计模式共有23种,创建型模式5种,结构型模式7种,行为型模式11种 创建型: 关注对象的创建过程,将对象的创建和使用分开,在使用对象时无须知道对象的创建细节。对象实例化的模式,创建型模式用于解耦对象的实例化过程。单例模式、工厂方法模式、抽象工厂模式、建造…

Jmeter+MySQL链接+JDBC Connection配置元件+使用

参考大大的博客学习&#xff1a;怎么用JMeter操作MySQL数据库&#xff1f;看完秒懂&#xff01;_jmeter mysql_程序员馨馨的博客-CSDN博客 注&#xff1a;里面所有没打码的都是假数据&#xff0c;麻烦大家自行修改正确的信息。 一、背景 需要取数据库中的值&#xff0c;作为…

Toyota Programming Contest 2023#4(AtCoder Beginner Contest 311)(A-G)

Contest Duration: 2023-07-22(Sat) 20:00 - 2023-07-22(Sat) 21:40 (local time) (100 minutes) 头文件和宏 #include<iostream> #include<string> #include<vector> using namespace std; #define int long long #define fer(i,a,b) for(int ia;i<b;i…

【运维】DevOps全流程笔记(未完成)

运维笔记 DevOps基本流程Code阶段工具&#xff08;gitlab安装&#xff09;Build阶段工具&#xff08;Maven安装&#xff09;Integrate阶段工具JenkinsJenkins介绍Jenkins安装Jenkins入门配置 CI/CD操作集成Sonar Qube集成HarborJenkins流水线Kubernetes编排工具 DevOps全流程笔…