详解使用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 相关文章推荐
Code:findPosX 和 findPosY
Dec 20 Javascript
javascript 写类方式之五
Jul 05 Javascript
JQuery插件开发示例代码
Nov 06 Javascript
jQuery遍历之next()、nextAll()方法使用实例
Nov 08 Javascript
js如何打印object对象
Oct 16 Javascript
基于jquery实现省市联动效果
Nov 23 Javascript
Angularjs的ng-repeat中去除重复数据的方法
Aug 05 Javascript
Easyui使用Dialog行内按钮布局的实例
Jul 27 Javascript
Vue拖拽组件开发实例详解
May 11 Javascript
JS与jQuery实现ListBox上移,下移,左移,右移操作功能示例
May 31 jQuery
koa-router路由参数和前端路由的结合详解
May 19 Javascript
使用Cargo工具高效创建Rust项目
Aug 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
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
隐藏Nginx或Apache以及PHP的版本号的方法
2016/01/03 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
Laravel5.0+框架邮件发送功能实现方法图文与实例详解
2019/04/23 PHP
JavaScript 利用Cookie记录用户登录信息
2009/12/08 Javascript
Jquery UI震动效果实现原理及步骤
2013/02/04 Javascript
JavaScript实现页面实时显示当前时间的简单实例
2013/07/20 Javascript
JQuery each()嵌套使用小结
2014/04/18 Javascript
jQuery文件上传插件Uploadify使用指南
2014/06/05 Javascript
javascript 获取函数形参个数
2014/07/31 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
使用jQuery mobile库检测url绝对地址和相对地址的方法
2015/12/04 Javascript
js实现跨域访问的三种方法
2015/12/09 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
JS判断指定dom元素是否在屏幕内的方法实例
2017/01/23 Javascript
深入理解ES6的迭代器与生成器
2017/08/19 Javascript
Node.js中DNS模块学习总结
2018/02/28 Javascript
快速解决Vue项目在IE浏览器中显示空白的问题
2018/09/04 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
vue.js购物车添加商品组件的方法
2019/09/17 Javascript
vue中使用GraphQL的实例代码
2019/11/04 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
Python字符转换
2008/09/06 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
详细整理python 字符串(str)与列表(list)以及数组(array)之间的转换方法
2019/08/30 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
世界领先的以旅馆为主的在线预订平台:Hostelworld
2016/10/09 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
国家机关领导干部民主生活会对照检查材料思想汇报
2014/09/17 职场文书
2014年纠风工作总结
2014/12/08 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
教师继续教育反思周记
2015/06/25 职场文书
Golang流模式之grpc的四种数据流
2022/04/13 Golang