使用mpvue开发github小程序总结
前言
最近有点闲,想起关注已久的mpvue写小程序,所以稍微肝了半个多月写了个github版的微信小程序,已上线。现在总结一下遇到的坑。
扫码体验、

项目地址、
https://github.com/cheesekun/wx-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}
我猜mpvue的this.$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
来源:https://segmentfault.com/a/1190000015754744
使用mpvue开发github小程序总结的更多相关文章
- mpvue开发微信小程序,分享按钮报错:`Cannot read property 'apply' of null`
用mpvue开发微信小程序,分享按钮报错:Cannot read property 'apply' of null onShareAppMessage 是于微信小程序Pages的生命周期钩子,顾这个方 ...
- 使用mpvue开发微信小程序
更多内容请查看 我的新博客 地址 : 前言 16年小程序刚出来的时候,就准备花点时间去学学.无奈现实中手上项目太多,一个接着一个,而且也没有开发小程序的需求,所以就一拖再拖. 直到上周,终于有一个小程 ...
- 利用mpvue开发微信小程序
最近公司部门负责人提出需求需要开发一款微信小程序,由于本人之前是做前端开发的,对于小程序开发一窍不通,但是很多时候我们都是把不会做变成我会学.于是便在网上寻找小程序开发教程,相比于相生的小程序开发,本 ...
- mpvue开发微信小程序
前段时间,美团开源了mpvue这个项目,使得我们又多了一种用来开发小程序的框架选项.由于mpvue框架是完全基于Vue框架的(重写了其runtime和compiler),因此在用法上面是高度和Vue一 ...
- mpvue开发微信小程序之时间+日期选择器
最近在做微信小程序,技术栈为mpvue+iview weapp组件库. 因项目需求,要用到日期+时间选择器,iview组件库目前还未提供时间日期选择器的组件,小程序官方组件日期时间也是分开的,在简书上 ...
- mpvue 开发微信小程序搭建项目
首先 mpvue 是一款基于vue的框架,mpvue 修改了 Vue.js 的 runtime 和 compile 实现,可以运行在小程序的环境中. 第一步:安装 vue-cli vue-cli是vu ...
- mpvue开发微信小程序之picker
微信使用picker组件,bingchange 换成@change即可使用监听函数和方法 此处注意与微信多了一个mp的信息才能获取到选中的值. 获取当前日期+时间 function formatTim ...
- mpvue 应用 Vant Weapp框架开发微信小程序
今天在使用mpvue开发微信小程序的过程中需要实现一个底部上拉选择列表的功能,因为之前做过H5微信公众号的开发,使用的就是有赞的Vant-ui,所以第一时间就想到了有赞的Vant Weapp UI框架 ...
- 用Vue.js开发微信小程序:开源框架mpvue解析
前言 mpvue 是一款使用 Vue.js 开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程 ...
随机推荐
- C++【vector】用法和例子
/*** * vector 基础api复习 * 8 AUG 2018 */ #include <iostream> #include <vector> using namesp ...
- 常用es6特性归纳-(一般用这些就够了)
之前做vue和react的时候,发现文档什么的最新版本都建议用es6写法,对es6友好度更高,加之现在es6也越来越普及,兼容性问题直接用babel转码就好了,特别方便,于是我开始学着用es6写代码, ...
- idea查看jar冲突和解决方法
选中Dependencies,点上边那个按钮,出现下图 依赖图太小了,根本没法看啊?好办,点击鼠标右键,呼出右键菜单栏,然后点击Actual Size: 如果我们仔细观察上图,会发现在项目依赖图中,有 ...
- [转]C#中用NamedPipe进程间通信
转自:http://blog.csdn.net/jinjazz/archive/2009/02/03/3861143.aspx 本文只是一个测试例子,核心代码是kernel32.dll中的一组wind ...
- centos的yum配置
什么是yum ?yum,是Yellow dog Updater Modified的简称,起初是由yellow dog这一发行版的开发者Terra Soft研发,用python写成,那时还叫做yup(y ...
- JDK中有关23个经典设计模式的示例
Creational patterns Abstract factory (recognizeable by creational methods returning an abstract/inte ...
- java代码乱序问题
java两个线程互相访问的时候并不能按照你的思路运行,因为执行语句可能有前后快慢之分,比如a=1和flag=true.下面线程B访问的时候 这两个赋值语句不一定按顺序执行 产生这种原因是因为指令重排序 ...
- 在vue项目中正确的引入jquery
最近学习vue,习惯性的通过<script>标签引入jquery,写完后报错才想起来,这种方式在vue是不适用的. 1:因为已经安装了vue脚手架,所以需要在webpack中全局引入jqu ...
- mysqldump与mydumper
mydumper -u root -S /srv/my3308/run/mysql.sock -B trade_platform -o /data/trade_platform
- Thinkphp 错误集锦
1.无法加载控制器 开始还跑TP核心文件中找错误,结果没找到什么结果.最后还是用程序新建模块才发现问题. 问题是命名空间名字写错了.比如书:本来是Report模块下的IndexContrller,但是 ...