目录
前言
只要你的小程序超过一个页面那么可能会需要涉及到页面参数的传递,下面我总结了 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({
onl oad: function (options) {
console.log(app.globalData.userInfo)
}
})
存放在 App 全局变量里面,可以被多个页面使用,直接从 App 对象获取即可。这个数据是保持在内存中,每次小程序销毁就没有了。
数据缓存
通过存储到数据缓存中。
A页面跳转代码
goB() {
wx.setStorageSync('userInfo', this.data.userInfo)
wx.navigateTo({
url: '/pages/B/index',
})
}
B页面接收代码
onl oad: 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({
onl oad() {
console.log(wx.$data)
}
})
- 控制台打印结果
test data
为了避免与小程序官方定义方法和变量冲突,我们自定义的都加上 $ 标识
比如 wx.$data
再比如 wx.$ajax
wx.$xx可以定义在任何地方,也可以在任何地方使用
总结
大家可以针对具体业务场景来进行选择合适自己的传参方式。
标签:传参,url,微信,userInfo,页面,data,options,wx From: https://blog.csdn.net/qq_63358859/article/details/141120893