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 相关文章推荐
JQuery toggle使用分析
Nov 16 Javascript
jquery validation插件表单验证的一个例子
Mar 03 Javascript
谈谈关于JavaScript 中的 MVC 模式
Apr 11 Javascript
JavaScript 命名空间 使用介绍
Aug 29 Javascript
js闭包实例汇总
Nov 09 Javascript
javascript制作网页图片上实现下雨效果
Feb 26 Javascript
利用node.js制作命令行工具方法教程(一)
Jun 22 Javascript
详解AngularJS2 Http服务
Jun 26 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
Feb 15 Javascript
vue点击按钮动态创建与删除组件功能
Dec 29 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
Feb 14 Javascript
JavaScript 声明私有变量的两种方式
Feb 05 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程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
详解PHP数组赋值方法
2015/11/07 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
JQuery this 和 $(this) 的区别
2009/08/23 Javascript
js实现的map方法示例代码
2014/01/13 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
优化Node.js Web应用运行速度的10个技巧
2014/09/03 Javascript
JS实现控制表格单元格垂直对齐的方法
2015/03/30 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
2015/04/16 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
学习JavaScript设计模式(代理模式)
2015/12/03 Javascript
荐书|您有一份JavaScript书单待签收
2017/07/21 Javascript
Vue.js如何实现路由懒加载浅析
2017/08/14 Javascript
Vue如何实现响应式系统
2018/07/11 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
JS实现li标签的删除
2019/04/12 Javascript
了解javascript中let和var及const关键字的区别
2019/05/24 Javascript
echarts大屏字体自适应的方法步骤
2019/07/12 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
2019/11/01 Javascript
Python简单生成8位随机密码的方法
2017/05/24 Python
如何使用Python 打印各种三角形
2019/06/28 Python
python命令行工具Click快速掌握
2019/07/04 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
基于python操作ES实例详解
2019/11/16 Python
Python类继承和多态原理解析
2020/02/05 Python
在Anaconda3下使用清华镜像源安装TensorFlow(CPU版)
2020/04/19 Python
Python实现动态循环输出文字功能
2020/05/07 Python
浅析两列自适应布局的3种思路
2016/05/03 HTML / CSS
美国女士泳装店:Swimsuits For All
2017/03/02 全球购物
计算机大学生的自我评价
2013/10/15 职场文书
最新大学生创业计划书写作攻略
2014/04/02 职场文书
劳务派遣管理制度(样本)
2019/08/23 职场文书
element多个表单校验的实现
2021/05/27 Javascript
Vue中使用import进行路由懒加载的原理分析
2022/04/01 Vue.js
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android