微信小程序如何实现页面传参

目录

前言

路径传递

在onLoad里接收参数

 其他位置获取参数

全局变量

数据缓存

事件通信

使用wx自定义小程序全局方法和全局变量 

总结


前言

只要你的小程序超过一个页面那么可能会需要涉及到页面参数的传递,下面我总结了 n 种页面方法。

路径传递

通过在url后面拼接参数,参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 & 分隔;如 ‘path?key=value&key2=value2’。

在onLoad里接收参数

案例:A页面带参数跳转到B页面
A页面跳转代码

goB(){
    wx.navigateTo({
      url: '/pages/B/index?id=value',
    })
  },

B页面接收代码

onLoad: function (options) {
	console.log('id', options.id)
}

上面的案例是字符串参数,但是很多情况下需要传递对象,如下方代码

Page({
  data: {
    userInfo:{
      name:'cym',
      age:16
    }
  },
  goB(){
    wx.navigateTo({
      url: '/pages/B/index?id='+this.data.userInfo,
    })
  },
})

如果使用上面同样的方式结构,输出的结果是:[object Object]

这个时候需要先把对象通过JSON.stringify(obj)将 object 对象转换为 JSON 字符串进行参数传递,再到接收页面通过JSON.parse解析使用。

A页面跳转代码

 goB(){
    let userStr = JSON.stringify(this.data.userInfo)
    wx.navigateTo({
      url: '/pages/B/index?id='+userStr,
    })
  }

B页面接收代码

onLoad: function (options) {
    console.log('id', JSON.parse(options.id))
  }

 其他位置获取参数

其他位置获取参数及url可以写成工具函数放到utils中:

/*获取当前页url*/
const getCurrentPageUrl=()=>{
  let pages = getCurrentPages()    //获取加载的页面
  let currentPage = pages[pages.length-1]    //获取当前页面的对象
  let url = currentPage.route    //当前页面url
  return url
}
/*获取当前页参数*/
const getCurrentPageParam=()=>{
  let pages = getCurrentPages()    //获取加载的页面
  let currentPage = pages[pages.length-1]    //获取当前页面的对象
  let options = currentPage.options    //如果要获取url中所带的参数可以查看options
  return options
}
module.exports = {
  getCurrentPageUrl,
  getCurrentPageParam
}

 使用

import utils from '../../../utils/util'
 
let url=utils.getCurrentPageUrl()
let options=utils.getCurrentPageParam()

如果options传递的字符串对象过长可能会被截断,可用encodeURIComponent处理一下。

全局变量

通过App全局对象存放全局变量。

app.js代码

App({
 // 存放对象的全局变量
  globalData:{},
})

A页面跳转代码

// 获取App对象
const app = getApp()
Page({
  /**
   * 页面的初始数据
   */
  data: {
    userInfo: {
      name: 'cym',
      age: 16
    }
  },

  goB() {
    app.globalData.userInfo = this.data.userInfo
    wx.navigateTo({
      url: '/pages/B/index',
    })
  },
})

B页面接收代码

// 获取全局对象
 const app = getApp()
Page({

  onLoad: function (options) {
    console.log(app.globalData.userInfo)
  }
})

存放在 App 全局变量里面,可以被多个页面使用,直接从 App 对象获取即可。这个数据是保持在内存中,每次小程序销毁就没有了。

数据缓存

通过存储到数据缓存中。

A页面跳转代码

 goB() {
    wx.setStorageSync('userInfo', this.data.userInfo)
    wx.navigateTo({
      url: '/pages/B/index',
    })
  }

B页面接收代码

 onLoad: function (options) {
    let userInfo = wx.getStorageSync('userInfo', this.data.userInfo)
    console.log(userInfo)
  }

存放在数据缓存里面,可以被多个页面使用,直接用 getStorageSync 获取即可。这个数据是保持在数据缓存中,除非清楚数据缓存或者删除小程序否则一直存在。

事件通信

通过事件通信通道。

A页面跳转代码

goB() {
    wx.navigateTo({
      url: '/pages/B/index',
      success:(res)=>{
				// 发送一个事件
				res.eventChannel.emit('toB',{ userInfo: this.data.userInfo })
			}
    })
  }

B页面接收代码

onLoad: function (options) {
     //	获取所有打开的EventChannel事件
     const eventChannel = this.getOpenerEventChannel();
     // 监听 index页面定义的 toB 事件
     eventChannel.on('toB', (res) => {
       console.log(res.userInfo) 
     })
   }

使用wx自定义小程序全局方法和全局变量 

我们发现小程序API的方法都是挂载到wx这个变量上,全局可以访问到,我们是不是可以将自己自定义的方法或者变量也挂载wx这个变量上呢?

比如我们在app.js上挂载一个变量,然后在index.js上访问

  • app.js
App({
  onLaunch() {
    wx.$data = 'test data'
  }
})
  • index.js
Page({
  onLoad() {
    console.log(wx.$data)
  }
})

  • 控制台打印结果
test data

为了避免与小程序官方定义方法和变量冲突,我们自定义的都加上 $ 标识

比如 wx.$data

再比如 wx.$ajax

wx.$xx可以定义在任何地方,也可以在任何地方使用

总结

大家可以针对具体业务场景来进行选择合适自己的传参方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值