微信小程序页面栈_浅谈下微信小程序中的路由(页面跳转、返回、刷新、页面栈)...
什么是小程序里的“路由”?路由器吗?蒙蔽?好吧,在WEB应用中它其实就是分组数据包从源到目的地时,决定端到端路径的网络范围的进程;在小程序里就是设置页面的跳转,返回,自动刷新等一些功能。
而在微信小程序里,“路由”有很多限制,所以我们在开发小程序的时候,需要深入了解,否则就会掉坑里,被人笑话。微信小程序官方文档里提供了5种:wx.redirectTo(Object object)、wx.reLaunch(Object object)、wx.navigateTo(Object object)、wx.switchTab(Object object)、wx.navigateBack(Object object)。接下来逐个分析下。
wx.redirectTo(Object object)
关闭当前页面,跳转到应用内的某个页面,但是不允许跳转到 tabbar 页面。
参数
Object object属性类型默认值是否必填说明支持版本urlstring是需要跳转的应用内非 tabBar 的页面的路径, 路径后可以带参数。参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 & 分隔;如 'path?key=value&key2=value2'
successfunction否接口调用成功的回调函数
failfunction否接口调用失败的回调函数
completefunction否接口调用结束的回调函数(调用成功、失败都会执行)
说明:这里一定要注意,在使用redirectTo()的时候,不能跳转到底部导航的页面;如果一个页面用了它来跳转,返回后不可逆,因为跳转后直接被关闭,一般用在多个页面的跳转,然后从三级页面,返回到首页【跳级返回】。
不懂?来看个例子。
比如我最近做的一个答题项目需求:首页》答题》成功。这个流程其实是可以可逆的,但是我们要求,答题成功后,返回后,直接到首页,而不是答题页面,那么在答题页面跳转到成功页面就要用到redirectTo。基本的JS写法:wx.redirectTo({
//目的页面地址
url: 'pages/index/index',
success: function(res){
},
...
})
wx.reLaunch(Object object)
关闭所有页面,打开到应用内的某个页面。
参数
Object object属性类型默认值是否必填说明支持版本urlstring是需要跳转的应用内页面路径 , 路径后可以带参数。参数与路径之间使用?分隔,参数键与参数值用=相连,不同参数用&分隔;如 'path?key=value&key2=value2',如果跳转的页面路径是 tabBar 页面则不能带参数
successfunction否接口调用成功的回调函数
failfunction否接口调用失败的回调函数
completefunction否接口调用结束的回调函数(调用成功、失败都会执行)
wx.reLaunch(),用的不是很多,他有一些版本的兼容(支持版本 >= 1.1.0),刚开始接触这个方法的时候,也试了下,点击“获取用户信息”按钮后跳转到首页,刷新首页的数据信息;我也看了网上的一些项目,也有些人类似的做法,你觉得好吗?个人觉得,关闭所有页面,重新打开跳转,不是那么明智,如果是单纯的想是刷新实时数据,可以用其他的方法,比如在onShow()里使用this.onload()等。当然啦,我们不能说它没用,不然开发出来干啥呢,根据需求来决定吧。下面分享下之前做过的一个项目对于wx.reLaunch()的应用,直接上代码:获取授权信息getUserInfo:function(e){
console.log('点击加载+'+e)
app.globalData.userInfo = e.detail.userInfo
let timer = setTimeout(function () {
wx.reLaunch({
url: '/pages/index/index',
fail: function () {
Tools.showModal("支付界面 reLaunch调用失败,请重试");
wx.redirectTo({
url: '/pages/index/index',
})
}
});
}, 500)
this.setData({
userInfo: e.detail.userInfo,
hasUserInfo: true
})
}
说明:点击获取用户信息,然后跳转到首页,大家可以参考下。这里要提醒下的是,从上面的代码可以发现我们用了一个定时器(建议使用),也就是跳转到首页需要0.5S的延时,这个是针对页面的一个加载缓存需要时间,比如调用接口的数据等,当然你可以使用loading预加载。
wx.navigateTo(Object object)
保留当前页面,跳转到应用内的某个页面,但是不能跳到 tabbar 页面。使用 wx.navigateBack 可以返回到原页面。
参数
Object object属性类型默认值是否必填说明支持版本urlstring是需要跳转的应用内非 tabBar 的页面的路径, 路径后可以带参数。参数与路径之间使用 ? 分隔,参数键与参数值用 = 相连,不同参数用 & 分隔;如 'path?key=value&key2=value2'
successfunction否接口调用成功的回调函数
failfunction否接口调用失败的回调函数
completefunction否接口调用结束的回调函数(调用成功、失败都会执行)
wx.navigateTo()用得最多的,可逆转,使用wx.navigateTo接口跳转,原页面保留,这个是跟redirectTo()最大的区别,也就是返回的话,需要一层层的返回,不能跳级返回。具体的用法:wx.navigateTo({
//目的页面地址
url: 'pages/logs/index',
success: function(res){},
...
})
TIPS:跟页面中的A链接差不多。
wx.switchTab(Object object)
跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面。
参数
Object object属性类型默认值是否必填说明支持版本urlstring是需要跳转的 tabBar 页面的路径(需在 app.json 的 tabBar 字段定义的页面),路径后不能带参数。
successfunction否接口调用成功的回调函数
failfunction否接口调用失败的回调函数
completefunction否接口调用结束的回调函数(调用成功、失败都会执行)
说明:跳转到tabBar带参数会掉坑里,需要特殊处理下。拿个网上案例来说明下:toCategory:function(event){
var cate_id = event.currentTarget.dataset.cate_id;
wx.switchTab({
url: '../category/category?cate_id='+cate_id,
});
},
比如,上面一段正常的传参的代码,按照上面写的在category.js里得不到数据的;
onLoad:function(options){
console.log(options);
}
所以我们需要按照官方文档,换一种思路来处理。
跳转的时候在全局变量里设置一个变量cate_id,调到category.js中后.调取全局变量里的cate_id,用完后,再把扎个变量清除掉.具体实施如下:
toCategory:function(event){
var cate_id = event.currentTarget.dataset.cate_id;
app.globalData.cate_id=cate_id;//设置全局变量(app已经定义 var app=getApp())
wx.switchTab({
url: '../category/category'
});
},
分类页category.js中写上这一段:
onLoad:function(options){
var that = this
var cate_id=app.globalData.cate_id
wx.request({
url: app.globalData.httpsurl +'public/index.php?s=product/index',
data:{
cate_id:cate_id,
},
success:function(res){
//清除全局变量cate_id
app.globalData.cate_id=""
that.setData({
alldata:res.data,
})
}
})
},
就可以了。
wx.navigateBack(Object object)
关闭当前页面,返回上一页面或多级页面。可通过getCurrentPages() 获取当前的页面栈,决定需要返回几层。
参数
Object object属性类型默认值是否必填说明支持版本deltanumber是返回的页面数,如果 delta 大于现有页面数,则返回到首页。
successfunction否接口调用成功的回调函数
failfunction否接口调用失败的回调函数
completefunction否接口调用结束的回调函数(调用成功、失败都会执行)
注意:调用navigateTo跳转时,调用该方法的页面会被加入堆栈,而redirectTo方法则不会。见下方示例代码:// 此处是A页面
wx.navigateTo({
url: 'B?id=1'
})
// 此处是B页面
wx.navigateTo({
url: 'C?id=1'
})
// 在C页面内 navigateBack,将返回A页面
wx.navigateBack({
delta: 2
})
navigateBack()也是可以携带参数返回的,我们可以自定义,如何实现呢,看下代码:let pages = getCurrentPages();//当前页面
let prevPage = pages[pages.length-2];//上一页面
prevPage.setData({//直接给上移页面赋值
item: e.currentTarget.dataset.item,
selAddress:'yes'
});
wx.navigateBack({//返回
delta:1
})
回到上一页,在data里定义item,selAddress,然后在onshow里:let pages = getCurrentPages();
let currPage = pages[pages.length-1];
if (currPage.data.selAddress==""){
that.getUserAddress(that.data.userId);
}else{
that.setData({//将携带的参数赋值
address: currPage.data.item
});
}
这只是一个很简单的案例,进一步的知识还要考大家去钻研了。
页面栈
大家可能对上面的一段代码提出疑问,delta是什么东东?OK,这个就相关到另外一个知识点:页面栈。
什么是页面栈呢,简单的说就是页面的层级数,大家都知道,微信小程序最多访问5层,也就是页面栈最多是5。
小程序提供了getCurrentPages()函数获取页面栈,第一个元素为首页,最后一个元素为当前页面。在上面的代码中,有提到过,比如delta:1。
使用wx.navigateTo每新开一个页面,页面栈大小加1,直到页面栈大小为5为止;如果返回页面栈会减1,当然这个只是正常逻辑,有特殊情况?往下看吧。
1、假如使用wx.navigateTo从四级页面跳转到二级页面,此时会在页面栈顶添加一个与二级页面初始状态一样的界面,但两个页面状态是独立的。页面栈大小会加1,如果页面栈大小为5,则wx.navigateTo无效。
2、假如使用wx.redirectTo从四级页面重定向到二级页面,此时会将关闭四级页面,并使用二级页面替换四级页面,但两个页面状态是独立的。此时的页面栈大小不变,请注意和使用wx.navigateTo的区别。
3、假如当前页面为五级页面,使用wx.navigateBack:当delta为1,关闭五级页面,当前页面为四级页面,页面栈大小减1;
当delta为2,关闭依次五级页面和四级页面,当前页面为三级页面,页面栈大小减2;
以此类推,直到栈底为止,也就是首页。
看上去是不是很蒙蔽,不要紧,这个需要慢慢去了解,建议大家自己做个DEMO,然后每次返回或者进入下一页,打印下页面栈,您就会熟悉了。
总结
小程序应用越来越广,我们需要不断的拓展自己的技术面,才能迎合公司业务的发展速度,否则你会被淘汰。
OK,今天分享的内容有点多,初次了解的童鞋可以多花点心思去研究下,我最近做了一些小程序的项目,如果您不懂的可以咨询,不吝赐教咯,然后可以加入我们的QQ群,或者关注我们的微信公众号。
温馨提示:上述内容难免有疏漏之处,如有大神路过,请多赐教。
>>>>国庆和中秋就要来了,最后祝福大家节日快乐,玩的开心,出行注意安全,一定不要霸座哟(^U^)ノ~YO。
微信小程序页面栈_浅谈下微信小程序中的路由(页面跳转、返回、刷新、页面栈)...相关推荐
- python竞赛_浅谈Python在信息学竞赛中的运用及Python的基本用法
浅谈Python在信息学竞赛中的运用及Python的基本用法 前言 众所周知,Python是一种非常实用的语言.但是由于其运算时的低效和解释型编译,在信息学竞赛中并不用于完成算法程序.但正如LRJ在& ...
- 幼儿园案例经验迁移_浅谈在幼儿园数学教学中如何为迁移而教
浅谈在幼儿园数学教学中如何为迁移而教 前言 培养能力.发展智力是我们教学的重要目标,而学习的迁移则可以说是检验教学是否达到这个目标的最可靠的指标.为迁移而教是当今教育界流行的一个很有吸引力的口号.但遗 ...
- mysql cdc采集_浅谈CDC在微服务中的应用
原标题:浅谈CDC在微服务中的应用 CDC(Change Data Capture)是一种通过监测数据变更(变更包括新增.修改.删除等)而对变更的数据进行进一步处理的一种设计模式,通常应用在数据仓库以 ...
- list vue 删除后页面渲染_浅谈Vue项目实战(页面渲染+事件绑定)
页面渲染 vue是不会去操作dom节点,是有数据去操控节点,在js文件数据都在data里 *js代码片* export default { data() { return { formInline: ...
- 小试牛刀_浅谈AspNetPager在三层架构中的使用
AspNetPager第三方分页控件介绍 AspNetPager针对ASP.NET分页控件的不足,提出了与众不同的解决asp.net中分页问题的方案,即将分页导航功能与数据显示功能完全独立开来,由用户 ...
- python应用实例论文_浅谈Python在科学计算中的应用
55 SYS PRACTICE 系统实践 有效的计算工具能为工作提高效率,Python 在实际工作与 科学调研中等运用的也越来越广泛,通过专家不断的研究与分 析,通过 Python 进行科学计算是再合 ...
- python在园林中的应用_浅谈环境艺术在城市园林中的应用
梁仟议华海新 摘要:环境艺术起源于人对自然环境的美化.改善和利用自然改善环境这两种需求.自从人类掌握了种植术后,建立起了菜园.果园.苗圃:学会饲养后,围成了牧园.环境艺术就开始植根于人类这些最早的造园 ...
- java百度地图路线规划_浅谈百度地图WEB开发中的四种路线规划
百度地图在3.0的Javascript api中增加了四种路径规划,分别是:步行.骑行.自驾.公交. 关于路线规划的引用也相当简单,我们以步行为例://实例化地图 var map = new BMap ...
- react如何跳转html页面,react中实现点击跳转到新页面方法
实现点击跳转到新页面,可以有两种形式,一个是本地页面打开,一个是本地页面不变跳转到新的页面. (一)页面点击本地页面打开新页面 引入ant的Button组件 onClick={()=>{wind ...
最新文章
- 小程序云开发获取手机号完整代码 云函数中网络请求第三方接口
- 新装iis 页面503错误 DefaultAppPool停止解决方案
- 网络编程学习笔记(Unix域套接口地址)
- python修改文件内容最后一行_关于python:如何修改文件的最后一行?
- 三层架构---理论篇
- 微型计算机中被处理信息称为,2011海南省计算机等级考试试题 二级C试题考资料...
- 2014_shanghai_visit
- ie6 png不透明的解决方法
- 【个人项目总结】四则运算生成器
- quartz定时任务properties
- 使用POI操作Ecxel文档遇到转化成String类型的电话号码无法转化成Cell类型了
- APP推广有哪些渠道
- 从小白的角度理解二项分布、几何分布和泊松分布
- HDU5438--Ponds (拓排+BFS)
- 大一的java考试试题_华南理工大学大一JAVA复习题
- Java判断手机号格式
- PHP 实现 阿里云 短信发送 功能步骤
- JavaWeb解决form表单刷新提示确认重新提交表单
- 像卡梅拉家族一样神奇的新技能
- 初链TrueChain(TRUE)
热门文章
- matlab GS算法
- JTAG管脚定义及详细说明(转)
- 404网站服务器错误怎么解决方法,网页404状态码应该怎么处理
- 2023最新基于MDUI的API管理系统+UI简约大气/功能强大
- springboot整合websocket使用介绍
- python各库的官方文档(涉及各函数、参数的使用)(pandas、numpy、sklearn)
- 顺序表的基本操作(C语言)
- IDA提取的机器码快速转换方法
- 位图管理、图片下载缓存、管理图片内存 (四) 缓存位图
- gomail发送邮件报:x509: certificate signed by unknown authority的解决方法