自打写了 美团小程序框架 mpvue 蹲坑指南, 一发不可收拾,今天趁周末空闲,来写个 mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷。javascript
另外,我还专门为本文作了一个简单的项目,若是懒得从头开始搭项目的童鞋,能够直接去个人 github上克隆到本地, 安装一下依赖,便可直接在此基础在开发,不须要作任何配置。若是你以为该项目对有帮助, 请顺便给我 Star,大家的支持是我最大的动力,谢谢!php
好了,咱们进入主题,首先,请容许引用一下美团官方对 mpvue 的介绍html
mpvue 是一个使用 Vue.js 开发小程序的前端框架。框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其能够运行在小程序环境中,从而为小程序开发引入了整套 Vue.js 开发体验。前端
使用 mpvue 开发小程序,你将在小程序技术体系的基础上获取到这样一些能力:vue
学习最好的方式就动手,咱们就徒手撸一个 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
下面的counter
和logs
两个文件夹删掉,只保留一个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 蹲坑指南,但愿对你有帮助, 还有官方文档也是很不错的哦