在实际开发中,经常会有页面间跳转时需要传递参数的场景,本文回顾一下微信小程序中常用的页面传参方式
演示前的准备
1. 为了方便演示,先创建两个页面,/pages/from/index 和 /pages/to/index ,我们使用简便的创建方式,直接 在 app.json 中为 pages 数组添加两个页面的路径,然后保存,让微信开发者工具自动帮我们创建,重点代码 2 - 5 行:
{
"pages": [
"pages/a/index",
"pages/b/index"
],
"window": {
"backgroundTextStyle": "light",
"navigationBarBackgroundColor": "#fff",
"navigationBarTitleText": "Weixin",
"navigationBarTextStyle": "black"
},
"style": "v2",
"sitemapLocation": "sitemap.json"
}
创建后的结构如下:
1. URL 传参
URL 传参的方式,非常简单常用,当参数不是特别多的时候建议使用:
- 声明 URL 参数,顾名思义,就是将参数写在 URL 中,如
/index?param1=value1¶m2=value2 - 在页面生命周期函数
onLoad(options) 中通过函数参数 options 获取 URL 中的参数,如 options.param1
示例:URL 传参:
1. Form 页面部分
(1) 在页面布局文件中添加链接标签 <navigator> ,并在 url 属性中指定跳转地址,以及拼接待传递的参数:
<navigator url="/pages/to/index?param=B">点击跳转到 To 画面</navigator>
2. To 页面部分
(1) 在页面逻辑文件的在生命周期函数 onLoad(options) 中通过函数参数 options 获取 URL 中的参数:
Page({
data: {
param: ''
},
onLoad(options) {
this.setData({
param: options.param
})
}
})
(2) 页面布局文件中,展示获取的 URL 参数:
<view wx:if="{{param}}">From 画面传递的参数是:{{param}}</view>
3. 运行效果:
2. 向前一画面传参
这种传参的场景是,Form 页面跳转到 To 页面后,又从 To 页面跳回到 Form 页面,这时向 From 页面传参
向前一画面传参的核心点是,在 To 页面中使用 getCurrentPages() 获取 页面跳转记录栈 中的页面组件数组,然后通 过修改前一页面组件的值来实现传参的效果,注意,这种向前一画面传参的方式,要求使用页面组件压栈而非页面组 件卸载的跳转方式
示例:向前一画面传参:
1. Form 页面部分
(1) 在页面逻辑文件中定义接收参数的变量
Page({
data: {
param: ''
}
})
(2) 在页面布局文件中,创建跳转到 To 页面的链接,并在下面展示从 To 页面返回时的参数
<navigator url="/pages/to/index">点击跳转到 To 画面</navigator>
<view wx:if="{{param}}">To 画面传递的参数是:{{param}}</view>
2. To 页面部分
(1) 在页面逻辑文件中定义按钮点击事件的处理函数,在函数中使用 getCurrentPages() 获取 页面跳转记录栈 中前 一个页面的页面组件,并修改页面组件数据,最后通过 wx.navigateBack api 返回到前一画面
Page({
handleTap(){
const pages = getCurrentPages()
const prePage = pages[pages.length - 2]
prePage.setData({
param:'B'
})
wx.navigateBack({
delta: 1,
})
}
})
(2) 在页面布局文件中添加一个按钮,并绑定点击事件和事件处理函数
<button bind:tap="handleTap">点击跳转到 Form 画面</button>
3. 运行效果:
3. 全局变量实现传参
这种方式很简单,直接利用了在 app.js 中定义的变量为全局变量的特性来实现,通过使用微信小程序的缓存功能 也可以实现全局变量传参的效果,原理一样
示例:全局变量实现传参
1. Form 页面部分
(1) 在页面逻辑文件中定义按钮点击事件的处理函数,触发后设置全局变量,最后跳转到目标页面,注意,不管是页 面逻辑文件、组件逻辑文件还是应用逻辑文件,修改自定义的属性都不需要使用 this.setData ,直接修改即可:
Page({
handleTap() {
const app = getApp()
console.log(app)
app.param = 'A'
wx.navigateTo({
url: '/pages/to/index',
})
}
})
(2) 在页面布局文件中添加按钮,并绑定事件和事件处理函数:
<button bind:tap="handleTap">点击跳转到 To 画面</button>
2. To 页面部分
(1) 在页面逻辑文件中,定义生命周期函数,在函数内获取全局变量:
Page({
data: {
param: ''
},
onLoad() {
const app = getApp()
this.setData({
param: app.param
})
}
})
(2) 在页面布局文件中,展示参数:
<view wx:if="{{param}}">From 画面传递的参数是:{{param}}</view>
(3) 运行效果:
4. 发布事件
在使用微信小程序内置 api wx.navigateTo 进行跳转时,会有一个 success(res) 函数的回调,回调函数的参 数 res 中有一个 eventChannel 对象,该对象是页面间事件通信对象,可以利用该对象发布一个自定义事件, 并在目标页中对该事件进行监听
示例:发布事件
1. Form 页面部分
(1) 在页面逻辑文件中定义按钮点击事件的处理函数,在函数内使用 wx.navigateTo 进行页面跳转,并在 success 回 调函数内发布一个自定义事件
Page({
handleTap() {
wx.navigateTo({
url: '/pages/to/index',
success(res){
res.eventChannel.emit('myEvent',{param:'A'})
}
})
}
})
(2) 在页面布局文件中添加按钮,并绑定事件和事件处理函数:
<button bind:tap="handleTap">点击跳转到 To 画面</button>
2. To 页面部分
(1) 在页面逻辑文件中,定义生命周期函数 onLoad ,并在函数内监听 Form 页面发布的自定义函数:
Page({
data: {
param: ''
},
onLoad() {
const eventChannel = this.getOpenerEventChannel()
eventChannel.on('myEvent',(req)=>{
this.setData({
param: req.param
})
})
}
})
(2 在页面布局文件中,展示参数:
<view wx:if="{{param}}">From 画面传递的参数是:{{param}}</view>
3. 运行效果:
|