开发 | 如何在微信小程序的页面间传递数据?
我们在之前发布过小程序页面传值方法的简单介绍,说明了在小程序开发中,两种常见的页面之间传值方法。
本期,知晓程序(微信号 zxcx0101)为你带来的是「倒数记日」小程序开发者带来的,小程序开发中,有关页面间数据传递的更多方法。

文 | 小日子先生
在微信小程序的开发中,我们会经常遇到页面间数据传递或者相互影响的问题。在实际的开发过程中,可以通过以下几种方法来实现。
使用全局变量
全局变量实际上是定义了一个全局的对象,并在每个页面中引入。
在初始化代码的时候,小程序会读取一个 app.js 的文件,在这里我们可以定义我们所需要的全局变量。
//app.js
...
App({
globalData : {
foo : 'bar'
}
});
然后在页面中,可以通过 getApp() 方法获取到全局应用对象,可以对全局变量进行读取并更改:
//page.js
...
var app = getApp()
var getFoo = app.globalData.foo
app.globalData.foo = 'fun'
由于 app.js 在项目中是用来做基础配置的,因此不建议将很多变量放在这里配置。一般情况下会将一些持久化的常量配置在这里,对于经常需要变动的量不建议用这个方法。
使用本地缓存
本地缓存是微信小程序提供的一个功能,可以将用户产生的数据做本地的持久化,类似于 NoSQL,可以进行读取和修改的操作。
那么在不同的页面之间,如何利用它,进行数据的交互呢?
假设我们在 A 页面保存了用户的信息。
// pageA.js
...
var developer = {
name: 'raymond',
gender: 'male'
}
wx.setStorageSync('developer', developer);
这样做,这个数据就存在了本地。当在 B 页面需要使用的时候,可以直接的获取到数据池中的数据,并进行 CRUD 操作:
//pageB.js
...
// Retrieve
var developer = (wx.getStorageSync('developer') || [])
// Update
developer.name = 'Jiayang'
wx.setStorageSync('developer', developer);
// Delete
wx.removeStorage({
key: 'developer'
})
需要注意的是,在回到 A 页面的时候,小程序需要重新读取数据。这时候,可以选择放在生命周期的 onShow 中对数据重新加载
父级往子级页面(模板)的数据传递
我们通常会在页面之间进行跳转、重定向的操作。这时候,我们可以选择将部分数据放在 url 里面,并在新页面 onLoad 的时候进行初始化。
pageC.js
...
// Navigate
wx.navigateTo({
url: '../pageD/pageD?name=raymond&gender=male',
})
// Redirect
wx.redirectTo({
url: '../pageD/pageD?name=raymond&gender=male',
})
在 D 页面中,我们可以这样接收到到所传进来的参数:
// pageD.js
...
Page({
onLoad: function(option){
console.log(option.name + 'is' + option.gender)
this.setData({
option: option
})
}
})
wx.navigateTo 和 wx.redirectTo 不允许跳转到 tab 所包含的页面,只能用 wx.switchTab 跳转。需要注意的是,wx.switchTab 中的 url 不能传参数。
微信新提供的 wx.reLaunch 接口可以传入参数。
另外,在页面中我们通常会用到一些组件模板,因此在父子之间也会有相应的数据传递。
使用 name 属性,作为模板的名字。然后在这里面使用 is 属性,声明需要的使用的模板。
{{index}}: {{msg}}
Time: {{time}}
然后将模板所需要的 data 传入,如:
<template is="msgItem" data="{{...item}}"/>
Page({
data: {
item: {
index: 0,
msg: 'this is a template',
time: '2016-09-15'
}
}
})
传入模板的除了变量,还可以是事件方法对象。例如,模板中的点击事件,可以传递到使用模板的元素中。
通过获取到页面对象进行数据操作
这个方法的精髓,是通过获取到其他页面的对象原型,然后通过原型方法 setData 对当前对象管理的 data 进行修改,示例如下:
//pageE.js
...
Page({
data: {
index: 1
}
})
当跳转到下一个页面 F 之后,假定在 F 中有操作需要对 E 中的数据有修改,则可以使用以下方法:
pageF.js
...
Page({
changeIndexInE: function(){
var pages = getCurrentPages();
var prevPage = pages[pages.length - 2];
prevPage.setData({
index: 0
})
}
})
这个方法可以操作页面堆栈里面的页面的数据,可以做到让后一级页面对上级页面群的数据管理。
小结
在微信小程序中有以上并且不局限于以上几种的方式进行页面间数据传递、交互,在实际应用中可以组合使用。比如说:
- 一些常量,可以交由
app.js管理;需要持久化的量可以放在本地保存。 - 涉及到下级页面或者模板元素的数据,可以通过传入参数的方式传入。
- 后级页面可以通过获取堆栈里的页面对象快速修改上级的数据。
在实际应用中结合使用,可以更好地管理小程序的数据。
本文如有不周到之处,可以留言进行讨论。
开发 | 如何在微信小程序的页面间传递数据?的更多相关文章
- 微信小程序之页面之间传递值
页面之间传值有三种方式 1.url传值 2.本地存储传值 3.全局变量传值 1.url传值: 通过url传值的需要通过option来获取参数值. 更多详情可以访问小程序-navigateTo章节. A ...
- 微信小程序开发系列七:微信小程序的页面跳转
微信小程序开发系列教程 微信小程序开发系列一:微信小程序的申请和开发环境的搭建 微信小程序开发系列二:微信小程序的视图设计 微信小程序开发系列三:微信小程序的调试方法 微信小程序开发系列四:微信小程序 ...
- 移动开发之【微信小程序】的原理与权限问题以及相关的简易教程
这几天圈子里到处都在传播着这样一个东西,微信公众平台提供了一种新的开放能力,开发者可以快速开发一个小程序,取名曰:微信公众平台-小程序 据说取代移动开发安卓和苹果,那这个东东究竟是干吗用的?但很多人觉 ...
- 微信小程序的开发:通过微信小程序看前端
前言 2016年9月22日凌晨,微信官方通过"微信公开课"公众号发布了关于微信小程序(微信应用号)的内测通知.整个朋友圈瞬间便像炸开了锅似的,各种揣测.介绍性文章在一夜里诞生.而真 ...
- 在微信小程序页面间传递数据总结
在微信小程序页面间传递数据 原文链接:https://www.jianshu.com/p/dae1bac5fc75 在开发微信小程序过程之中,遇到这么一些需要在微信小程序页面之间进行数据的传递的情况, ...
- 零基础开发一款微信小程序商城
零基础开发一款微信小程序商城 一个朋友问我能不能帮忙做个商城?我一个完整网页都写不出的 菜鸟程序员,我该怎么拒绝呢?好吧,看在小程序这么火的形势下,我还是答应了!找了个开源项目,差不多花了三天时间搞定 ...
- 微信小程序:页面配置 page.json
微信小程序:页面配置 page.json 一.页面配置 page.json 如果整个小程序的风格是蓝色调,那么可以在 app.json 里边声明顶部颜色是蓝色即可. 实际情况可能不是这样,可能你小程序 ...
- 微信小程序前端页面书写
微信小程序前端页面书写 WXML(WeiXin Markup Language)是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. 一.数据绑定 1. 普通写法 <view ...
- 图解微信小程序---实现页面的跳转与返回操作
图解微信小程序---实现页面的跳转与返回操作 代码笔记 操作步骤 第一步:在app.json配置文件中,创建跳转页面 第二步:编写首页跳转(注意跳转方式,和设置点击样式类名) 第三步:编写首页样式 第 ...
随机推荐
- JavaWeb总结(六)
获取原始表单数据 - POST请求不仅可以传输文本信息还可以传输二进制数据 - 如果想得到请求中参数的原始字节数据,可以使用HttpServletRequest对象提供的getInputSteam() ...
- django-groundwork
我的环境是windows7 + python34 + django1.8 下面两篇文章提到了django的scaffold,感觉是一个挺不错的功能: Django实战(3):Django也可以有sca ...
- 17-[模块]-time&datetime
1.表示时间time方式 在Python中,用三种方式来表示时间,分别是时间戳.格式化时间字符串和结构化时间 1.时间戳(timestamp):也就是1970年1月1日之后的秒, 例如15063882 ...
- 【HNOI2013】数列
题面 题解 设\(\{a_n\}\)为差分数组,可以得到柿子: \[ \begin{aligned} ans &= \sum_{a_1 = 1} ^ m \sum_{a_2 = 1} ^ m ...
- 使用Sublime Text 3作为React Native的开发IDE
1.下载安装Sublime 3 Sublime 3的下载地址:http://www.sublimetext.com/3 选相应的平台进行下载,安装. 2.安装Package Control 默认的Su ...
- 【SoDiaoEditor电子病历编辑器更新啦】--谨以献给那些还在医疗行业奋斗的小伙伴们
为什么推荐的人这么少~~~~ 更新(2017-4-18): 截止目前已知的已有2个三甲医院在使用该编辑器,容我内心澎湃以下,O(∩_∩)O哈哈~ 先放github地址:https://gith ...
- x5webview 自定义全屏界面
集成X5WEBVIEW可以选择全屏模式为标准全屏还是x5全屏,而不设置默认为false. 首先看看标准全屏的基本设置, if (webView.getX5WebViewExtension() != n ...
- @RestController注解
@RestController注解其实就是@@Controller和@ResponseBody的组合:RESTFUL风格 看下源码: 当@ResponseBody放到Controller类上,改Con ...
- jmeter控制器(二)
循环控制器: 顾名思义就是做循环控制的,与线程组的循环一样的,不过这里的循环控制器是用在一个单独的模块的,而在线程组里面的循环是作用于全局的.循环控制器里面设置的循环次数是局部有效,只控制自己范围内的 ...
- 信息提示 - bootStrap4常用CSS笔记
.alert 基类 .alert-{success.info.warning.danger.primary.secondary.light.dark} 各种类型的配色样式 .fade..show 设置 ...