微信小程序新手教程之启动页的重要性


Posted in Javascript onMarch 03, 2019

前言

启动页在APP中是个很常见的需求,为什么对于小程序来说也非常重要呢?首先我描述一下我在开发过程中遇到的一些问题以及解决的步骤,到最后为什么要加启动页,看完你就明白了。

小程序的首页需要展示用户关注的小区信息,意味着一打开小程序我就得先执行登录的逻辑,只有登录了之后才能获取用户关注的小区信息。

在小程序启动的时候自动登录,目前没获取用户信息,所以不需要用户授权,这个逻辑放在根目录下的app.js的onLaunch方法中。只要启动小程序就会执行onLaunch方法。

做完之后发现了一个很严重的问题,就是app.js的onLaunch方法确实会在小程序启动的时候执行,但是首页也会是在app.json文件的pages中第一个页面也会同时执行,它不是阻塞的。会导致一个问题就是首页获取关注信息执行完了,登录的逻辑还没完,获取不到正确的数据。

于是把登录的逻辑放到首页的onLoad方法中执行,在登录成功之后再去获取关注的数据,这样就能解决上面说的问题了。

后面又有一个需求,就是分享功能,分享出去的页面中也需要用到用户信息,这个就尴尬了,分享出去的页面,用户进入的时候还是进入的这个页面,不会执行首页的逻辑,是拿不到用户信息的。

后面想了下,还是增加一个启动页来做中转吧,登录的逻辑还是放到app.js中,只要小程序启动了就可以执行,无论是第一次进入还是通过分享的页面进入,都可以自动登录。

问题是如何实现阻塞功能,就是登录之后再去跳转到其它的页面,思路就是通过定时器的方式去检测登录状态,成功了之后再跳转。

分享也是一样,分享出去的地址不再是本页面的地址,而是启动页的地址,带一个参数,这个参数才是本页面的地址,当用户点击分享的小程序进入之后会先进入启动页,启动页中获取参数,等待登录逻辑执行完成之后,再根据参数跳转到分享的页面。

启动页代码:

onLoad: function (e) {
 var url = '/pages/index/index'
 // 分享页面参数解码
 if (e.page != undefined && e.page != "") {
  url = decodeURIComponent(e.page)
 }
 var count = 0; 
 var inter = setInterval(() => {
  count++;
  if (count > 1000) {
  clearInterval(inter);
  wx.showToast({
   title: "网络异常,请重启小程序",
   icon: 'none',
   duration: 2000
  })
  return;
  }
  var token = wx.getStorageSync("login_token");
  if (token != null && token != "") {
  clearInterval(inter);
  // 跳转到toolbar
  if (url == "/pages/index/index" || url == "/pages/city/cityAll/cityAll") {
   wx.switchTab({
   url: url
   })
  } else {
   // 跳转到普通页面
   wx.navigateTo({
   url: url,
   })
  }
  
  }
 },10);
 }

当检查超过10秒钟,登录信息还获取不到的时候就会给出提示,后续会加上一个让用户手动授权登录的页面。

这种方式勉强能实现需求,但不是最好的方式,问题一看就知道了,如果加了启动页,意味着所有的入口都变成了启动页,就没有必要通过定时去检测了,直接将登录的逻辑放到启动页中来执行,在success中在做跳转的逻辑,这样的方式才是最好的,具体代码我就不贴出来,大家明白就好。

具体的分享页面代码:

onShareAppMessage: function () {
 let that = this
 var page = encodeURIComponent('/pages/district/districtDetail/districtDetail?city=' + that.data.city + '®ion=' + that.data.region + '&districtName=' + that.data.districtName + '&estateType=' + that.data.estateType + "&isshare=1")
 return {
  title: '小区详情',
  path: '/pages/startPage/startPage?page='+page
 }
 }

重点关注isshare=1这个参数,当直接打开分享的页面时,用户点击左上角的返回按钮,基于现有的逻辑会退回到启动页,因为是从启动页中转过来的,这是有问题的,要么就去掉这个返回按钮,要么就返回到首页。

所以对于分享的页面带了一个参数识别,当是从分享页面进来的时候返回就到首页面。具体逻辑在页面的onUnload函数中,在页面卸载的时候进行跳转:

if (this.data.isshare == 1) {
  wx.switchTab({
  url: '/pages/index/index'
  })
}

以上就是启动页的作用以及需要启动页的一些背景,第一次开发小程序,总会碰到很多问题。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
基于jquery用于查询操作的实现代码
May 10 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
Dec 11 Javascript
25个好玩的JavaScript小游戏分享
Apr 22 Javascript
jQuery中:button选择器用法实例
Jan 04 Javascript
使用javascript实现雪花飘落的效果
Jan 13 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
Mar 21 Javascript
js操作数据库实现注册和登陆的简单实例
May 26 Javascript
AngularJS基础 ng-submit 指令简单示例
Aug 03 Javascript
javascript数字验证的实例代码(推荐)
Aug 20 Javascript
Node.js 中exports 和 module.exports 的区别
Mar 14 Javascript
js字符串倒序的实例代码
Nov 30 Javascript
Vue 设置axios请求格式为form-data的操作步骤
Oct 29 Javascript
微信小程序新手教程之页面打开数量限制
Mar 03 #Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
Mar 02 #Javascript
JS+php后台实现文件上传功能详解
Mar 02 #Javascript
JS事件绑定的常用方式实例总结
Mar 02 #Javascript
JS实现获取数组中最大值或最小值功能示例
Mar 02 #Javascript
JS使用队列对数组排列,基数排序算法示例
Mar 02 #Javascript
VUE引入第三方js包及调用方法讲解
Mar 01 #Javascript
You might like
一个php作的文本留言本的例子(五)
2006/10/09 PHP
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
php下网站防IP攻击代码,超级实用
2010/10/24 PHP
PHP文件读写操作之文件读取方法详解
2011/01/13 PHP
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
对setInterval在火狐和chrome切换标签产生奇怪的效果之探索,与解决方案!
2011/10/29 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
new Date()问题在ie8下面的处理方法
2014/07/31 Javascript
jQuery中toggle()函数的使用实例
2015/04/17 Javascript
wangEditor编辑器失去焦点后仍然可以在原位置插入图片分析
2015/05/06 Javascript
jquery Banner轮播选项卡
2016/12/26 Javascript
Javascript中的作用域及块级作用域
2017/12/08 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
layer弹出层取消遮罩的方法
2019/09/25 Javascript
vue+element-ui JYAdmin后台管理系统模板解析
2020/07/28 Javascript
pip 错误unused-command-line-argument-hard-error-in-future解决办法
2014/06/01 Python
python端口扫描系统实现方法
2014/11/19 Python
python中黄金分割法实现方法
2015/05/06 Python
浅谈python socket函数中,send与sendall的区别与使用方法
2017/05/09 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
python3实现mysql导出excel的方法
2019/07/31 Python
Python爬虫爬取百度搜索内容代码实例
2020/06/05 Python
python 爬虫如何正确的使用cookie
2020/10/27 Python
如何利用python 读取配置文件
2021/01/06 Python
美国最古老的精致书写工具制造商:A.T. Cross(高仕)
2018/01/30 全球购物
印度在线购物网站:Paytmmall
2019/07/24 全球购物
Hotels.com泰国:酒店预订网站
2019/11/20 全球购物
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
远程教育心得体会
2014/01/03 职场文书
学生会部长竞聘书
2014/03/31 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
排球赛新闻稿
2015/07/17 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
nginx配置proxy_pass中url末尾带/与不带/的区别详解
2021/03/31 Servers
Pygame Time时间控制的具体使用详解
2021/11/17 Python