MPVUE - 使用vue.js开发微信小程序
什么是mpvue?
mpvue 是美团点评前端团队开源的一款使用 Vue.js 开发微信小程序的前端框架。框架提供了完整的 Vue.js 开发体验,开发者编写 Vue.js 代码,mpvue 将其解析转换为小程序并确保其正确运行。
简单上手mpvue
官方提供了一套quickstart模板。
vue init mpvue/mpvue-quickstart my-project
安装好依赖之后,执行npm run dev,将会将小程序文件打包进dist文件夹,之后使用微信开发者工具将目录指向dist文件夹即可。
差异化情况
生命周期
支持vue.js的生命周期部分,并且兼容了小程序的生命周期。
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"
模板语法
不支持 v-html,因为小程序里没有dom和bom的概念。
不支持部分复杂的 JavaScript 渲染表达式
mpvue会把 template 中的 {{}}
双花括号的部分,直接编码到 wxml 文件中,由于微信小程序的能力限制(数据绑定),所以无法支持复杂的 JavaScript 表达式
目前可以使用的有 + - * % ?: ! == === > < [] .
。
以下这几种情况都不支持:
// 基本类型的方法调用
<p>{{ message.split('').reverse().join('') }}</p>
// 实例方法调用
<p>{{ strDecode(message) }}</p>
// 类型判断
<p>{{ typeof message }}</p>
// 过滤器
<p>{{ message | strDecode }}</p>
第一种可以使用计算属性来解决,第二种和第四种都是经常使用的,可以数据初始化的时候用js处理,只不过遍历的时候会稍微有点繁琐。也可以让后端支持,直接返回处理过的数据。
支持短路和断路:
<p>{{ false || '默认值' }}</p>
<p>{{ true && '默认值' }}</p>
Class 与 Style 绑定
基本全支持,不支持classObj和styleObj形式,例如:
<p :class="classObj"></p>
data () {
return {
classObj: {
active: true
}
}
}
mpvue会解析成:
<p class="object Object"></p>
styleObj 类似,另外,暂不支持在组件上使用 Class 与 Style 绑定。
条件渲染、列表渲染、计算属性全支持
组件
不支持列表:
- 暂不支持在组件引用时,在组件上定义 click 等原生事件、v-show(可用 v-if 代替)和 class style 等样式属性(例:
<card class="class-name"> </card>
样式是不会生效的) - Slot(scoped 暂时还没做支持)
- 动态组件
- 异步组件
- inline-template
- X-Templates
- keep-alive
- transition
不支持复杂的slot,组件化会受限,不支持transition,过渡动画可能要用css3手写。
支持小程序原生组件,原生组件上的事件绑定,需要以 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>
注意事项及踩坑
模板中的
img
标签url指向相对路径时不能正确解析例如:
<img src="~assets/images/home/header.png" />
<img src="./assets/images/home/header.png" />
在当前mpvue版本(1.0.8)中,图片相对url不能正确解析,官方已列入待修复bug(27 days ago),https://github.com/Meituan-Dianping/mpvue/issues/152,暂时的解决方法是可以将静态资源放入static文件夹中,然后img标签用绝对路径引入:
<img src="/static/images/home/header.png" />
带来的副作用是不能享受url-loader的处理(小图片转base64)。
另外,css中却是可以通过相对路径引入图片的,例如:
.icon {
background-image: url('./assets/images/home/header.png');
}
.icon1 {
background-image: url('~assets/images/home/header.png');
}
url-loader 会将小于limit数值的图片转成base64,但是小程序中好像规定了css中不能引入本地静态资源,可以通过配置url-laoder、nginx别名、host解决:
host配置:
127.0.0.1 sns-mp.guahao-inc.com
nginx配置:
server {
listen 80;
server_name sns-mp.guahao-inc.com;
location /static/src/assets/ {
alias /Users/lavyun/Code/FE/vue/vue-mp-demo/src/assets/;
}
}
url-loader配置:
const imageRule = {
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10 * 1024,
publicPath: 'http://sns-mp.guahao-inc.com/',
name: utils.assetsPath('[path][name].[ext]')
}
}
// 生产环境下指向静态资源服务器
if (isProd) {
imageRule.options.publicPath = 'http://static.gauhao-inc.com'
}
module.export = {
...,
module: {
rules: [
imageRule,
...
]
}
}
组件和小程序系统组件重名时的BUG
比如:
<loading></loading>
小程序文档里没有提到有loading这个组件,之前直接使用loading做组件名,产生了很多莫名其妙的bug,框架层面也没做错误提示。所以大家开发时最好避免下命名冲突。
slot的各种问题
之前mpvue版本1.0.6时,使用slot生成的小程序代码少了import
命令。
https://github.com/Meituan-Dianping/mpvue/issues/217
组件的代码:
<template>
<div class="scroll-wrapper">
<slot></slot>
<loading v-if="loading"></loading>
</div>
</template>
使用组件时的代码:
<scroll-wrapper :loading="loading">
<top-entries></top-entries>
</scroll-wrapper>
生成的wxml:
<template name="data-v-7d8efa60-default-1">
<template data="{{...$root[$kk+'0'], $root}}" is="home$69cf8ee0"></template>
</template>
少了一行:<import src="home$69cf8ee0" />
现版本 1.0.8 使用slot时:
<scroll-wrapper :loading="loading">
<circle-list v-if="circleList.length" :list="circleList"></circle-list>
</scroll-wrapper>
circleList状态被更新时不能正确的触发视图更新,官方的仓库中也有大部分issue也是关于slot的。
使用vuex管理状态
虽然小程序是多页的,但小程序的多页主要是指 视图层 是多个 webview,相互独立,但是 js 都是在同一个执行环境中的,所以在mpvue中可以直接使用vuex来管理状态。
初始化一个vuex实例,然后在需要使用的组件里引入。
import Vue from 'vue'
import Vuex from 'vuex'
import actions from './actions'
import mutations from './mutations'
import getters from './getters'
import state from './state'
Vue.use(Vuex)
const store = new Vuex.Store({
state,
actions,
mutations,
getters
})
export default store
在组件里使用:
import store from '../../store'
import * as types from '../../store/types'
export default {
data () {
return {
animate: false
}
},
computed: {
popup () {
return store.getters.postEntryPopup
}
},
methods: {
close () {
this.animate = false
setTimeout(() => {
store.commit(types.POST_ENTRY_POPUP)
}, this.popup.animateTime)
}
}
}
app.json 和 page.json
框架规定在 src/main.js 中导出app.json配置,
import Vue from 'vue'
import App from './App'
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue(App)
app.$mount()
export default {
// 这个字段走 app.json
config: {
// 页面前带有 ^ 符号的,会被编译成首页,其他页面可以选填,我们会自动把 webpack entry 里面的入口页面加进去
pages: ['^pages/home/main'],
window: {
onReachBottomDistance: 10
}
}
}
在 src/pages/**/main.js 中导出page.json配置:
import Vue from 'vue'
import App from './index'
const app = new Vue(App)
app.$mount()
export default {
config: {
navigationBarBackgroundColor: '#3f86ff',
navigationBarTitleText: '首页',
backgroundTextStyle: 'light',
navigationBarTextStyle: 'light',
enablePullDownRefresh: true,
backgroundColor: '#3f86ff'
}
}
使用总结
使用mpvue可以很好降低开发人员的学习小程序语法的成本,可以很大程度上的实现h5和小程序代码复用(使用vuejs框架),在迁移一些vue组件到小程序时,可能都不需要改动代码或者改动少量代码就可以直接使用。官方对待框架的态度是很不错的,开源一个多月(3月9日 - 4月16日),一共有300个issue,处理了250个,获得7800star,社区比较活跃。
文章推荐
MPVUE - 使用vue.js开发微信小程序的更多相关文章
-
用Vue.js开发微信小程序:开源框架mpvue解析
前言 mpvue 是一款使用 Vue.js 开发微信小程序的前端框架.使用此框架,开发者将得到完整的 Vue.js 开发体验,同时为 H5 和小程序提供了代码复用的能力.如果想将 H5 项目改造为小程 ...
-
移动端 | Vue.js对比微信小程序基础语法
(1)vue 自定义组件与父组件的通信,props:[abb],可以看成自组建的一个自定义属性 (2)vue 模版语法{{}} 只能是在DOM中插入,<div>{{acc}}</di ...
-
mpvue-docs基于vue来开发微信小程序
http://mpvue.com/和https://tencent.github.io/wepy/
-
使用mpvue开发微信小程序
更多内容请查看 我的新博客 地址 : 前言 16年小程序刚出来的时候,就准备花点时间去学学.无奈现实中手上项目太多,一个接着一个,而且也没有开发小程序的需求,所以就一拖再拖. 直到上周,终于有一个小程 ...
-
使用Vue开发微信小程序:mpvue框架
使用Vue开发微信小程序:mpvue框架:https://www.jianshu.com/p/8f779950bfd9
-
mpvue 应用 Vant Weapp框架开发微信小程序
今天在使用mpvue开发微信小程序的过程中需要实现一个底部上拉选择列表的功能,因为之前做过H5微信公众号的开发,使用的就是有赞的Vant-ui,所以第一时间就想到了有赞的Vant Weapp UI框架 ...
-
mpvue开发微信小程序,分享按钮报错:`Cannot read property &#39;apply&#39; of null`
用mpvue开发微信小程序,分享按钮报错:Cannot read property 'apply' of null onShareAppMessage 是于微信小程序Pages的生命周期钩子,顾这个方 ...
-
使用uni-app开发微信小程序
uni-app 开发微信小程序 前言 9月份,开始开发微信小程序,也曾调研过wepy/mpvue,考虑到后期跨端的需求,最终选择使用了uni-app,本文主要介绍如何使用uni-app搭建小程序项目, ...
-
像VUE一样写微信小程序-深入研究wepy框架
像VUE一样写微信小程序-深入研究wepy框架 微信小程序自发布到如今已经有半年多的时间了,凭借微信平台的强大影响力,越来越多企业加入小程序开发. 小程序于M页比相比,有以下优势: 1.小程序拥有更多 ...
随机推荐
-
Windows2012 cannot access netapp CIFS share
NAS1> options cifs.smb2.signing.requiredcifs.smb2.signing.required off NAS1> options cifs.smb2 ...
-
[转]天龙八部的BillingServer
从字面上看,Billing是计费的,应该处理玩家在线时间或者包月之类.但是天龙八部是免费游戏,不需要算时间来计费.从代码中看,BillingServer也比较简单,它有一个连接到Web服务器,并监听一 ...
-
响应式的dribbble作品集魔术布局展示效果
在线演示1 本地下载 相信做设计的朋友肯定都知道dribbble.com,它是一个非常棒的设计师分享作品的网站,全世界数以万计的设计高手和行家都在这个网站上分享自己的作品,当然,如果你常在上面闲逛的话 ...
-
Cocos2d-x中Vector<;T>;容器以及实例介绍
Vector<T> 是Cocos2d-x 3.x推出的列表容器,因此它所能容纳的是Ref及子类所创建的对象指针,其中的T是模板,表示能够放入到容器中的类型,在Cocos2d-x 3.x中T ...
-
php正则失效-最大回溯(pcre.backtrack_limit)/递归限制
有时候,我们觉得,没有什么可以让我们快乐,我们甚至忘记了如何微笑.但是,当我们被一群乐观.欢乐的人包围的时候,他们从内心深处散发出来的欢迎一定会感染你. 这组照片中,你会看到真正的幸福和快乐的面孔,我 ...
-
python 中self理解
python类的方法和普通函数的区别--python中类的方法必须有一个额外的参数:self 假如创建一个新的类Myclass,类中有一个方法method(arg1,arg2),b实例化Myclass ...
-
lib下的Jar包在项目打包的时候提示不能找不到
maven 使用本地包 lib jar包 依赖一个lib目录 解决方法: <plugin> <groupId>org.apache.maven.plugins</grou ...
-
java 中自定义类的概述
作业: 描述商品类 Goods 4个属性 商品名字 大小 价格 库存 把商品类放进集合中 小米品牌 大小 价格 库存的数量 都存集合 华为..... 魅族 public class Goods{ St ...
-
前端工程化-webpack篇之babel-polyfill与babel-runtime(三)
关于 Babel 如果我们没有配置一些规则,Babel 默认只转换新的 JavaScript 句法(syntax),而不转换新的 API,比如 Iterator.Generator.Set.Maps. ...
-
pycharm加载多个项目
菜单位置:File -> Settings -> Project:xxx -> Project Stucture Project:xxx中xxx一般是已有项目的名称 窗口右侧上点击A ...