mpvue将vue项目转换为小程序


Posted in Javascript onSeptember 30, 2018

一、 mpvue简介

mpvue:是由 美团点评团队出品的小程序开 发的一款基于 vue的框架, 从整个 Vue的核心代码上经过二次开发而形成的一个框架,相当于是给Vue本身赋能,增加了开发微信小程序的能力。

使用 mpvue开发小程序,你将在小程序技术体系的基础上获取到这样一些能力:

l 彻底的组件化开发能力:提高代码

l 完整的 Vue.js 开发体验

l 方便的 Vuex 数据管理方案:方便构建复杂应用

l 快捷的 webpack 构建机制:自定义构建策略、开发阶段 hotReload

l 支持使用 npm 外部依赖

l 使用 Vue.js 命令行工具 vue-cli 快速初始化项目

l H5 代码转换编译成小程序目标代码的能力

它的目标是:在未来最理想的状态下,可以一套代码可以直接跑在多端: WEB、微信小程序、支付宝小程序、Native(借助weex)。不过由于各个端之间都存在一些比较明显的差异性,从产品的层面上讲,不建议这么做,这个框架的官方他们对它的期望的也只是开发和调试体验的一致

原生微信小程序、 mpvue、WePY这三种开发小程序方式的比较

二、mpvue开发流程

1、小程序账号配置

1)前往https://mp.weixin.qq.com/wxopen/waregister?action=step1根据指引填写信息和提交相应的资料,申请小程序帐号。在菜单 “设置”-“开发设置”获取小程序的 AppID 。

2)在菜单 “设置”-“开发设置”中配置服务器域名,必须是https开头的域名

2、安装开发工具

前往 开发者工具下载页面 ,根据自己的操作系统下载对应的安装包进行安装,有关开发者工具更详细的介绍可以查看 《开发者工具介绍》 。

打开小程序开发者工具,用微信扫码登录开发者工具,准备开发小程序。

3、mpvue生成项目

# 全局安装 vue-cli

$ npm install --global vue-cli

# 创建一个基于 mpvue-quickstart 模板的新项目

$ vue init mpvue/mpvue-quickstart my-project

# 安装依赖

$ cd my-project

$ npm install

# 启动构建

$ npm run dev

Npm run dev运行成功后,本地目录下会生成一个dist文件,这个文件就是生成的小程序相关代码。

在小程序中新建项目,填写上一步获取的 appid,便于后面可以在手机上预览,真机测试,小程序的文件目录就是本地项目目录的dist文件。

三、mpvue开发中的规范

1、生命周期函数

除了 vue本身的生命周期外,mpvue还兼容了小程序的生命周期,

app 部分:

onLaunch,初始化

onShow,当小程序启动,或从后台进入前台显示

onHide,当小程序从前台进入后台

page 部分:

onLoad,监听页面加载

onShow,监听页面显示

onReady,监听页面初次渲染完成

onHide,监听页面隐藏

onUnload,监听页面卸载

onPullDownRefresh,监听用户下拉动作

onReachBottom,页面上拉触底事件的处理函数

onShareAppMessage,用户点击右上角分享

onPageScroll,页面滚动

onTabItemTap, 当前是 tab 页时,点击 tab 时触发 (mpvue 0.0.16 支持)

注意点 :

created:这个钩子是有bug的,所有页面的created函数会在项目加载的时候被一起调用,而且进入页面的时候不会在被调用,所以这个函数基本就不能使用了,用小程序的onLoad钩子代替

mounted:你如果从页面B返回页面A,页面A的mounted钩子不会被触发,因为页面没有被重新加载,如果有需要每次页面展示都要调用的逻辑,使用小程序的onShow代替

2、mpvue转换的部分规则

1) 微信小程序的页面的 query 参数是通过 onLoad 获取的,mpvue 对此进行了优化,直接通过 this.$root.$mp.query 获取相应的参数数据

2) 小程序里所有的 BOM/DOM 都不能用,因此v-html 、 v-text 不能用。

el:this.$refs...styles.width=offsetWIdth --> :style="{'width':offsetWidth}"

获取节点信息,

wx.createSelectorQuery().select(className).boundingClientRect().exec(res=>{
在此处获取到节点的信息: left,top,width,height})

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

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

<!-- 这种就不支持,建议写 computed -->

<p>{{ message.split('').reverse().join('') }}</p>

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

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

6) 不支持 官方文档: Class 与 Style 绑定 中的 classObject 和 styleObject 语法。

<template>
<!-- 支持 -->
<div class="container" :class="computedClassStr"></div>
<div class="container" :class="{active: isActive}"></div>
<!-- 不支持 -->
<div class="container" :class="computedClassObject"></div>
</template>
<script>
export default {
data () {
return {
isActive: true
}
},
computed: {
computedClassStr () {
return this.isActive ? 'active' : ''
},
computedClassObject () {
return { active: this.isActive }
}
}
}
</script>

7) 不支持在组件上使用 Class 与 Style 绑定,将class与style绑定在组件最外层div上

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

<!-- 在这种嵌套循环的时候, index 和 itemIndex 这种索引是必须指定,且别名不能相同,正确的写法如下 -->

<template>
<ul v-for="(card, index) in list">
<li v-for="(item, itemIndex) in card">
{{item.value}}
</li>
</ul>
</template>

9) 小程序不支持路由,因此,路由跳转使用小程序的页面导航 api代替

this.$router.push-->wx.navigateTo() //进入子页面
this.$router.replace-->wx.reLaunch()//打开新页面

10) 获取当前页面地址

this.$route.fullPath-->getCurrentPages()[0].route

11) 接口返回参数结构调整,小程序的 request请求接口返回的数据会在外层添加一个data

res:{
res:{ data:{
code:'000000', --> code:'000000',
data:{...} data:{...}
}   }
}

12) 不支持本地图片用作背景图,可以使用网络图片、或者 base64,或者使用img、image标签

13) 上拉加载 /下拉刷新,选用小程序的全局api,scroll-view中无法使用

14) 不支持 css媒体查询,css样式避免标签选择器,不易于维护

15) mpvue-wxParse富文本解析

1)安装npm i mpvue-wxparse

2)组件内

<template>
<wxParse :content="article" />
</template>
<script>
import wxParse from 'mpvue-wxparse'
components: {wxParse},
</script>
<style>
@import url("~mpvue-wxparse/src/wxParse.css");
</style>
Javascript 相关文章推荐
ExtJS4给Combobox设置列表中的默认值示例
May 02 Javascript
js实现简单秒表走动的时钟特效
Mar 25 Javascript
Bootstrap每天必学之折叠(Collapse)插件
Apr 25 Javascript
jQuery实现的可编辑表格完整实例
Jun 20 Javascript
bootstrap 下拉多选框进行多选传值问题代码分析
Feb 14 Javascript
详解vue父子模版嵌套案例
Mar 04 Javascript
JS实现异步上传压缩图片
Apr 22 Javascript
JavaScript中双向数据绑定详解
May 03 Javascript
使用express+multer实现node中的图片上传功能
Feb 02 Javascript
详解如何使用babel进行es6文件的编译
May 29 Javascript
vue template中slot-scope/scope的使用方法
Sep 06 Javascript
Vue组件系列开发之模态框
Apr 18 Javascript
angularJs中ng-model-options设置数据同步的方法
Sep 30 #Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
Sep 30 #Javascript
对angularJs中ng-style动态改变样式的实例讲解
Sep 30 #Javascript
使用angularjs.foreach时return的问题解决
Sep 30 #Javascript
angular将html代码输出为内容的实例
Sep 30 #Javascript
详解Vue.js iview实现树形权限表(可扩展表)
Sep 30 #Javascript
对angularJs中$sce服务安全显示html文本的实例
Sep 30 #Javascript
You might like
PHP实现的功能是显示8条基色色带
2006/10/09 PHP
下载文件的点击数回填
2006/10/09 PHP
mysql时区问题
2008/03/26 PHP
php中spl_autoload详解
2014/10/17 PHP
教你如何开启shopnc b2b2c 伪静态
2014/10/21 PHP
php实现处理输入转义字符的代码
2015/11/08 PHP
Laravel框架实现文件上传的方法分析
2019/09/29 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
一段实现页面上的图片延时加载的js代码
2010/02/11 Javascript
原生js ActiveXObject获取execl里面的值
2013/11/01 Javascript
js判断设备是否为PC并调整图片大小
2014/02/12 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
js操作table元素实现表格行列新增、删除技巧总结
2015/11/18 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
JS异步文件分片断点上传的实现思路
2016/12/25 Javascript
微信小程序 开发MAP(地图)实例详解
2017/06/27 Javascript
Vue+jquery实现表格指定列的文字收缩的示例代码
2018/01/09 jQuery
vue cli 3.0 搭建项目的图文教程
2019/05/17 Javascript
js构造函数constructor和原型prototype原理与用法实例分析
2020/03/02 Javascript
python进程管理工具supervisor使用实例
2014/09/17 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
2017/08/25 Python
Pandas之ReIndex重新索引的实现
2019/06/25 Python
python+django+rest框架配置创建方法
2019/08/31 Python
如何利用pycharm进行代码更新比较
2020/11/04 Python
Python 随机按键模拟2小时
2020/12/30 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
详解Canvas实用库Fabric.js使用手册
2019/01/07 HTML / CSS
opencv实现图像平移效果
2021/03/24 Python
汽车专业求职信
2014/06/05 职场文书
2014年售票员工作总结
2014/11/19 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
无锡灵山大佛导游词
2015/02/09 职场文书
python基础学习之生成器与文件系统知识总结
2021/05/25 Python
教你使用pyinstaller打包Python教程
2021/05/27 Python