资讯专栏INFORMATION COLUMN

使用mpvue开发github小程序总结

BaronZhang / 2086人阅读

摘要:获取当前路径参数不用提供的因为其进入同一页面,参数不会变化获取当前路由栈数组后记前面几个问题是我初次使用开发小程序遇到的最大的坑了吧。

前言

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

扫码体验、

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

mina坑 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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108084.html

相关文章

  • 详解 mpvue 程序框架 及和原生的差异

    摘要:在这一步,实例已完成以下的配置数据观测,属性和方法的运算,事件回调。可以直接写等标签的写法之前会的工程师上手框架的成本较低 简介 1.美团工程师推出的基于Vue.js封装的用于开发小程序的框架2.融合了原生小程序和Vue.js的特点3.可完全组件化开发 特点 1.组件化开发2.完成的Vue.js开发体验(前提是熟悉Vue)3.可使用Vuex管理状态4.Webpack构建项目5.最终H5...

    IamDLY 评论0 收藏0
  • 微信程序 + 腾讯地图SDK 实现路线规划

    摘要:业内开发框架层出不穷,,,等等,都在朝着更快,更强大的方向发展,有统一微信支付宝百度和头条小程序的大趋势。最近升级为版本,支持微信支付宝百度和头条小程序。 原文链接 最近小程序的发展越来越火了,作为各个产品线的extra服务入口,以轻便、快速、强大的社交链吸引着大量的用户和开发者。业内开发框架层出不穷,wepy,mpvue,taro等等,都在朝着更快,更强大的方向发展,有统一 H5、微...

    keithyau 评论0 收藏0
  • 微信程序 + 腾讯地图SDK 实现路线规划

    摘要:业内开发框架层出不穷,,,等等,都在朝着更快,更强大的方向发展,有统一微信支付宝百度和头条小程序的大趋势。最近升级为版本,支持微信支付宝百度和头条小程序。 原文链接 最近小程序的发展越来越火了,作为各个产品线的extra服务入口,以轻便、快速、强大的社交链吸引着大量的用户和开发者。业内开发框架层出不穷,wepy,mpvue,taro等等,都在朝着更快,更强大的方向发展,有统一 H5、微...

    BLUE 评论0 收藏0

发表评论

0条评论

BaronZhang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<