浅谈使用mpvue开发小程序需要注意和了解的知识点


Posted in Javascript onMay 23, 2018

一、实例生命周期

除了Vue本身的生命周期处,mpvue还兼容了小程序的生命周期,这部分生命周期的钩子来源于微信小程序的Page,除特殊情况外,不建议使用小程序的生命周期钩子。

app 部分:

  1. onLaunch,初始化
  2. onShow,当小程序启动,或从后台进入前台显示
  3. onHide,当小程序从前台进入后台

page 部分:

  1. onLoad,监听页面加载
  2. onShow,监听页面显示
  3. onReady,监听页面初次渲染完成
  4. onHide,监听页面隐藏
  5. onUnload,监听页面卸载
  6. onPullDownRefresh,监听用户下拉动作
  7. onReachBottom,页面上拉触底事件的处理函数
  8. onShareAppMessage,用户点击右上角分享
  9. onPageScroll,页面滚动
  10. onTabItemTap, 当前是 tab 页时,点击 tab 时触发 (mpvue 0.0.16 支持)

用法示例:

new Vue({
 data: {
  a: 1
 },
 created () {
  // `this` 指向 vm 实例
  console.log('a is: ' + this.a)
 },
 onShow () {
  // `this` 指向 vm 实例
  console.log('a is: ' + this.a, '小程序触发的 onshow')
 }
})
// => "a is: 1"

注意点:

  1. 不要在选项属性或回调上使用箭头函数,比如 created: () => console.log(this.a) 或vm.$watch('a', newValue => this.myMethod())。因为箭头函数是和父级上下文绑定在一起的,this不会是如你做预期的 Vue 实例,且 this.a 或 this.myMethod 也会是未定义的。
  2. 微信小程序的页面的 query 参数是通过 onLoad 获取的,mpvue 对此进行了优化,直接通过this.$root.$mp.query 获取相应的参数数据,其调用需要在 onLoad 生命周期触发之后使用,比如 onShow 等

二、模板语法

不支持 纯-HTML

小程序里所有的 BOM/DOM 都不能用,也就是说 v-html 指令不能用。

不支持部分复杂的 JavaScript 渲染表达式

我们会把 template 中的 {{}} 双花括号的部分,直接编码到 wxml 文件中,由于微信小程序的能力限制(数据绑定),所以无法支持复杂的 JavaScript 表达式。

目前可以使用的有 + - * % ?: ! == === > < [] .,剩下的还待完善。

不支持过滤器

渲染部分会转成 wxml ,wxml 不支持过滤器,所以这部分功能不支持。

不支持函数

不支持在 template 内使用 methods 中的函数。

列表渲染

全支持 官方文档:列表渲染

只是需要注意一点,嵌套列表渲染,必须指定不同的索引!

<!-- 在这种嵌套循环的时候, index 和 itemIndex 这种索引是必须指定,且别名不能相同,正确的写法如下 -->
<template>
  <ul v-for="(card, index) in list">
    <li v-for="(item, itemIndex) in card">
      {{item.value}}
    </li>
  </ul>
</template>

事件处理器

在 input 和 textarea 中 change 事件会被转为 blur 事件。

踩坑注意:

列表中没有的原生事件也可以使用例如 bindregionchange 事件直接在 dom 上将bind改为@
@regionchange,同时这个事件也非常特殊,它的 event type 有 begin 和 end
两个,导致我们无法在handleProxy 中区分到底是什么事件,所以你在监听此类事件的时候同时监听事件名和事件类型既

<map @regionchange="functionName" @end="functionName" @begin="functionName"><map>

小程序能力所致,bind 和 catch 事件同时绑定时候,只会触发 bind ,catch 不会被触发,要避免踩坑。

事件修饰符

.stop 的使用会阻止冒泡,但是同时绑定了一个非冒泡事件,会导致该元素上的 catchEventName 失效!

.prevent 可以直接干掉,因为小程序里没有什么默认事件,比如submit并不会跳转页面

.capture 支持 1.0.9

.self 没有可以判断的标识

.once 也不能做,因为小程序没有 removeEventListener, 虽然可以直接在 handleProxy 中处理,但非常的不优雅,违背了原意,暂不考虑

其他 键值修饰符 等在小程序中压根没键盘,所以。。。

三、组件

有且只能使用单文件组件(.vue 组件)的形式进行支持。其他的诸如:动态组件,自定义 render,和<script type="text/x-template"> 字符串模版等都不支持。原因很简单,因为我们要预编译出 wxml。

详细的不支持列表:

  1. 暂不支持在组件引用时,在组件上定义 click 等原生事件、v-show(可用 v-if 代替)和 class style 等样式属性(例:<card class="class-name"> </card> 样式是不会生效的),因为编译到wxml,小程序不会生成节点,建议写在内部顶级元素上。
  2. Slot(scoped 暂时还没做支持)
  3. 动态组件
  4. 异步组件
  5. inline-template
  6. X-Templates
  7. keep-alive
  8. transition
  9. class
  10. style

小程序组件

mpvue 可以支持小程序的原生组件,比如: picker,map 等,需要注意的是原生组件上的事件绑定,需要以 vue 的事件绑定语法来绑定,如 bindchange="eventName" 事件,需要写成 @change="eventName"

示例代码:

<picker mode="date" :value="date" start="2015-09-01" end="2017-09-01" @change="bindDateChange">
  <view class="picker">
   当前选择: {{date}}
  </view>
</picker>

四、常见问题

1. 如何获取小程序在 page onLoad 时候传递的 options

在所有 页面 的组件内可以通过 this.$root.$mp.query 进行获取。

2. 如何获取小程序在 app onLaunch/onShow 时候传递的 options

在所有的组件内可以通过 this.$root.$mp.appOptions 进行获取。

3. 如何捕获 app 的 onError

由于 onError 并不是完整意义的生命周期,所以只提供一个捕获错误的方法,在 app 的根组件上添加名为 onError 的回调函数即可。如下:

export default {
  // 只有 app 才会有 onLaunch 的生命周期
  onLaunch () {
    // ...
  },

  // 捕获 app error
  onError (err) {
    console.log(err)
  }
}

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

Javascript 相关文章推荐
用javascript实现分割提取页面所需内容
May 09 Javascript
JavaScript中几种常见排序算法小结
Feb 22 Javascript
THREE.JS入门教程(4)创建粒子系统
Jan 24 Javascript
jquery ajax对特殊字符进行转义防止js注入使用示例
Nov 21 Javascript
jQuery实现获取元素索引值index的方法
Sep 18 Javascript
Bootstrap源码解读排版(1)
Dec 23 Javascript
Angularjs分页查询的实现
Feb 24 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
Mar 20 Javascript
vue 插值 v-once,v-text, v-html详解
Jan 19 Javascript
详解plotly.js 绘图库入门使用教程
Feb 23 Javascript
vue框架下部署上线后刷新报404问题的解决方案(推荐)
Apr 03 Javascript
vue实现百度搜索功能
Dec 28 Javascript
vue动态路由配置及路由传参的方式
May 23 #Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
May 23 #Javascript
深入剖析Node.js cluster模块
May 23 #Javascript
Node.js进阶之核心模块https入门
May 23 #Javascript
使用 vue-i18n 切换中英文效果
May 23 #Javascript
centos 上快速搭建ghost博客方法分享
May 23 #Javascript
20个最常见的jQuery面试问题及答案
May 23 #jQuery
You might like
通过ICQ网关发送手机短信的PHP源程序
2006/10/09 PHP
PHP添加MySQL数据记录代码
2008/06/07 PHP
php中CI操作多个数据库的代码
2012/07/05 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
2015/09/23 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
JavaScript自定义DateDiff函数(兼容所有浏览器)
2012/03/01 Javascript
js读取配置文件自写
2014/02/11 Javascript
JavaScript使用ActiveXObject访问Access和SQL Server数据库
2015/04/02 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
解决VUEX兼容IE上的报错问题
2018/03/01 Javascript
JS常见DOM节点操作示例【创建 ,插入,删除,复制,查找】
2018/05/14 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
jsonp跨域获取百度联想词的方法分析
2019/05/13 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
[01:24:09]Ti4 冒泡赛第二轮DK vs C9 1
2014/07/14 DOTA
[01:28:24]NAVI vs VG Supermajor 败者组 BO3 第三场 6.5
2018/06/06 DOTA
python开发中range()函数用法实例分析
2015/11/12 Python
Python循环结构的应用场景详解
2019/07/11 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
2019/08/24 Python
基于pytorch padding=SAME的解决方式
2020/02/18 Python
Python通过正则库爬取淘宝商品信息代码实例
2020/03/02 Python
python GUI库图形界面开发之PyQt5不规则窗口实现与显示GIF动画的详细方法与实例
2020/03/09 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
Python类绑定方法及非绑定方法实例解析
2020/10/09 Python
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
什么是命名空间(NameSpace)
2015/11/24 面试题
师范生的个人求职信范文
2014/01/04 职场文书
省级优秀班集体申报材料
2014/05/25 职场文书
兽医医药专业求职信
2014/07/27 职场文书
幼儿园音乐教学反思
2016/02/18 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书