1、使用navigator的url带参传值

(1)在pageA页面有一个固定的值要传递到pageB页面,比如说一个固定的值user_id要传递给B

  1. <navigator url="../index/pageB?user_id='12345678'">index4</navigator>

注:?后面为你要传递的值

这样在pageB页面js的onload函数里面,使用setData方法可以获取到传递过来的值,并将它赋值给pageB页面初始数据
在pageB页面的data里面声明一个初始数据

  1. data: {
  2. user_id:''
  3. },

然后在onload函数中进行操作,页面加载时获取

  1. onLoad: function (options) {
  2. this.setData({
  3. user_id:options.user_id
  4. })
  5. console.log(this.data.user_id)
  6. },

(2)在一般情况下我们要传多个值,与上面的差不多,只是多加了一个&,下面我代码示范

pageA

  1. <navigator url="../index/pageB?user_id='12345678'&user_name='lhs'">index</navigator>

pageB

  1. data: {
  2. user_id:'',
  3. user_name:''
  4. },
  5. onLoad: function (options) {
  6. this.setData({
  7. user_id:options.user_id,
  8. user_name: options.user_name,
  9. })
  10. console.log(this.data.user_id)
  11. console.log(this.data.user_name)
  12. },

(3)当然也可以在js页面传值,比如使用wx.navigateTo、wx.redirectTo等,下面我让大家看看与navigator对应关系

从上面可以看出navigator的open-type="navigate"(不写默认值是navigate)等于wx.navigateTo

好了,我接着使用wx.navigateTo使用传值;首先在pageA绑定一个点击事件

  1. <button catchtap="pageB">index</button>

在事件中写入参数,当然如果是传多个参数的话就要在后面加&

  1. pageB: function () {
  2. wx.navigateTo({
  3. url: '../logs/logs?user_id=' + 520,
  4. })
  5. },

详细:

1、wx.navigateTo:保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。小程序中页面栈最多十层。(可带参)

2、wx.redirectTo:关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。(可带参)

3、wx.switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面(不可带参)

4、wx.reLaunch:关闭所有页面,打开到应用内的某个页面(可带参)

5、wx.navigateBack :关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。(没有url属性,不可带参)

总结:

switchTab这种导航方式,不能带参,也就是说不能通过url进行传参,解决方法就是如果要跳转到tab页面,使用reLaunch方法

2、利用getCurrentPages进行页面传值

(1).getCurrentPages()获取当前页面栈。数组中第一个元素为首页,最后一个元素为当前页面。

pageA:dataFromB和dataFromC都是从pageB和pageC获取的,暂时没有数据

  1. <text class='currentPage'>当前页面:[pageA.wxml]</text>
  2. <view class='container'>
  3. <text>{{name}}</text>
  4. <text>{{dataFromB}}</text>
  5. <text>{{dataFromC}}</text>
  6. </view>
  7.  
  8. <button type = "primary" catchtap='goToPageB'>跳转到pageB</button>

pageA的样式

  1. page{
  2. display: flex;
  3. flex-direction: column;
  4. align-items: center;
  5. height: 100%;
  6. width: 100%;
  7. background: #fff;
  8. }
  9.  
  10. .currentPage{
  11. width: 100%;
  12. height: 80rpx;
  13. padding-left: 150rpx;
  14. background-color: red;
  15. line-height: 80rpx;
  16. color: #fff;
  17.  
  18. }
  19. .container{
  20. width: 600rpx;
  21. height: 300rpx;
  22. background-color: red;
  23. margin-top: 80rpx;
  24. display: flex;
  25. flex-direction: column;
  26. align-items: center;
  27. justify-content: center;
  28. margin-bottom: 80rpx;
  29. color: #fff;
  30. }

pagaA要初始化数据,绑定goTopageB跳转到pageB

  1. data: {
  2. name: '花泽香菜',
  3. dataFromB: '',
  4. dataFromC: ''
  5. },
  6. goToPageB: function () {
  7. // 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。小程序中页面栈最多十层
  8. wx.navigateTo({
  9. url: '../pageB/index',
  10. })
  11. },

pageB:array[index]是传值给pageA的数据,这里绑定goToPageC函数跳到pageC

  1. <text class='currentPage'>当前页面:[pageB.wxml]</text>
  2. <view class='container'>
  3. <!-- <text>{{name}}</text> -->
  4. <picker bindchange="bindPickerChange" value="{{index}}" range="{{array}}">
  5. <view class="picker">
  6. 国籍:{{array[index]}}
  7. </view>
  8. </picker>
  9. </view>
  10.  
  11. <button type = "primary" catchtap='goToPageC'>跳转到pageC</button>

pageB的样式

  1. page {
  2. display: flex;
  3. flex-direction: column;
  4. align-items: center;
  5. height: 100%;
  6. width: 100%;
  7. background: #fff;
  8. }
  9.  
  10. .currentPage {
  11. width: 100%;
  12. height: 80rpx;
  13. padding-left: 150rpx;
  14. background-color: #0ff;
  15. line-height: 80rpx;
  16. }
  17.  
  18. .container {
  19. width: 600rpx;
  20. height: 300rpx;
  21. background-color: #0ff;
  22. margin-top: 80rpx;
  23. display: flex;
  24. align-items: center;
  25. justify-content: center;
  26. margin-bottom: 80rpx;
  27. }

初始化pageB数据,这里是通过getCurrentPages获取页面栈给pageA传值的

  1. data: {
  2. array: ['德国', '日本', '英国', '法国', '比利时'],
  3. },
  4. // 传值
  5. bindPickerChange: function (e) {
  6. let pages = getCurrentPages();
  7.  
  8. let currPage = null; //当前页面
  9. let prevPage = null; //上一个页面
  10.  
  11. if (pages.length >= 2) {
  12. currPage = pages[pages.length - 1]; //最后一个元素为当前页面。
  13. prevPage = pages[pages.length - 2]; //上一个页面
  14. console.log(currPage + "," + prevPage);
  15. }
  16. if (prevPage) {
  17. //给pageA页面赋值
  18. prevPage.setData({
  19. dataFromB: '国籍:' + this.data.array[e.detail.value]
  20. });
  21. }
  22. //给当前页面赋值
  23. this.setData({
  24. index: e.detail.value
  25. })
  26. },
  27. goToPageC: function () {
  28. wx.navigateTo({
  29. url: '../pageC/index',
  30. })
  31. },

pageC:通过绑定goToPageA函数跳回pageA页面

  1. <text class='currentPage'>当前页面:[pageC.wxml]</text>
  2. <view class='container'>
  3. <!-- <text>{{name}}</text> -->
  4. <picker bindchange="bindPickerChange" value="{{index}}" range="{{array}}">
  5. <view class="picker">
  6. 作品:{{array[index]}}
  7. </view>
  8. </picker>
  9. </view>
  10.  
  11. <button type = "primary" catchtap='goToPageA'>跳转到pageA</button>

pageC样式

  1. page {
  2.    display: flex;
  3. flex-direction: column;
  4. align-items: center;
  5. height: 100%;
  6. width: 100%;
  7. background: #fff;
  8. }
  9. .currentPage {
  10. width: 100%;
  11. height: 80rpx;
  12. padding-left: 150rpx;
  13. background-color: pink;
  14. line-height: 80rpx;
  15. }
  16. .container {
  17. width: 600rpx;
  18. height: 300rpx;
  19. background-color: pink;
  20. margin-top: 80rpx;
  21. display: flex;
  22. align-items: center;
  23. justify-content: center;
  24. margin-bottom: 80rpx;
  25. }

初始化数据,这里是通过wx.navigateBack返回pageA,如果使用wx.navigateTo返回pageA是没有传值

  1. /**
  2. * 页面的初始数据
  3. */
  4. data: {
  5. array: ['恋爱循环', '大丈夫'],
  6. },
  7. bindPickerChange: function (e) {
  8. let pages = getCurrentPages();
  9.  
  10. let currPage = null; //当前页面
  11. let prevPage = null; //上一个页面
  12.  
  13. if (pages.length >= 2) {
  14. currPage = pages[pages.length - 1]; //最后一个元素为当前页面。
  15. prevPage = pages[pages.length - 3]; //pageA页面
  16. console.log(currPage + "," + prevPage);
  17. }
  18. if (prevPage) {
  19. //给上一个页面赋值
  20. prevPage.setData({
  21. dataFromC: '代表作品:' + this.data.array[e.detail.value]
  22. });
  23. }
  24. //给当前页面赋值
  25. this.setData({
  26. index: e.detail.value
  27. })
  28. },
  29. goToPageA: function () {
  30. // 关闭当前页面,返回上一页面或多级页面。
  31. wx.navigateBack({
  32. delta:2
  33. })
  34. },

运行效果:

注意:

  • 不要尝试修改页面栈,会导致路由以及页面状态错误。
  • 不要在 App.onLaunch 的时候调用 getCurrentPages(),此时 page 还没有生成。
  • 小程序页面栈最多有十个,多了就不能使用wx.navigateTo跳转

(2)页面栈

从上图可知使用wx.navigateBack页面不断出栈,直到目标返回页;即pageA使用wx.navigateTo跳到pageB,pageB使用wx.navigateTo跳到pageC,pageC使用wx.navigateBack跳到pageA,而页面栈是一路出栈的直到返回pageA,这时页面栈就只有一个pageA

举个例子,pagaA查看页面栈的数量:

总数是1,而这个页面栈就是pageA了

3. globalData全局对象

在 app.js 中定义全局变量

  1. globalData: {
  2. userInfo: null,
  3. globalName:"lhs"
  4. }

在其他页面可以取到全局变量

  1. let app = getApp();
  2. console.log(app.globalData.globalName)

4、数据缓存

数据缓存,类似于cookie,localstorage,sessionstorage等本地缓存的方法,只不过微信小程序有它自己的本地缓存API。当然,为什么非要使用这种方法呢?

当然有第一二种方法不能用的情况,举个例子,同样要将页面A的内容传递给页面B,但是页面B和页面A没有父子页面关系,说简单一点,就是A页面和B页面没有跳转关系,但是B页面就是要从A页面拿数据,前面提到页面带参跳转就没有用了,如果页面层级太多,页面栈的方法也就没有,所以就要用到我们的第三种方法,数据缓存,将页面A的数据本地缓存,然后在B页面的onLoad函数中使用就行

(1)wx.setStorage(OBJECT)和wx.getStorage(OBJECT)(异步接口)

将数据存储在本地缓存中指定的 key 中。会覆盖掉原来该 key 对应的内容。除非用户主动删除或因存储空间原因被系统清理,否则数据都一直可用。单个 key 允许存储的最大数据长度为 1MB,所有数据存储上限为 10MB。

首先在页面A的onload中使用wx.setStorage将要B页面需要的值存储起来,如果需要存储多个值,可以封装成数组或者对象键值对的形式

  1. data: {
  2. info:{'name': '周杰伦',
  3. 'phone': '123456789',
  4. 'address': '台北'}
  5. },
  6. /**
  7. * 生命周期函数--监听页面加载
  8. */
  9. onLoad: function (options) {
  10. var that = this
  11. wx.setStorage({
  12. key: 'information',
  13. data: that.data.info,
  14. success(res){//等同于success:function(res),es6的写法,es6在小程序中都可以使用,推荐使用
  15. 。。。。。。。
  16. }
  17. })
  18. },

在B页面我们只需要使用wx.getStorage()就可以拿到你需要的值了

  1. data: {
  2. name:'',
  3. phone:'',
  4. address:''
  5. },
  6.  
  7. /**
  8. * 生命周期函数--监听页面加载
  9. */
  10. onLoad: function (options) {
  11. var that = this
  12. wx.getStorage({
  13. key: 'information',
  14. success: function(res) {
  15. console.log(res.data)
  16. that.setData({
  17. name: res.data.name,
  18. phone: res.data.phone,
  19. address: res.data.address
  20. })
  21. }
  22. })
  23. },

当然现在我们可以在A页面采取页面跳转跳到B页面看有没有获取到数据,其实也没有必要,答案当然是获取到了

注:这里还有一个同步 wx.setStorageSyncwx.getStorageSync,使用方法一样

 

(2).wx.clearStorage和wx.clearStorageSync(异步,同步清除缓存)

这种方法的弊端就在这儿,清除缓存,什么时候清除合理,都是值得思考的问题
我想一般就是在退出登录的时候执行吧,不能过早,也不能过晚,时机很重要

(3).wx.removeStorage(OBJECT)和wx.removeStorageSync(OBJECT)(异步,同步)

从本地缓存中异步移除指定 key
使用方法和存储数据一样,OK,不多做赘述

(4).wx.getStorageInfo(OBJECT)和wx.getStorageInfoSync(异步,同步)

wx.getStorageInfo异步获取当前storage的相关信息,比如说已经占用了多少存储空间

  1. wx.getStorageInfo({
  2. success: function(res) {
  3. console.log(res.keys)//当前storage中所有的key
  4. console.log(res.currentSize)//当前占用的空间大小, 单位kb
  5. console.log(res.limitSize)//限制的空间大小,单位kb
  6. }
  7. })

wx.getStorageInfoSync()同步获取当前storage的相关信息

  1. try {
  2. const res = wx.getStorageInfoSync()
  3. console.log(res.keys)
  4. console.log(res.currentSize)
  5. console.log(res.limitSize)
  6. } catch (e) {
  7. // Do something when catch error
  8. }

看到这里大家应该注意到,结尾有Sync的为同步。

同异步区别:

1、同步方法会堵塞当前任务,直到同步方法处理返回。
2、异步方法不会塞当前任务。

微信小程序——详细讲解页面传值(多种方法)的更多相关文章

  1. Java Web项目,Android和微信小程序的初始页面配置

    Java Web项目 我们在Eclipse里开了Java Web项目之后,Run As Tomcat或者Apache服务器,本地运行,如果直接用http://localhost:8080访问项目,会发 ...

  2. (十二)微信小程序实现登陆页面+登陆逻辑

    微信小程序实现登陆页面 实现上面两个页面 第一个页面 <view> <!-- 上侧部分 --> <view class="top-view"> ...

  3. 完整微信小程序授权登录页面教程

    完整微信小程序授权登录页面教程 1.前言 微信官方对getUserInfo接口做了修改,授权窗口无法直接弹出,而取而代之是需要创建一个button,将其open-type属性绑定getUseInfo方 ...

  4. 微信小程序自动去除input空格的方法

    当用户输入账号或者密码的时候,可能会有输入空格的情况,但是实际需要是不能够有空格的,所以我们要做一个去除空格,并且适应所有input的name参数的方法,下面请看源码: wxml: <input ...

  5. 微信小程序详细图文教程-10分钟完成微信小程序开发部署发布

    很多朋友都认为微信小程序申请.部署.发布很难,需要很长时间. 实际上,微信和腾讯云同是腾讯产品,已经提供了10分钟(根据准备资源情况,已完成小程序申请认证)完成小程序开发.部署.发布的方式.当然,实现 ...

  6. 微信小程序开发 [02] 页面注册和基本组件

    1.页面注册 既然我们希望跳转到新的页面,那自然要新建页面相关的文件才行.在开篇已经讲过,一个小程序页面由四个文件组成,假如我们的页面名为welcome,那么这四个文件则是: welcome.js w ...

  7. 微信小程序之实现页面缩放式侧滑效果

    效果图: 实现原理:点击按钮,往需要动画的div中添加或移除拥有动画效果的class. 由于微信小程序中不能操作page这个根节点,所以,只有用一个div(view)来模仿page根节点. 1.结构 ...

  8. 微信小程序详解——页面之间的跳转方式【路由】和参数传递

    微信小程序拥有web网页和Application共同的特征,我们的页面都不是孤立存在的,而是通过和其他页面进行交互,来共同完成系统的功能.今天我们来研究小程序页面之间的跳转方式. 1.先导 在Andr ...

  9. 微信小程序从子页面退回父页面时的数据传递 wx.navigateBack()

    我们知道,在微信小程序中,从一个页面转到另一个页面,一般情况下可以通过navigate或redirect时候的url来携带参数,然后在目标页面的onLoad函数参数中获取这些url参数.例如: // ...

随机推荐

  1. 网络安全-主动信息收集篇第二章-二层网络扫描之arping

    arping二层网络发现 介绍工具:arping arping主要查看IP的MAC地址 缺点:工具本身只能ping一个IP地址,不能ping一个IP段.但是可以通过脚本将整个网络中的IP进行扫描. 脚 ...

  2. 8.1 NOIP模拟11

    8.1 NOIP模拟 11 今天上午返校之后,颓了一会,然后下午就开始考试,中午睡着了,然后刚开始考试的时候就困的一匹,我一看T1,woc,这不是之前线段树专题的题啊,和那道题差不多,所以我..... ...

  3. salesforce lightning零基础学习(十四) Toast 浅入浅出

    本篇参考: https://developer.salesforce.com/docs/component-library/bundle/force:showToast/specification h ...

  4. LINQ学习——JOIN

    一.JOIN的作用 1.使用联接来结合两个或更多的集合的数据. 2.联接操作接受两个集合然后创建一个临时的对象集合,每一个对象包含原始集合对象中的所有字段. Note:这里是包含而不是这个原实集合的字 ...

  5. html5 点击播放video的方法

    html5 点击播放video的方法<pre> <video videosrc="{$vo.shipinurl}" controls="" x ...

  6. php mkdir不能创建文件夹的原因

    php mkdir不能创建文件夹的原因 1 权限问题2 open_basedir设置问题 参考方法http://newmiracle.cn/?p=2896

  7. git Lab ssh方式拉取代码失败

    gitLab在linux上已经安装好了, 在配置项目的时候报如下异常 使用http方式没问题, 但是用ssh方式设置repository URL 提示资源库不存在. returned status c ...

  8. nyoj 60-谁获得了最高奖学金 (逻辑判断)

    60-谁获得了最高奖学金 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:8 submit:17 题目描述:     某校的惯例是在每学期的期末考试之 ...

  9. 插入订单并且输出订单号的sql存储过程

    --插入订单-- create proc InsertOrders ( @OrderNumber varchar(300), @OrderState varchar(30), @OrderType v ...

  10. 力扣(LeetCode)位1的个数 个人题解

    编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量). 示例 1: 输入:00000000000000000000000000001011 输出:3 ...