3、微信小程序-通信

文章目录

  • 前言
  • 一、组件通信
    • 1.微信小程序组件内部(页面与逻辑层之间)通信
    • 2.微信小程序组件之间(父子组件)通信
    • (1)父组件是如何向子组件传递数据的
    • (2)子组件是如何向父组件传递数据的
  • 二、page页面之间的通信
    • 1. a页面 向 b页面 携带数据跳转
    • 2. b页面获取 a页面传递过来的数据


前言

今天我们来说下微信小程序的两种通信:
微信小程序通过数据绑定和事件系统进行组件之间的通信。
微信小程序通过url页面导航进行页面之间的通信。


一、组件通信

1.微信小程序组件内部(页面与逻辑层之间)通信

(1)页面是获取逻辑层数据
页面是通过数据绑定的方式获取逻辑层数据的,我们来看下页面是如何获取逻辑层的数据,在页面 .wxml 中有如下代码,这是一个轮播图的实现代码:

<view class="detail_swiper"><swiper autoplay circular indicator-dots><swiper-itemwx:for="{{pics}}"wx:key="pics_id"><image mode="widthFix" src="{{item.pics_mid}}"></image></swiper-item></swiper>
</view>

其中 pics是从逻辑层 .js 中获取的变量,pics是一个数组是用来存放轮播图需要的图片地址的

Page({/*** 页面的初始数据*/data: {//tab标题数据pics:[{pics_id:0,pics_mid:"https://.....1.jpg"},{pics_id:1,pics_mid:"https://.....2.jpg"},{pics_id:2,pics_mid:"https://.....3.jpg"}]},
}

这里需要说明一下,微信小程序大小的限制:
1.不限制分包的数量;
2.所有分包的大小不能超过20m;
3.单个包的大小不能超过2m;

当前微信小程序大小限制以及为什么要限制大小:
因为小程序的设计初衷就是用完即走,轻量化应用。不建议将它当成一个app来设计,所以考虑到启动速度等方面所以才对大小做了限制。

因为小程序有包大小限制,而图片本身就很大,所以小程序的图片最好是使用网络图片。

回到刚刚的代码,pics这个数组被绑定到了页面的标签上,标签通过wx:for 循环 将 pics作为循环数据。

在pics使用的过程中,如果pics的值发生了变化,就要将新数据重新绑定到该变量中,写法如下:

this.setData({pics:pics
}

(2)页面向逻辑层传递数据
页面是通过事件绑定向逻辑层传递数据的,我们来看下页面.wxml是如何向逻辑层.js传递参数的,在上述(1)代码中,我们已经实现了轮播图。这时候想在图片轮播的时候点击各个图片,实现图片的大图预览页面,那就需要当我们点击其中一个轮播图片时,需要将点击的是第几张图片这个参数传递给逻辑层.js层进行处理,实现如下:

<view class="detail_swiper"><swiper autoplay circular indicator-dots><swiper-itemwx:for="{{pics}}"wx:key="pics_id"bindtap="handlePreviewImage"data-url="{{item.pics_mid}}"><image mode="widthFix" src="{{item.pics_mid}}"></image></swiper-item></swiper>
</view>

可以看到这里我们给轮播图子项绑定了handlePreviewImage这个点击事件:bindtap="handlePreviewImage"
我们这个时候通过 data- 来存放我们需要传递的数据,这里传递点击图片的url:data-url="{{item.pics_mid}}"

data- 是自定义的值:
因为微信小程序中不能直接使用函数传参,就是用data-来绑定一个属性,进行传参。也就是说微信小程序没有有以下传参形式:

 bindtap="handlePreviewImage(item.pics_mid)"

当我们将这个图片的url地址传递给.js逻辑层之后,在逻辑层通过handlePreviewImage进行参数的接收:

//点击轮播图放大预览事件handlePreviewImage(e){//1构造图片预览的图片数组const urls = this.pics.map(v=>v.pics_mid);//2接收传递过来图片的urlconst current = e.currentTarget.dataset.urlwx.previewImage({  //解构赋值 相当于 //current:current ,urls:urlscurrent,urls,})},

可以看到刚刚我们传递的参数是通过e.currentTarget.dataset.url进行接收的,为什么要这样写?这个e是我们在页面.wxml传递过来的事件源,我们传递的参数也包含在内,而这个参数就存放在e.currentTarget.dataset.url里面,具体 的数据结构可以自行通过:console.log(e)来打印观察。这里的wx.previewImage是微信的图片预览组件,具体用法详见微信小程序的api文档

由以上可知 监听事件 的相关结论:
1、事件是视图层到逻辑层的通讯方式
2、事件可以将用户的行为反馈到逻辑层进行处理
3、事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数
4、事件对象可以携带额外信息,如 id, dataset, touches

2.微信小程序组件之间(父子组件)通信

上一节有关 2、微信小程序-组件
中简单提到过自定义组件的构建和使用,这节就通过自定义组件来具体说说组件之间是如何进行通信的。

为什么要自定义组件:
1、小程序自定义组件,开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用
2、复杂的页面拆分成多个低耦合的模块,有助于代码维护,自定义组件在使用时与基础组件非常相似,使用方便。

首先我们将某个功能转化为自定义的组件,这个单独的组件我们在这里称之为子组件
而我们在将页面里引入这个子组件,引入的组件我们称之为父组件

接下来我们就来具体看下自定义的通信:

(1)父组件是如何向子组件传递数据的

父组件向子组件传递数据是通过自定义属性的方式实现的。下面是我们自定义的组件 Tabs ,用于展示tab点击切换页面。

<Tabs tabs="{{tabs}}" binditemChange="handleItemChange" > 
</Tabs>

这个{{tabs}}我们通过上面页面与逻辑层的通信分析可以知道,这个是通过数据绑定获取到的逻辑层.js的数据。而 tabs=,这个参数是什么呢?
tabs=就是我们要说的 父组件向子组件传递数据是通过自定义属性的方式实现的,通过自定义的属性tabs。
当我们传入这个数据,子组件是如何接收的呢?

在这之前我们先来了解下自定义组件的内部构造:
在子组件内,不是通过page而是Component构造器来定义组件的。调用Component构造器时,可以指定组件的属性,数据,方法等。注意要区分这两个属性:
1、properties对象:接收父组件传过来的自定义属性数据,可以是对象,数组,基本数据类型等
2、data对象:是定义当前组件内的私有变量数据,可用于组件模板的渲染

//这里的不再是 Page 而是 Component
Component({/*** 组件的属性列表,存放的是要从父组件中接收的数据*/properties: {tabs:{//type 要接收数据的类型type:Array,//value 默认值value:[]}},/*** 组件的自定义初始数据*/data: {},
}

上述代码中properties属性中的tabs变量,就是用来存放我们刚刚父组件传递过来的tabs数据的。这里需要定义tabs的数据类型和默认值。

(2)子组件是如何向父组件传递数据的

父组件想要拿到子组件的数据,通过在组件上绑定自定义监听事件。

1、父组件拿到子组件传递过来数据的处理
首先父组件需要有监听自定义组件事件的方法,这个与监听基础组件事件的方法完全一致,就是通过 binditemChange="handleItemChange" 绑定 binditemChange事件来获取子组件的数据的。

<Tabs tabs="{{tabs}}" binditemChange="handleItemChange">

通过方法handleItemChange来获取到数据,这个数据就是子组件点击 tab的引索 index,通过 e.detail 获取,具体为什么同样可以使用 console.log(e)打印的方式印证

handleItemChange (e) {//获取被点击标题的索引const {index} = e.detail;},

2、子组件通过触发事件的方式向父组件传递数据
通过1、的分析是、在父组件中通过监听自定义事件也就是拿到子组件传递过来数据的处理,子组件通过事件绑定首先传入需要向父组件传递的数据 data-index="{{index}}"

首先子组件得有点击触发的事件:

<view wx:for="{{tabs}}" wx:key="id" bindtap="handleItemTab"data-index="{{index}}">{{item.value}}</view>

这里我们可以看到子组件我们绑定了事件 binditemChange="handleItemChange" :还记得组件内部的方法是定义在与data同层级下的,而自定义组件的方法是放在method对象里的,进入handleItemTab方法

methods: {handleItemTab(e){//解构其实就是对复杂类型进行解构的时候,复制了一份变量的引用,将对象中的key属性转成自定义的属性const {index} = e.currentTarget.dataset//5 触发父组件点击事件this.triggerEvent("itemChange",{index})}
}

关键代码就是

this.triggerEvent(“itemChange”,{index})

这就是子组件触发父组件点击事件的方法,需要使用 triggerEvent 方法,triggerEvent 方法指定事件名、detail对象和事件选项,
{index} ,是我们在detail对象中传入我们要向父组件传递的数据 ;
itemChange,是我们要指定的触发父组件事件的方法名;

回到父组件

<Tabs tabs="{{tabs}}" binditemChange="handleItemChange">

通过子组件的triggerEvent 方法,我们得到了要触发的事件,将其绑定到父组件上
bind:itemChange=“handleItemChange”
也可以写成 binditemChange="handleItemChange"

以上就是子组件向父组件传递数据的全部过程。

小结:
1、父组件传递数据给子组件:因为小程序当中数据的传递是单向的,也就是父组件传递数据给子组件,是通过在组件上添加自定义属性实现的,而在子组件内部的properties中接收自定义组件的属性。
2、子组件传递数据给父组件:它是通过在引用组件上绑定监听自定义事件,然后在子组件的事件方法内,通过this.triggerEvent方法进行触发自定义事件名,并可以携带子组件内的数据,在父组件中的函数中可以通过event.detail可以拿到子组件中传递给父组件的值,从而重新在setData数据,就可以更新父组件中的初始化数据。

二、page页面之间的通信

我们知道页面之间的跳转可以通过路由组件来实现,其中组件的属性url就是要跳转到页面的路径。

1. a页面 向 b页面 携带数据跳转

代码如下:

<navigator class="goods_item"wx:for="{{goodsList}}"wx:key="goods_id"url="/pages/good-detail/index?goods_id={{item.goods_id}}"></navigator>

比如现在有个商品列表页面,我们点击列表中的一个商品可以跳转到商品的详情页面,这时跳转到商品详情页面就要携带商品的id,怎么样传递的呢? 可以看到 url
url=“/pages/good-detail/index?goods_id={{item.goods_id}}” 属性参数是通过 ?goods_id={{item.goods_id}}item.goods_id

2. b页面获取 a页面传递过来的数据

当跳转b的商品详情页面,我们在微信开发者工具中也可以观察到这个传过来的id 数据,打开左下角的页面参数:
在这里插入图片描述
此时可以看到商品详情页面已经获取到 goods_id ,既然获取到了,我们在代码里怎么获得呢?
打开b页码也就是商品详情页面的逻辑层.js ,我们知道初始化页面的时候就会回调小程序的生命周期函数onLoad,我们就在这里面获取参数,代码如下:

onLoad: function (options) {const {goods_id} = options;},

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

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

相关文章

微信小程序之页面通信方式

文章目录 一、前言二、页面通信是什么&#xff1f;三、传值的几种常用方式1.页面跳转传参2.页面跳转传入数据3.使用全局变量传递数据4.利用缓存进行传值 四、小结 一、前言 提示&#xff1a;微信小程序中&#xff0c;页面间的通信方式很重要&#xff0c;通信方式也有很多种&am…

【最新版全插件】多功能同城优选小程序源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 1.为本地的线下商家提供线上销售渠道。一直以来本地商品、娱乐、休闲、旅游服务线上购买大家都是以美团为准。近几年来随着微信公众号、小程序的渗透力逐渐加强&#xff0c;越来越多的…

微信公众号开发之绑定微信开发者

第一步&#xff1a;登录微信公众号&#xff0c;绑定网页开发者 在登录后的界面中&#xff0c;我们向下拉在左侧会看到有一个“开发者工具”点击。 这时在开发者工具中&#xff0c;会看到有好几个工具&#xff0c;其中有一个“web开发者工具”&#xff0c;我们点击进入。 在这里…

微信公众号登录授权(全网发布)一键绑定公众号设置

微信公众号登录授权&#xff08;全网发布&#xff09;一键绑定公众号设置教程及常见问题 前言&#xff1a;本操作跟服务器配置&#xff0c;网络环境等综合环境有关&#xff08;95%&#xff09;&#xff0c;另外存在5%的运气和人品。WeiDogs官方确保程序此功能正常并提供设置教程…

python微信公众号微信用户绑定第三方网站

场景 例如,某用户在第三方购物平台的账号(user_id/手机号码等)需要跟该用户的微信账号进行绑定, 实现在该购物平台的微信公众号中查询个人信息, 消费记录, 充值记录等操作.总的来说便是,将微信用户的open_id跟第三方网址user_id/手机号码等进行一对一关联 实现方案 微信用户…

微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权自动登录业务系统)

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; 微信公众号开发—通过网页授权实现业务系统登录及用户绑定(微信网页授权…

微信授权登录流程以及公众号配置方法(golang后端)

一、准备一个已经认证OK的微信公众号和已经备案的域名&#xff0c;且解析好配置好https证书。 1.如上图 微信公众号 > 基本配置 &#xff0c;设置开发者密码 2.设置IP白名单&#xff0c;白名单填写提供后端服务的服务器公网IP 二、公众号服务器配置。 1.找到基本配置 2.将服…

微信公众号用户与网站用户的绑定方案

现在很多网站都已经建立了一套完整的用户账号体系&#xff0c;基于这套体系&#xff0c;再做其他应用的用户扩展就非常方便。例如&#xff0c;有了微软的outlook账户&#xff0c;就可以登录win8&#xff0c;可以登录微软的邮箱&#xff0c;还可以登录skype。同样地&#xff0c;…

微信开放平台 帐号管理 绑定在同一个开放平台帐号下的公众号及小程序让用户unionid一致...

开发十年&#xff0c;就只剩下这套架构体系了&#xff01; >>> 第三方平台在获得此权限后&#xff0c;可以代替已授权的公众号/小程序创建开放平台帐号或进行绑定/解绑操作。 绑定在同一个开放平台帐号下的公众号及小程序&#xff0c;用户unionid一致。开发者可调用…

wechat-0051,微信公众号,第三方登录—扫码绑定

声明&#xff1a;这边所谓的第三方登录&#xff0c;不是通过网页授权的方式&#xff0c;而是利用生成带参数的二维码&#xff0c;将微信号和平台账号绑定实现。如果你要做的是授权登录&#xff0c;请查看 https://blog.csdn.net/wrongyao/article/details/80229986 微信第三方…

IT创业项目 - 跟淘宝商城合作网赚项目,赚多少你说了算!

【项目介绍】&#xff1a; 使用淘宝商城的巨大流量销售产品或者服务。 【市场前景】&#xff1a; 淘宝网作为最大的B2C交易平台,淘宝商城又是淘宝网要点的发展对象&#xff0c;越来越多的年轻人喜爱在淘宝购买产品和服务。使用好淘宝的流量&#xff0c;赚钱十分简略。其实这是一…

微信公众号开发消息推送以及图文推送

今天给大家分享的关注公众号自动推送图文消息&#xff0c;以及做一个超牛逼的机器人。 先看看效果。 发错图了。。。这是我昨天开发的一款机器人chu了会骂人啥都不会了。我今天将它词库进行了更新和升级&#xff0c;接入了http://www.itpk.cn/ 机器人第三词库 先给你截图&…

【全网最简单】给朋友- 制作,微信公众号推送教程

简介&#xff1a; 前段时间&#xff0c;抖音非常火的微信公众号推送天气&#xff0c;生日&#xff0c;祝福等信息给女朋友专属推送&#xff0c;而且大部分都是Python写的&#xff0c;对于我来说&#xff0c;必须得整起&#xff0c;上java版本&#xff0c;到时候打个包&#xff…

小扎All in AIGC,连夜成立顶级产品团队

金磊 发自 凹非寺量子位 | 公众号 QbitAI ChatGPT的火爆&#xff0c;终究是让Meta坐不住了。 这不&#xff0c;小扎&#xff08;扎克伯格&#xff09;连夜对外宣布了公司的大动作&#xff1a; 成立顶级产品团队&#xff0c;专注AIGC。 这个团队可以说是整合了全公司搞AIGC的人才…

MySQL 被 PG 干翻!最赚钱的开发语言是他?

出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013) Stack Overflow 发布了 2023 年开发者调查报告&#xff0c;据称共计超过 9 万名开发者参与了此次调查。 完整报告包含了受访开发者画像&#xff0c;以及关于开发技术、AI、职业、社区等方面的内容。本文主要介绍关于…

文心一言员工跳槽工资翻倍,猎头:百万年薪很正常

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 前段时间&#xff0c;国内外科技圈呈现出群雄逐“ChatGPT”的态势&#xff1a;谷歌官宣竞品 Bard 、微软发布 AI 驱动的新版 Bing 搜索引擎和 Edge 浏览器、百度官宣“文心一言”、网易…

AIGC分享交流平台、GPT-4、GPT实时联网、Claude

拥有无限畅谈的AI个人助理&#xff0c;提高效率和创造力&#xff0c;引领未来的智能生活&#xff1b; 不仅承载着最前沿的科技理念&#xff0c;更集成了对人工智能可能性的深度理解。 已支持基于GPT、Claude等主流大模型的对话内容生成、支持GPT联网查询实时信息&#xff1b;基…

2022年休闲游戏市场总结

在预测 2023 年之前&#xff0c;我们先回顾一下 2022 年。从上一年发生的事件中往往能看到未来趋势的影子&#xff0c;所以 2022 年的总结至关重要。 一、2022年总结回顾 1、流行游戏类型 回顾 2022 年&#xff0c;三种超休闲游戏表现最为突出&#xff1a; 跑酷游戏&#xff1a…

破解VProtect所有版本,PATCH HWID方式过注册

运行后&#xff1a; 本机机器码"195F9059606EEB4723128A216ED1426B”&#xff0c;在内存中搜索该字符串&#xff0c;可以得到3个地方&#xff0c;我这里以最后搜索到的地方为切入点&#xff0c; 为什么&#xff1f; 找到的3个地方都下内存断点判断&#xff0c;刚好最后找到…

新加坡国立大学学霸,《快乐机器学习》和《Python 从入门到入迷》作者,FRM,CAIA...

王的机器主理人 王圣元 (FRM, CAIA) 某加密货币公司 Head of Quant 冬海集团 SeaMoney 建模负责人 八方咨询 量化总监 新加坡国立大学金融数学硕士 新加坡国立大学量化金融学士 《快乐机器学习》的作者 《Python 从入门到入迷》的作者 第一本书 《快乐机器学习》 第二本书《Pyt…