详解使用mpvue开发github小程序总结


Posted in Javascript onJuly 25, 2018

前言

最近有点闲,想起关注已久的mpvue写小程序,所以稍微肝了半个多月写了个github版的微信小程序,已上线。现在总结一下遇到的坑。

扫码体验、

详解使用mpvue开发github小程序总结

项目地址https://github.com/cheesekun/wx-github

详解使用mpvue开发github小程序总结

mina坑

scroll-view 高度

可滚动视图区域。

使用竖向滚动时,需要给<scroll-view/>一个固定高度,通过 WXSS 设置 height。

小程序提供的scroll-view组件,想让他能滚动,就要给他提供一个固定的高度。

我们一般需求是,上一块区域固定,下一块区域可滚动,我的处理方法是,拿到机型的可视高度,减去上一块固定区域的高度,动态赋值scroll-view最终高度。

// 以 search 页为例
// 滚动区域高度 = 总高度 - 搜索框高度 - tabs 高度
onLoad () {
 wx.getSystemInfo({
 success: (res) => {
  this.height = res.windowHeight // 获取机型可视高度
 }
 })

 let query = wx.createSelectorQuery()
 // 选择id
 query.select('#search').boundingClientRect()

 query.exec(res => {
 let searchH = res[0].height // 获取search框高度
 this.height = this.height - searchH - this.tabsH
 })
}

坑点:wx.createSelectorQuery()获取不了display: none的元素高度。

我的解决方法是:在trending页获取到tabs组件的高度,再存放到vuex中,给search页使用

生命周期(同一page携带不同参数)

当我们从一个页面①进入页面②时,我们一般在onLoad进行初始数据的获取,

从页面②返回到页面①时,若两个页面是不同的page,如①为page/info,

②为page/repo,那没问题,①页面unOnLoad,②页面onShow

但是若①为page/info?user=a,②为page/info?user=b,那gg了,从页面②返回到页面①,页面①的数据会变成页面②的数据

为了避免这种情况,我一开始使用onShow代替onLoad,也就是在onShow的时候获取页面的初始数据。但是这个情况就有点可怕了,我们知道onShow很多情况都会触发到,切换前后台,从一个页面返回到另一个,都会触发onShow,这就导致会触发很多不必要的请求,而且用户体验极差。

可我很多需求就是类似从①为page/info?user=a到②为page/info?user=b,因此曲线救国想出用vuex维护有相关需求页面的路由栈。

页面onLoad的时候,推入query参数到栈中,onShow时,若当前页面的参数和栈中最后一个元素相同,则不重新加载数据。当页面被销毁,则在onUnload中把相应的页面栈推出。这样就可以避免很多无谓的onShow请求。

onLoad () {
 this.reset()
 const options = getQuery()
 user = options.login
 // vuex
 this.reposStack.push(options)

 this.getRepos()
 },
 onShow () {
 const options = getQuery()
 // vuex
 let reposStack = JSON.parse(JSON.stringify(this.reposStack))
 let len = reposStack.length
 let endStack = reposStack[len - 1]
 if (JSON.stringify(endStack) === JSON.stringify(options)) {
  return
 }
 this.reset()
 user = options.login
 this.getRepos()
 },
 onUnload () {
 // vuex
 this.reposStack.slice(0, -1)
 }

mpvue坑

query参数

mpvue可以通过 this.$root.$mp.query 在所有页面的组件内获取路径参数。

如果以mina来说的话,我们是通过在生命周期onLoad(options),拿到options上携带的路径参数,mpvue提供了this.$root.$mp.query ,我们可以所有生命周期上使用。

但是我们知道,当我们从当前页返回到上一页时,上一页并不会执行onLoad(),

假设当前页和上一页是同个page,只是携带参数不同的话,此时回退到上一页,

上一页的this.$root.$mp.query不会变成自己的query,还是会变成当前页的query

举例:①page/info?a=1 => ②page/info?b=2

当我从②返回到①时,①的this.$root.$mp.query会变成{b:2}

我猜mpvuethis.$root.$mp.query是通过onLoad(options)获取到options,再赋值。但是遇到小程序页面返回不会执行onLoad

为了避免麻烦,我直接使用了小程序的api getCurrentPages(),获取路由栈中最后一个路由的参数

getCurrentPages() 函数用于获取当前页面栈的实例,以数组形式按栈的顺序给出,第一个元素为首页,最后一个元素为当前页面。
/**
 * 获取当前路径参数
 * 不用mpvue提供的this.$root.$mp.query
 * 因为其进入同一页面,参数不会变化
*/
export function getQuery () {
 /* 获取当前路由栈数组 */
 const pages = getCurrentPages()
 const currentPage = pages[pages.length - 1]
 const options = currentPage.options

 return options
}

后记

前面几个问题是我初次使用mpvue开发小程序遇到的最大的坑了吧。(好久没有写东西了,写得好烂。)不过确实使用mpvue开发小程序,能组件化,支持npm,比原生开发舒服很多。体验还是很好的。

小程序现在是真的太火了。感觉是个前端都要去玩一下。

再次推一下项目地址,有兴趣的朋友可以参考一下。https://github.com/cheesekun/wx-github

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Extjs Ajax 乱码问题解决方案
Apr 15 Javascript
js 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
JavaScript加入收藏夹功能(兼容IE、firefox、chrome)
May 05 Javascript
JS Canvas定时器模拟动态加载动画
Sep 17 Javascript
js实现符合国情的日期插件详解
Jan 19 Javascript
Bootstrap Table使用整理(五)之分页组合查询
Jun 09 Javascript
JavaScript生成图形验证码
Aug 24 Javascript
Angularjs的$http异步删除数据详解及实例
Jul 27 Javascript
Vue-Cli中自定义过滤器的实现代码
Aug 12 Javascript
Vue中div contenteditable 的光标定位方法
Aug 25 Javascript
Element-UI中Upload上传文件前端缓存处理示例
Feb 21 Javascript
JavaScript如何利用Promise控制并发请求个数
May 14 Javascript
详解mpvue开发小程序小总结
Jul 25 #Javascript
Bootstrap table表格初始化表格数据的方法
Jul 25 #Javascript
JS实现用特殊符号替换字符串的中间部分区域的实例代码
Jul 24 #Javascript
微信小程序实现图片上传放大预览删除代码
Jun 28 #Javascript
vue实现底部菜单功能
Jul 24 #Javascript
vue 下列表侧滑操作实例代码详解
Jul 24 #Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 #Javascript
You might like
在任意字符集下正常显示网页的方法二(续)
2007/04/01 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
php curl获取网页内容(IPV6下超时)的解决办法
2013/07/16 PHP
php的RSA加密解密算法原理与用法分析
2020/01/23 PHP
javascript基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
2008/08/05 Javascript
使用JS或jQuery模拟鼠标点击a标签事件代码
2014/03/10 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
精彩的Bootstrap案例分享 重点在注释!(选项卡、栅格布局)
2016/07/01 Javascript
Vue 固定头 固定列 点击表头可排序的表格组件
2016/11/25 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
js实现淡入淡出轮播切换功能
2017/01/13 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
IE11下CKEditor在Bootstrap Modal中下拉问题的解决
2019/09/25 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
微信小程序实现树莓派(raspberry pi)小车控制
2020/02/12 Javascript
[47:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第二场 3月4日
2021/03/11 DOTA
Python中for循环详解
2014/01/17 Python
Python实现从订阅源下载图片的方法
2015/03/11 Python
Python实现简单多线程任务队列
2016/02/27 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
与Django结合利用模型对上传图片预测的实例详解
2019/08/07 Python
python模拟斗地主发牌
2020/04/22 Python
Python实现自动签到脚本功能
2020/08/20 Python
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
Wojas罗马尼亚网站:波兰皮鞋品牌
2018/11/01 全球购物
安全生产承诺书范文
2014/05/22 职场文书
资源环境与城乡规划管理专业自荐书
2014/09/26 职场文书
优秀教师申报材料
2014/12/16 职场文书
国际贸易实训总结
2015/08/03 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
Java面试题冲刺第十九天--数据库(4)
2021/08/07 Java/Android
阿里云k8s服务升级时502错误 springboot项目应用
2022/04/09 Servers
Python实现双向链表基本操作
2022/05/25 Python
Go调用Rust方法及外部函数接口前置
2022/06/14 Golang
hive数据仓库新增字段方法
2022/06/25 数据库