在上一章节中,我们了解了组件的三个基本特性以及组件的基本使用方法。在实际的小程序开发中,我们应该以组件的思维去设计每个小程序的功能页面,对其进行合理的组件拆分,让每个部分都保持功能简洁、条理清楚、各司其职,这样会让代码变得更易理解和维护,间接的也提升了代码的健壮性,降低出现Bug的几率,即使出现Bug,也会更容易进行定位和调试。
 

由于mpvue采用的是Vue框架的基础设施,所以大部分的功能都是和Vue一致的。但是,mpvue的代码毕竟最终还是要转译成小程序原生框架下的代码的,由于小程序框架本身存在的一些功能限制,导致有些功能不能被翻译过去,也就是说有些标准的Vue功能在mpvue下是不可以使用或有特殊限制的。

今天我们就来罗列一下,在使用mpvue的时候那些需要特别注意的点。

1. 在模板中,动态插入HTML的v-html指令不可用

这条很好理解,小程序的界面并不是基于浏览器的BOM/DOM的,所以不能动态的在界面模板里直接插入HTML片段来显示。

题外话,如果有在小程序里插入html片段的需求怎么办?可以用<rich-text>组件或者wxParse(https://github.com/icindy/wxParse)来实现。

2. 在模板中,用于数据绑定的双括号语法{{}}中的表达式功能存在诸多限制

在Vue本身的模板内双括号语法中,我们可以对绑定变量进行比较丰富的处理,比如:

  • 可以调用methods下的函数, 例如:
<template>
<div>{{ formatMessage(msg) }}</div>
</template> <script>
export default {
data() {
return {
msg: "Hello,World"
}
},
methods: {
formatMessage(str) {
return str.trim().split(',').join('#')
}
}
}
</script>
  • 如果变量是对象的话,也可以调用对象的成员方法
<div>{{ msg.trim().split(',').join('#') }}</div>
  • 可以使用过滤器来处理变量,最有用的场景算是格式化数据了
<div>{{ msg | format }}</div>

以上这些好用的功能,在mpvue中,记得都是通通不能用的哦!!!

我们只能在双括号中使用一些简单的运算符运算(+ - * % ?: ! == === > < [] .)。

但是也得找些可用的替代方案呐,大伙先考虑使用计算属性(computed)来做吧。

3. 在模板中,除事件监听外,其余地方都不能调用methods下的函数

在Vue中,模板里调用methods部分定义的函数是非常常见的,比如下面这段代码所示,在v-if指令中调用函数getErrorNum()

<div v-if="getErrorNum() > 0  && code == 10001" class="error">{{ errorMsg }}</div>

可是,在mpvue里就是不可以用!因为在小程序原生模板wxml里就不支持这种函数调用,导致mpvue没有很好的方式转译过去(虽然小程序有wxs,但是感觉翻译过去mpvue要做的工作会比较复杂)。

所以,可用的替代方案可能还是计算属性了。

4. 在模板中,不支持直接绑定一个对象到styleclass属性上

在Vue中我们可以为HTML元素的classstyle绑定一个对象,并按照对象内的属性值来决定是否添加对应的属性名到HTML元素的样式名。示例如下:

<template>
<div :class="classObject"></div>
</template> <script>
export default {
data() {
return {
classObject: {
active: true,
'text-danger': false
}
}
}
}
</script>

上面这段代码的运行后生成的HTML将是:

<div class="active"></div>

但是在mpvue下面这个特性也不能用,按官方说法是由于涉及到一些性能相关的原因。那如果要动态改变组件的class该怎么写呢?官方给出的方式是这样的:

<div :class="{ active: classObject.active, 'text-danger': classObject['text-danger']}"></div>

其实改动不大,稍微多打了一些字而已,相当于在模板的class里再定义一个对象罢了。但是据文档中说这样会提升性能。好吧,为了性能,这点麻烦还是能忍受的。但是它又说了:从性能考虑,建议不要过度依赖此......看来即使这样,也还是有性能问题。

看来最好一点的方案,还是得使用计算属性,直接生成一串样式的字符串,绑定到classstyle上:

<template>
<div :class="classStr"></div>
</template> <script>
export default {
data() {
return {
classObject: {
active: true,
'text-danger': false
}
}
},
computed: {
classStr() {
let arr = []
for (let p in this.classObject) {
if (this.classObject[p]) {
arr.push(p)
}
}
return arr.join(' ')
}
}
}
</script>

5. 在模板中,嵌套使用v-for时,必须指定索引index

通常,我们在Vue模板中嵌套循环渲染数组的时候,一般是这个样子的:

<template>
<ul v-for="category in categories">
<li v-for="product in category.products">{{product.name}}</li>
</ul>
</template>

但在mpvue中使用这种嵌套结构的v-for时,则必须每层的v-for上都给出索引,且索引需取不同名字:

<template>
<ul v-for="(category, index) in categories">
<li v-for="(product, productIndex) in category.products">{{product.name}}</li>
</ul>
</template>

6. 事件处理中的注意点

在mpvue中,一般可以使用Web的DOM事件名来绑定事件,mpvue会将Web事件名映射成对应的小程序事件名,对应列表如下:

// 左侧为WEB事件 : 右侧为对应的小程序事件
{
click: 'tap',
touchstart: 'touchstart',
touchmove: 'touchmove',
touchcancel: 'touchcancel',
touchend: 'touchend',
tap: 'tap',
longtap: 'longtap',
input: 'input',
change: 'change',
submit: 'submit',
blur: 'blur',
focus: 'focus',
reset: 'reset',
confirm: 'confirm',
columnchange: 'columnchange',
linechange: 'linechange',
error: 'error',
scrolltoupper: 'scrolltoupper',
scrolltolower: 'scrolltolower',
scroll: 'scroll'
}

除了上面的之外,Web表单组件<input><textarea>的change事件会被转为blur事件。

然后,像keydownkeypress之类的键盘事件也没有了,因为小程序没有键盘,所以不需要这些事件。

还有,Vue里面绑定事件的时候,可以指定事件修饰符,但是在mpvue里,官方给出了一些注意信息:

  • .stop 的使用会阻止冒泡,但是同时绑定了一个非冒泡事件,会导致该元素上的 catchEventName 失效!【这个亲测了一下,感觉是最新版本里修复了还是怎么的,没有文档里说的这个问题了】

  • .prevent 可以直接干掉,因为小程序里没有什么默认事件,比如submit并不会跳转页面【也就是不需要支持】

  • .capture 支持 1.0.9 【也就是在 mpvue 1.0.9及以后版本支持】

  • .self 没有可以判断的标识 【也就是不支持】

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

所以呢,总之当你在遇到事件相关的问题,请回来查看一下文档,看看自己是否已经掉在坑里了。

7. 对于表单,请直接使用小程序原生的表单组件

一句话,表单组件又多又复杂,框架可能Hold不住。所以在实际开发中,推荐直接使用小程序的表单组件标签来写,而不是使用Web的表单组件标签来写。当然了,在mpvue中使用了小程序的组件标签,数据绑定功能还是完全可以用的。给个示例:

<template>
<div>
<picker @change="handlePickerChange" :value="selectedIndex" :range="messages">
<view class="picker">当前消息:{{ messages[selectedIndex] }}</view>
</picker>
</div>
</template> <script>
export default {
data () {
return {
selectedIndex: ,
messages: ['Hello', 'World', 'Haha']
}
},
methods: {
handlePickerChange (e) {
console.log(e)
}
}
}
</script>

其他注意事项

另外,在Vue开发Web应用的时候,通常使用vue-router来进行页面路由。但是在mpvue小程序开发中,不能用这种方式,请使用<a>标签和小程序原生API wx.navigateTo等来做路由功能。

还有就是请求后端数据,我们通常在Web开发中使用axios等ajax库来实现,但是在小程序开发中也是不能用的,也请使用小程序的原生API wx.request等来进行。

使用mpvue开发小程序教程(六)

 
 

使用mpvue开发小程序教程(五)的更多相关文章

  1. 使用mpvue开发小程序教程(四)

    在上一章节中,我们将vue-cli命令行工具生成的代码骨架中的src目录清理了一遍,然后从头开始配置和编写了一个可以运行的小程序页面,算是正真走上了使用mpvue开发小程序的第一步.今天我们将进一步来 ...

  2. 使用mpvue开发小程序教程(一)

    前段时间,美团开源了mpvue这个项目,使得我们又多了一种用来开发小程序的框架选项.由于mpvue框架是完全基于Vue框架的(重写了其runtime和compiler),因此在用法上面是高度和Vue一 ...

  3. 使用mpvue开发小程序教程(二)

    在上篇文章中,我们介绍了使用mpvue开发小程序所需要的一些开发环境的搭建,并创建了第一个mpvue小程序代码骨架并将其运行起来.在本文中,我们来研究熟悉一下mpvue项目的主要目录和文件结构. 在V ...

  4. 使用mpvue开发小程序教程(三)

    在上一篇文章中,我们熟悉了一下通过vue-cli生成的mpvue工程代码骨架的基本结构,大致了解了每一个部分的代码到底要放到何处.从本文起我们就开始涉及真正的编码部分,学习使用Vue的语法去编写小程序 ...

  5. 使用mpvue开发小程序教程(六)

    在上一章节中,我们列举了在Vue中能用但在mpvue中不能用或需要特别注意的特性,在实际开发前了解一下还是很有必要的,可以避免浪费找错误的时间. 如果你使用过原生的小程序框架,你一定经历过或思考过怎么 ...

  6. 使用mpvue开发小程序教程

    从vue到mpvue再到微信小程序,这么几天下来感觉被搞晕了.三者之间的很多功能存在差异,项目也快接近尾声了,坑也踩了很多了,现在给后来的你们一点总结性经验: 1. 在模板中,动态插入HTML的v-h ...

  7. 使用mpvue开发小程序

    前言: 最近接到小程序的开发需求,由于之前也没开发过小程序,心情还是有点激动.先花15分钟看一遍小程序官方文档,再花10分钟看一遍mpvue官方文档,然后拿着原型图和UI图就开干.踩了不少坑,写篇博客 ...

  8. 学习笔记:mpvue开发小程序——入门

    接下来可能要开发一个小程序,同事推荐使用mpvue,那么我提前熟悉下. 官网地址:http://mpvue.com/ 1.快速上手 http://mpvue.com/mpvue/quickstart/ ...

  9. mpvue 开发小程序接口数据统一管理

    mpvue项目里做API与数据分离统一管理 小程序里请求数据接口使用wx:request,因为考虑项目比较大,最好把wx:request封装起来,统一使用管理 utils.js 配置开发环境和线上环境 ...

随机推荐

  1. 把网站打包快速在线生成ios app的正确方法

    下方的内容不用看了,请点这里 !点这里!IOS APP自助生成系统已上线,请马上去了解下: http://www.tao-jiujiu.com/post/188.html  ============= ...

  2. Y1吐槽002 情绪

    看了石原里美的<高岭之花>,虽然全程基本都是看不懂的,但是风间直人对喜怒哀乐里面的怒和哀的分析还是深有感触. 悲哀的人心里有爱 愤怒的人心里有恨,一个人装了太多的恨的话,别人是拯救不了的: ...

  3. [bzoj1059]矩阵游戏

    虽然是一道水难题,但是我这种蒟蒻还是要讲一讲的. Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N *N黑白方阵进行(如同国际 ...

  4. c++编译错误C2971:"std::array":array_size:包含非静态存储不能用作废类型参数;参见“std::array”的声明

    在Qt5中这段代码编写有两种方式:一个编译成功,一个失败 成功版本: static constexpr size_t block_size = 0x2000;//8KB static constexp ...

  5. jQuery倒计时组件(jquery.downCount.js)

    //html <span class="days">00</span> <span class="hours">00< ...

  6. Oracle 存储过程 PROCEDURE

    存储过程  一组用于完成特定数据库功能的SQL语句集,该SQL语句集经过编译后存储在数据库系统中.在使用时候,用户通过指定已经定义的存储过程名字并给出相应的存储过程参数来调用并执行它,从而完成一个或一 ...

  7. mvc根据绝对路径下载文件

    首先页面需要一个a标签直接指向下载文件的Action并传值:图片地址,以及图片名称(记住要带后缀名的). 然后是Action里面的代码. SiteHelper.DownloadFile(fileUrl ...

  8. JDK 1.8判断集合种的元素是否存在相同

    List<String> str=new ArrayList<>(); str.add("a"); str.add("a"); str. ...

  9. 学用HBuilder开发App的看过来

    自己的呕心沥血之作吧,花了一年时间,系统介绍HTML5 App开发的相关技术. 越来越多的公司采用HTML5来快速开发移动跨平台App,它支持当前市场流行的移动设备. 本书主要介绍了HTML5在移动A ...

  10. C语言面试题分类->排序算法

    1.选择排序. 每次将最小的数,与剩余数做比较.找到更小的,做交换. 时间复杂度:O(n²) 空间复杂度:O(1) 优缺点:耗时但内存空间使用小. void selectSort(int *p,int ...