美团 mpvue 入门教程

美团小程序框架 mpvue 入门教程

自打写了 美团小程序框架 mpvue 蹲坑指南, 一发不可收拾,今天趁周末空闲,来写个 mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷。javascript

另外,我还专门为本文作了一个简单的项目,若是懒得从头开始搭项目的童鞋,能够直接去个人 github上克隆到本地, 安装一下依赖,便可直接在此基础在开发,不须要作任何配置。若是你以为该项目对有帮助, 请顺便给我 Star,大家的支持是我最大的动力,谢谢!php

好了,咱们进入主题,首先,请容许引用一下美团官方对 mpvue 的介绍html

mpvue 是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其能够运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。前端

主要特性

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

  1. 完全的组件化开发能力:提升代码复用性
  2. 完整的 Vue.js 开发体验
  3. 方便的 Vuex 数据管理方案:方便构建复杂应用
  4. 快捷的 webpack 构建机制:自定义构建策略、开发阶段 hotReload
  5. 支持使用 npm 外部依赖
  6. 使用 Vue.js 命令行工具 vue-cli 快速初始化项目
  7. H5 代码转换编译成小程序目标代码的能力

开始

学习最好的方式就动手,咱们就徒手撸一个 demo 项目出来跑一跑,看看到底有没有官方说的那么好。 若是你有过 vue 的开发经历,相信你会对这个过程很是熟悉,甚至你都不须要安装其余工具, 直接用 vue-cli 建立项目,若是你一块儿没安装过 vue-cli,那么你要先运行一下命令java

npm install --g vue-cli 

安装完 vue-cli 之后,咱们就能够运行一下命令,来自动构建一个项目(期间会询问你是否使用一些工具 /插件, 请根据本身的实际状况选择 y 或 n,对于不懂得该选 y 仍是 n 的,通通选 n )webpack

vue init mpvue/mpvue-quickstart test-wxapp 

而后 进入咱们建立的项目,并安装依赖git

cd test-wxapp npm i 

最后,在运行一下咱们的开发服务github

npm run dev 

项目就跑起来了,这个时候,咱们打开微信开发者工具,选择小程序,而后新建一个,项目目录填 咱们项目目录下的dist目录 test-wxapp/dist,就能够看到效果了web

进阶

到此为止,一个基本的项目就完成了,可是,本文的目的不是让你学会搭一个空项目的,空项目的话,我以为官方教程作的已经够好了。 接下来,咱们来删掉几个示例文件,而后一步步添加页面. 首先,咱们看一下项目的配置文件 /src/main.js 里面的初始内容以下:

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/logs/main', '^pages/index/main'], window: { backgroundTextStyle: 'light', navigationBarBackgroundColor: '#fff', navigationBarTitleText: 'WeChat', navigationBarTextStyle: 'black' } } } 

这里的 config 字段下面的内容,就是整个小程序的全局配置了,其中pages是页面的路由,window则是页面的一些配置(大部分都是顶部栏的配置) ,这些配置,最终都会被打包到原生小程序的app.json,对这些配置不了解的,建议看一下微信方法的小程序文档,这里不作赘述。

咱们先把/src/pages 下面的counterlogs两个文件夹删掉,只保留一个index ,顺便把 /src/components 文件夹下面的文件也全删掉, 而后把/src/main.js 里面的 config.pages里面多余的路由也删掉,只保留一条['^pages/index/main'],这样目前就只有个 index 页面,

而后咱们打开/src/pages/index/index.vue 咱们把里面多余的代码删掉,只保留一个基础骨架

<template> <div class="container"> 我是首页 </div> </template> <script> export default { data () { return { } }, methods: {}, created () {} } </script> <style scoped> </style> 

tip /src/utils/index.js 是一个公共函数库,里面只有一个简单的格式化日期函数,不要也能够删掉

到目前为止,一个干净的空项目就算是 ok 了,接下来咱们来对微信原生的一些反人类的东西来作一下优化。

1、先用 mptoast 组件代替官方提供的 wx.showToast, wx.showToast 诸多不便我就不说了,关键是还有坑 小程序基础库比较低的,无论你怎么设置,老是会在弹窗里面加一个钩钩,有时候我想弹出错误消息也是打钩, 严重误导用户,字数上还有限制有带 icon 的不能超过 7 个字,你说说,你说说 7 个字够干吗的, 那咱们来看看 mptoast,据官方介绍mptoast 具备轻量,配置少,冗余少,使用简单,可定制性强等特色

咱们开根据官方介绍,从 npm 引入并配置

npm i vuex npm i mptoast -D 

在项目的主配置文件(通常位于 src/main.js )加入如下代码

import mpvueToastRegistry from 'mptoast/registry' mpvueToastRegistry(Vue) 

在你须要弹窗的页面,引入组件,并注册,而后在页面内加入一个你注册的组件,就能够在 js 里面调用 this.$mptoast()了, 如下是一个简单的实例

<template> <div> <-- 省略其余代码 --> <mptoast /> </div> </template> <script> import mptoast from 'mptoast' export default { components: { mptoast }, data () { return {} }, methods: { showToast () { this.$mptoast('我是提示信息') }, } } </script> 

使用起来仍是蛮简单的

二,用 promise 封装异步请求函数 在小程序的环境下面,要想发送一个外部请求,咱们只能使用小程序官方提供的 wx.request 方法, 可是该方法的代码风跟跟 Jquery 年代的 Ajax 同样,都散靠回调来处理请求响应,若是有不少层回调, 就会有不少层嵌套,这让咱们这些平时被 async-await 惯坏的人怎么接受?

因此,建完基本项目,咱们要作的第一件事,就是用 wx.request 本身封装一个基于 promise 的异步请求方法。 咱们先来看一下 wx.request 的一个官方示例代码

wx.request({
  url: 'test.php', //仅为示例,并不是真实的接口地址 data: { x: '' , y: '' }, header: { 'content-type': 'application/json' // 默认值 }, success: function(res) { console.log(res.data) } }) 

能够看到,每次请求都要发送一大堆的东西,重点少这些东西里面,极可能对于一个项目来讲, 绝大部分都是固定不变的,那这样,不是冗余了么。

tip: 更多 wx.request 参数,请参考 微信官方文档

咱们分析一下,第一个参数是 url,也就是咱们请求的地址,这个应该是每次都不同的,可是,不同的应该也只是 url 的最后一部分, 接口名称的位置不同,前面的服务器地址通常都是同样的,例如http://www.abc.com/api/member/login 对于同一个项目的全部接口 服务器地址http://www.abc.com/api/应该都是同样的,不同的只是后面的接口名称member/login, 那咱们能够把 url 拆分红 服务器地址 + 接口名称,这样作也方便后期上线的时候,切换服务器地址。

第二个参数是请求的参数,请求的参数应该是每次都不同的,因此这个咱们就不作修改(事实上实际应用中, 常常有可能出现须要每一个接口都带一个 token 的,咱们也能够在这里统一加上去,不过这里就不作深刻)

第三个参数是 请求头,这个通常同一个项目里面,这些都是同样的,因此咱们就写死。 这里还有一个参数method请求方法, 这里由于使用默认值 GET,因此就没列出,咱们这边须要作设置,由于如今先后分离的模式,如今基本上大部分都是 POST 请求,因此咱们这边也写死成 method:'POST'

最后一个就是处理请求结果回调函数,示例里面只有一个请求成功的回调,其实咱们应该再加一个请求实例的处理函数,fail,而咱们封装这个函数的重点,就是要用 promise 来处理这两个回调函数,使它们能够用 async-await 的语法

// 假设如下代码在 `/src/utils/requestMethod.js` let serverPath = 'http://www.abc.com/api/' export function post(url,body) { return new Promise((resolve,reject) => { wx.request({ url: serverPath + url // 拼接完整的 url data: body method:'POST', header: { 'content-type': 'application/json' }, success(res) { resolve(res.data) // 把返回的数据传出去 }, fail(ret) { reject(ret) // 把错误信息传出去 } }) }) } 

有了这样的封装,咱们就能够在其余地方引入 上面这个文件,而后使用 post 函数请求

import {post} from '/src/utils/requestMethod.js' // 须要注意的是,这行代码必需要在 async 修饰的函数里面才能正确调用 let res = await post('member/login',{name:myname}) 

若是你以为每次都要 import 这个文件很麻烦,那咱们也能够把它挂在到 Vue(mpvue)的原型(prototype)上,咱们打开/src/main.js文件,而后在里面加入如下代码

import {post} from '/src/utils/requestMethod.js' Vue.prototype.$post = post 

这样,咱们就能够在 Vue(mpvue)的全部实例里面,直接使用 this.$post()来调用,只要一行代码,

// 这行代码一样须要在 async 修饰的函数里面才能正确调用 let res = await this.$post('member/login',{name:myname}) 

怎么样?是否是比原生的方便不少呢?

结束语

固然,跑起来之后,你可能还会遇到各类问题,这里我有对我本身遇到的问题作了一些总结 美团小程序框架 mpvue 蹲坑指南,但愿对你有帮助, 还有官方文档也是很不错的哦

相关文章
相关标签/搜索