微信小程序传参的五种方式

news2024/12/29 2:01:27

在这里插入图片描述

文章目录

  • 前言
  • 一、URL参数传递
    • 1.api跳转
    • 2.组件跳转
  • 二、Storage本地存储
  • 三、全局变量globalData
  • 四、页面跳转时传参
  • 五、页面栈传参
  • 总结
  • 结语


前言

大家好,今天和大家分享一下微信小程序页面之间传参的五种方式,这个的话也是有人问了我一嘴,然后现在我和大家分享一下。
使用GPT搜索的话给我的答案是纯文字的描述,但是大致就是这样:

  1. URL参数传递:可以将参数直接拼接在页面的URL中,在打开目标页面时,通过获取URL的query参数来获取传递的数值。
  2. Storage本地存储:可以使用小程序提供的Storage API,将参数存储在本地缓存中,然后在目标页面读取并使用。
  3. 全局变量:可以在小程序的App全局对象中定义一个全局变量,在页面间进行传递和访问。在源页面设置变量值,在目标页面获取变量值。
  4. 页面跳转时传参:使用小程序提供的导航API(如navigateTo、redirectTo等)进行页面跳转时,可以通过在跳转API的url参数中传递数据,目标页面可以通过获取跳转API的options参数来获取传递的数据。
  5. 页面栈传参:小程序提供了页面栈的概念,可以通过页面栈来传递参数。在源页面使用navigateTo或redirectTo等导航方法打开目标页面时,可以在导航方法的参数中传递参数,目标页面可以通过页面栈的相关API(如getCurrentPages等)获取来源页面的参数。

一、URL参数传递

url上直接携带参数长度是有限的且不支持特殊符号,可用编码、解码的方式解决

1.api跳转

代码示例:

// pagea.js
//跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面
wx.switchTab({
    url:'/pageb?id=1',
})
//关闭所有页面,打开到应用内的某个页面
wx.reLaunch({
  url: '/pageb?id=1',
})
//关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面
wx.redirectTo({
  url: '/pageb?id=1',
})
//保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。
wx.navigateTo({
  url: '/pageb?id='+ encodeURIComponent(this.data.id),
})
//以上四种路由方式在传参和接参上没有任何区别

// pageb.js
Page({
  //地址传参带过来的参数只能在该方法的options参数中获取
  onLoad:function(options){
    console.log(decodeURIComponent(options.id)) //'1' ,无论传的变量是数字、布尔还是对象接收的时候都是字符串
  },
})

2.组件跳转

代码示例:

// pagea.wxml
<view>
  <navigator open-type="switchTab" url="/pageb?id=1">跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面</navigator>
  <navigator open-type="reLaunch" url="/pageb?id=1">关闭所有页面,打开到应用内的某个页面</navigator>
  <navigator open-type="redirectTo" url="/pageb?id=1">关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面</navigator>
  <navigator open-type="navigateTo" url="/pageb?id=1">保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面</navigator>
</view>
//以上四种路由方式在传参和接参上没有任何区别
// pageb.wxml
Page({
  //地址传参带过来的参数只能在该方法的options参数中获取
  onLoad:function(options){
    console.log(options.id) //'1' ,无论传的变量是数字、布尔还是对象接收的时候都是字符串
  },
})

二、Storage本地存储

storage是微信分给每个小程序的缓存,单个参数最大1M,数据总和最大10M。
代码示例:

// pagea.js
Page({
    data:{
        name:'xiaosun'    
    },
})
//只支持原生类型、Date、及能够通过JSON.stringify序列化的对象
wx.setStorageSync('name',this.data.name)

// pageb.js
console.log(wx.getStorageSync(name)) //xiaosun

三、全局变量globalData

globalData是小程序app.js中固定的一个属性,存储的数据可在全项目任意处使用
代码示例:

// app.js
App({
  globalData:{},
})

// pagea.js
const app = getApp();
app.globalData.name='xiaosun';

// pageb.js
const app = getApp();
console.log(app.globalData.name) //xiaosun

四、页面跳转时传参

通信通道是wx.navitageTo()独有的
代码示例:

// pagea.js
wx.navigateTo({
  url: '/pageb?id=1',
  events: {
    // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
    acceptDataFromOpenedPage: function(data) {//参数名字随便起,前后页面对应上即可
    //对发送回来的数据进行处理
      console.log(data)
    },
    someEvent: function(data) {//参数名字随便起,前后页面对应上即可
      console.log(data)
    }
  },
  success: function(res) {
    // 通过eventChannel向被打开页面传送数据
    res.eventChannel.emit('acceptDataFromOpenerPage', { data: 'test' })//参数名字随便起,前后页面对应上即可
  },
})

//pageb.js
Page({
  onLoad: function(option){
    //获取通信通道
    const eventChannel = this.getOpenerEventChannel()
    // 监听acceptDataFromOpenerPage事件,获取上一页面通过eventChannel传送到当前页面的数据
    eventChannel.on('acceptDataFromOpenerPage', function(data) {
        //对发送过来的数据进行处理
      console.log(data)
    })
    //向上一页面发送数据
    eventChannel.emit('acceptDataFromOpenedPage', {data: 'test'});
    eventChannel.emit('someEvent', {data: 'test'});
  },
})

五、页面栈传参

只对当前页面栈中存在的页面生效
代码示例:

// pagea.js
Page({
  data:{
    name:'xiaosun',
    age:22
  },
  eatFood:function(food){
    console.log('eating '+ food)    
  },
})

// pageb.js
Page({
  onLoad: function (options) {
    //获取当前页面栈
    const pages = getCurrentPages();
    //获取上一页面对象
    let prePage = pages[pages.length - 2];
    console.log(prePage.data.name) //'xiaosun'
    prePage.eatFood('apple')//eating apple
  },
})

总结

  1. globalData与storage原理相同都是将数据放在一个公共的地方全应用随意取用,但是他们的数据不推送也不关联,即globalData和storage中的数据更新了,但已经获取过值的页面其对应的值并 不会更新。
    解决办法:将各页面获取值的事件放到onShow()中,每次页面进入前台的时候都会重新从globalData和storage中取值。
  2. 路由携带参数简单方便,但是地址长度有限不能携带大量参数和特殊符号。
    解决办法:在传参之前进行编码encodeURIComponent(),接收的时候进行解码 decodeURIComponent()。如此大量参数可以携带但是只能单方面传递参数,即只能a向b传,反之则不行。
  3. 通信通道,页面可以互相传参,但是该通道仅存在于wx.navagateTo()的接口调用时才有效。
  4. 页面栈,这是一个极其强大功能,它本质上不是向页面传参而是直接修改页面参数和方法。通过页面栈我们可以拿到该页面的对象,然后就可以对该页面的各项数据和函数进行操作。但是这种方法只能在b页面去操作a页面,并不能在a页面操作b页面,因为此时页面栈中还没有b。并且该方法也仅限于通过wx.navagateTo()或 跳转 这两种方式进入b页面才可使用,因为其他方式跳转到b页面时已经销毁了其他所有页面,页面栈中已经没有上一个页面了。

结语

以上就是本章的全部内容了,希望能够帮助到您,同时也希望我有写错的地方可以指出,谢谢!
在这里插入图片描述

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

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

相关文章

Python进阶复习-文件与异常

目录 文件打开文件路径打开模式字符编码 文件读取逐行读取读取所有行 文件写入既读又写两种数据存储结构csv文件json文件 程序异常Exception万能捕捉 文件打开 文件路径 完整路径 with open("E:\hello.txt", "r", encoding"UTF-8") as file:c…

Socks5与HTTP的区别与应用场景

在网络访问中&#xff0c;代理服务器扮演着重要角色&#xff0c;用于保护用户隐私、提高访问速度等。Socks5代理和HTTP代理是两种常见的代理协议&#xff0c;它们在功能和应用场景上有所不同。本文将深入解析Socks5代理和HTTP代理的区别&#xff0c;帮助您更好地了解并选择适合…

Linux 信号捕捉函数 signal sigaction

signal函数 #include <signal.h> typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); 功能&#xff1a;设置某个信号的捕捉行为 参数&#xff1a; -signum&#xff1a;要捕捉的信号 handler&#xff1a;对捕捉到的信号怎么处理…

安装了多个版本VS导致无法安装vsix

如&#xff0c;先后安装了VS2015、VS2019&#xff0c;现在想给VS2015安装一个qt-vsaddin插件&#xff0c;运行vsix报错 “View Install Log”里显示 2023/9/19 10:03:46 - 正在搜索适用的产品... 2023/9/19 10:03:46 - 找到的已安装产品 - Microsoft Visual Studio Ultimate …

中标麒麟--国产操作系统-九五小庞

那么&#xff0c;我国国产操作系统现状到底如何呢&#xff1f; 自 1999 年徐冠华部长一语点破我们的产业软肋之后&#xff0c;国产操作系统起步于国家“七五”计划期间&#xff0c;目前国产操作系统均是基于Linux内核进行的二次开发&#xff0c;中国国产操作系统进入Linux元年…

多线程详解(上)

文章目录 一、线程的概念1&#xff09;线程是什么2&#xff09;为甚要有线程&#xff08;1&#xff09;“并发编程”成为“刚需”&#xff08;2&#xff09;在并发编程中, 线程比进程更轻量. 3&#xff09;线程和进程的区别 二、Thread的使用1&#xff09;线程的创建继承Thread…

【随想】每日两题Day.7

题目&#xff1a;面试题 02.07.链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 …

Excel中的宏、VBA

一、宏是什么&#xff1f; EXCEL MACRO 是一种记录和播放工具&#xff0c;它仅记录您的 Excel 步骤&#xff0c;并且宏将根据需要播放任意多次。 VBA 宏可自动执行重复任务&#xff0c;从而节省了时间。 这是一段可在 Excel 环境中运行的编程代码&#xff0c;但您无需成为编码…

EtherCAT 总线型 4 轴电机控制卡解决方案

 技术特点  支持标准 100M/s 带宽全双工 EtherCAT 总线网络接口及 CoE 通信协议一 进一出&#xff08;RJ45 接口&#xff09;&#xff0c;支持多组动态 PDO 分组和对象字典的自动映射&#xff0c;支持站 号 ID 的自动设置与保存&#xff0c;支持 SDO 的电机参数设置与…

设计模式之解析器(Interpreter)的C++实现

1、解析模式的提出 在软件开发的过程中&#xff0c;需要实现一种需求&#xff0c;该需求的结构稳定&#xff0c;但是需求的业务内容会频繁变化&#xff0c;如果使用普通语法实现需求&#xff0c;需要经常更新代码&#xff0c;不具有灵活性。可以使用解析器模式解决实现该类需求…

css花字效果

<div data-subtitle"春江潮水连海平" class"colorText">春江潮水连海平</div>.colorText{font-family:ZhanKuKuaiLeTi2016XiuDingBan;font-size: 50px;font-weight: bold;position: relative;background-image: linear-gradient(90deg,#A1B3FB…

同步 -- 自旋锁

基础学习--原子操作 typedef struct {int counter; } atomic_t;static __always_inline void atomic_set(atomic_t *v, int i) {instrument_atomic_write(v, sizeof(*v));raw_atomic_set(v, i); }static __always_inline void raw_atomic_set(atomic_t *v, int i) {arch_atomic…

集丰照明|别墅设计:从空间规划到奢华元素的精心打造

当人们谈论别墅时&#xff0c;总会不自觉地与豪华、舒适、私人空间等词汇联系在一起。确实&#xff0c;别墅作为一种住宅形式&#xff0c;其设计不仅需要满足基本的生活需求&#xff0c;更要有独特的风格和品味。本文将从别墅设计的各个方面进行探讨&#xff0c;带您领略从空间…

uni-app:通过三目运算动态增加样式效果(class)

效果 代码 第一条&#xff1a;当变量line的值等于abc时&#xff0c;class就等于yes,反之class等于no&#xff08;显然等于abc&#xff0c;执行yes,前景色为红色&#xff09; 第一条&#xff1a;当变量line1的值等于abc时&#xff0c;class就等于yes,反之class等于no&#xff…

【实验】H3C校园双出口配置案例,可跟做!

【微|信|公|众|号&#xff1a;厦门微思网络】 1.案例拓补 该拓扑图中的校园网内部分为两个网段&#xff1a;一个为学生校舍网段&#xff08;192.168.2.0&#xff09;&#xff0c;主要访问电信提供的internet服务器&#xff1b;另外一个网段为校园办公和教学用网段&#xff08;…

python 第一次作业

1.使用turtle换一个五环 2.设计这样一个程序&#xff1a;输入一个数字 判断它是不是一个质数 使用turtle换一个五环&#xff1a; >>> import turtle #导入模块 >>> turtle.width(10) #设置圆圈宽度 >>> turtle.color("blue&qu…

DC电源模块具有不同的安装方式和安全规范

BOSHIDA DC电源模块具有不同的安装方式和安全规范 DC电源模块是将低压直流电转换为需要的输出电压的装置。它们广泛应用于各种领域和行业&#xff0c;如通信、医疗、工业、家用电器等。安装DC电源模块应严格按照相关的安全规范进行&#xff0c;以确保其正常运行和安全使用。 D…

快速上手Linux基础开发工具

目录 软件包管理器 概念理解 用法示例 - 以yum为例 vim 模式的切换 常用操作 插件和配置 gcc/g gdb make / makefile 软件包管理器 概念理解 在Linux下安装软件的话&#xff0c;一个比较原始的办法是下载程序的源代码&#xff0c;然后进行编译&#xff0c;进而得到…

vscode 无法使用 compilerPath“D:.../bin/arm-none-eabi-g++.exe”解析配置。

最近在使用vscode搭建ODrive STM32开发环境,依次安装了以下内容: 1.Python3: 用于运行工程构建脚本 2.ST-Link/V2 Drivers: STLink/v2编程器的驱动 3.Visual Studio Code: 轻量级但功能强大的源代码编辑器 …

Python的简单使用与应用

在当今互联网时代&#xff0c;网络爬虫成为了获取数据的重要工具之一。而使用代理IP进行爬虫操作&#xff0c;则是提高爬虫效率、绕过访问限制的利器。本文将向大家介绍Python代理IP爬虫的简单使用&#xff0c;帮助大家了解代理IP的原理、获取代理IP的方法&#xff0c;并探索其…