mpvue 小程序开发

11/1/2020 mpvue

# mpVue 简介

mpVue (Vue in Mini Program) 美团工程师推出的基于Vue.js封装的用于开发小程序的框架,融合了原生小程序和Vue.js的特点,可完全组件化开发

# mpVue特点

组件化开发、完整Vue.js的开发体验、可使用Vue第三方扩展插件、Webpack构建项目、最终H5转换工具将项目编译成小程序识别的文件

# mpVue 项目构建

# 初始化项目

1. npm install vue-cli -g   ## 下载vue脚手架
2. vue init mpvue/mpvue-quickstart my-project  ## 初始化项目
3. cd my-project  ## 进入项目根目录
4. npm install  ## 根据package.json安装项目依赖包
5. npm start || npm run dev  ## 启动初始化项目

npm install less-loader@4.1.0 --save ## 使用less

# 小程序注册

1.src/app.json  ## 全局配置文件
2.src/App.vue  ## 等同于小程序中的app.js, 可写小程序应用实例的声明周期	  函数 || 全局样式
3.main.js ## 应用入口文件, 声明组件类型,挂载组件

# 入口main.js

import Vue from 'vue'
import App from './App.vue'
// Vue.config.productionTip = false 默认为false,用于启动项目的时候提示信息,设置为false关闭提示
Vue.config.productionTip = true
// 这个值是为了与小程序页面组件所区分开来,因为小程序页面组件和这个App.vue组件的写法和引入方式是一致的,为了区分两者,需要设置mpType值
App.mpType = 'app'
// 生成Vue实例
const app = new Vue(App)
// 挂载组件
app.$mount()

# 页面文件类型

1.	index.vue	#	等同于原生中的wxml + wxss + js
2.	main.js		#	当前组件页面的入口文件,用于生成当前组件实例,并挂载组件
3.	main.json	#	当前页面的局部配置文件(注意:index.vue组件最终会被转化为main.wxml以及main.wxss文件, 所以当前的json文件需命名main)

# src源文件

图片1

# 打包后的dist文件

图片2

# 定义page页面流程

src/pages/index/index.vue

<template>
  <div></div>
</template>
<script>
export default {}
</script>
<style>
</style>

src/pages/index/main.js

import Vue from 'vue'
import Index from './index.vue'

const index = new Vue(Index)
// 挂载当前页面
index.$mount()

重新编译打包:npm start

# mpVue 生命周期

**注意事项:**除了 Vue 本身的生命周期外,mpvue 还兼容了小程序生命周期,这部分生命周期钩子的来源于微信小程序的 Page (opens new window), 除特殊情况外,不建议使用小程序的生命周期钩子。

# Vue

1. beforeCreate 实例初始化之后,数据观测(data observer) 和 event/watcher 事件配置之前被调用。

2. created  实例已经创建完成之后被调用。在这一步,实例已完成以下的配置:数据观测(data observer),属性和方法的运算, watch/event 事件回调。然而,挂载阶段还没开始,$el 属性目前不可见。

3. beforeMount  在挂载开始之前被调用:相关的 render 函数首次被调用。

4. mounted  el 被新创建的 vm.$el 替换,并挂载到实例上去之后调用该钩子。

5. beforeUpdate  数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。 你可以在这个钩子中进一步地更改状态,这不会触发附加的重渲染过程。

6. updated  由于数据更改导致的虚拟 DOM 重新渲染和打补丁,在这之后会调用该钩子。

7. beforeDestroy  实例销毁之前调用。在这一步,实例仍然完全可用。

8.destroyed  Vue 实例销毁后调用。调用后,Vue 实例指示的所有东西都会解绑定,所有的事件监听器会被移除,所有的子实例也会被销毁。 该钩子在服务器端渲染期间不被调用。

# 小程序

1.  onLaunch: 小程序应用初始化
2.  onShow: 小程序启动获取后台进入前台
3.  onHide: 小程序应用从前台进入后台

1. onLoad 监听页面加载
2. onShow: 页面显示
3. onReady: 监听页面初始化渲染完成
4. onHide: 监听页面隐藏,注意当前页面实例依然存活
5. onUnload: 监听页面卸载
6. onPullDownRefresh: 监听用户下载动作
7. onReachBottom: 监听用户上拉触底操作
8. onShareAppMessage: 用户点击右上角分享功能
9. onPageScroll: 页面滚动
10. onTabItemTap: 当前是 tab 页时,点击 tab 时触发

# 挂载 Vuex 状态管理

import Vue from 'vue'
import App from './app.vue'
import store from './store'
Vue.config.productionTip = false
App.mpType = 'app'  

// Vue原型上挂载store
Vue.prototype.$store = store

const app = new Vue(App)
app.$mount()

####### ###

# 实例对象中获取路由传参

beforeMount () {
  const {query} = this.$root.$mp
}

####### ###

# fly.js 请求访问api封装

安装:cnpm i flyio --save

/src/api/ajax.js

import Fly from 'flyio/dist/npm/wx'
const fly = new Fly
export const get = (url, params = {}) => (
    new Promise((resolve, reject) => {
        fly.get(url, { params })
            .then(response => resolve(response.data))
            .catch(error => reject(error))
    })
)
export const post = (url, data = {}) => (
    new Promise((resolve, reject) => {
        fly.post(url, data)
            .then(response => resolve(response.data))
            .catch(error => reject(error))
    })
)

src/api/index.js

import { get } from "./ajax";
// 获取电影列表
export const reqSubjects = () => get('http://t.yushu.im/v2/movie/top250')

####### ###

# 原生小程序 VS mpvue 对比总结

1)原生小程序运行更稳定些, 兼容性好,mpvue可能在某些方面存在兼容性问题(vue-router)
2)mpvue支持vue组件化开发. 效率更高,功能更强大(双向数据绑定, vuex)
3)mpvue可基于webpack组件化, 工程化开发
4)原生不支持npm安装包,不支持css预处理
5)支持 computed 计算属性和 watcher 监听器;模板语法中只支持简单的 js 表达式。可以直接写 div 、span 等标签 
6)之前会vue的工程师上手mpvue框架的成本较低

# mpvue 配置TS

## 安装 vue 与装饰器,mpvue-loader目前支持用TypeScript来写,功能还在完善中(WIP)。需要搭 配vue-property-decorator来使用。
$ npm install --save vue vue-property-decorator 
## 安装 typescript
$ npm install --save typescript@3.3.3333 
## 安装  typescript 所需loader(注意存在版本兼容问题,需下载指定版本ts-loader与awesome-typescript-loader最新版目前不兼容webpack4以下版本)
$  npm install --save ts-loader@3.1.1 awesome-typescript-loader@4.0.1
## 安装声明文件@types/node @types/weixin-app
$ npm install --save @types/node @types/weixin-app

# mpvue 使用echarts

安装:npm i echarts mpvue-echarts --save

# 构建标签

<view class="echarts-wrap">
	<mpvue-echarts :echarts="echarts" :onInit="initChart" canvasId="demo-canvas" ref="echarts" />
</view>

# 在methods中定义初始化图形函数

let series = [
  {
    name: "成交订单",
    type: "line",
    data: [18, 36, 65, 30, 78, 40, 33],
    symbolSize: 8,
    itemStyle: { borderWidth: 2 }
  },
  {
    name: "新增收购",
    type: "line",
    data: [12, 50, 51, 35, 70, 30, 20],
    symbolSize: 8,
    itemStyle: { borderWidth: 2 }
  }
];
data: () => ({
    echarts
})
methods: {
    // 初始化图形
    initChart(canvas, width, height, dpr) {
      const chart = echarts.init(canvas, null, {
        width: width,
        height: height,
        devicePixelRatio: dpr
      });
      canvas.setChart(chart);
      const option = {
        color: ["#d34632", "#29a2f2"],
        seriesCnt: 2,
        // 标题配置
        title: {
          textStyle: {
            color: "#333333",
            fontWeight: "bold"
          },
          text: "数据分析",
          left: "center"
        },
        // 图例配置
        legend: {
          type: "plain",
          bottom: "10%"
        },
        // 网格配置
        grid: { containLabel: true },
        // 提示框组件
        tooltip: { trigger: "axis" },

        // x轴配置
        xAxis: {
          type: "category",
          boundaryGap: false,
          data: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"]
          // show: false
        },
        // y轴配置
        yAxis: {
          splitLine: {
            // 分割线配置
            lineStyle: { type: "dashed" }
          }
        },
        // 线条数据
        series: series
      };
      chart.setOption(option);
      return chart;
    }
  }

# 动态渲染数据

标签添加ref

<mpvue-echarts :echarts="echarts" :onInit="initChart" canvasId="demo-canvas" ref="echarts" />

使用$refs动态渲染

this.$refs.echarts.init();