mpvue 开发小程序接口数据统一管理
mpvue项目里做API与数据分离统一管理
小程序里请求数据接口使用wx:request,因为考虑项目比较大,最好把wx:request封装起来,统一使用管理
utils.js 配置开发环境和线上环境接口
let util = {};
const ajaxUrl = process.env.NODE_ENV === 'development'
// 测试接口地址
? 'code.net.cn/api'
// 线上接口地址
: 'https://api.code.net.cn';
util.API = ajaxUrl;
util.oauthUrl = ajaxUrl;
export default util;
fetch.js 暴露封装请求接口方法
import utils from '../utils/utils'
import store from '../vuex/index'
export async function request(obj) {
let token = store.state.wechat.token;
return new Promise((resolve, reject) => {
// 是否显示loading
if (obj.dontLoading !== true) {
wx.showNavigationBarLoading();
wx.showLoading({
mask: true,
title: '处理中'
});
}
wx.request({
url: utils.API + obj.url,
data: obj.data,
header: {
'content-type': 'application/json',
'Accept': 'application/json',
'Authorization': 'Bearer ' + token,
...obj.header
},
method: obj.method,
success(res) {
// 处理返回信息
handleResult(res);
// 处理 new token
handleNewToken(res);
if (obj.dontLoading !== true && store.state.showing !== true) {
wx.hideLoading();
wx.hideNavigationBarLoading();
}
store.commit('setShowing', false);
resolve(res.data.data)
},
fail(e) {
reject(e)
}
})
})
}
// 处理new token
function handleNewToken(res) {
let new_token = res.header['New-Token'];
if (new_token) {
store.commit('setToken', new_token)
}
}
// 统一显示toast
function showToast(message) {
wx.showToast({
title: message,
icon: 'none',
duration: 2000
});
store.commit('setShowing', true);
}
/**
* 处理code信息
* @param res
*/
function handleResult(res) {
let code = res.data.code;
switch (code) {
case 200:
break;
case 401 :
showToast("身份校验信息失败,请刷新页面重试!");
store.dispatch('getUserToken');
break;
case 412 :
showToast('未填写个人信息!');
wx.navigateTo({url: '../bind/main'});
break;
case 422 :
let errors = '';
for (var key in res.data.errors) {
res.data.errors[key].forEach((item) => {
errors += item + " "
})
}
errors = errors ? errors : '提交的信息错误,请检查!';
showToast(errors);
break;
default:
let msg = res.data.message ? res.data.message : '未知错误,请重试!';
showToast(msg);
}
}
统一在vuex里面做数据请求接口
比如订单接口
import {request} from "../../api/fetch";
const state = {
// 订单列表
orderList: [],
}
const mutations = {
setOrderList(state, data) {
state.orderList = data;
}
}
const actions = {
/**
* 下订单
* @param commit
* @param params
* @returns {Promise<*>}
*/
async createOrder({commit}, params) {
const res = await request({
method: 'post',
url: '/wechat/order',
data: params,
});
return res;
},
/**
* 获取订单详情
* @param commit
* @param id 订单id
* @returns {Promise<*>}
*/
async getOrderDetail({commit}, id) {
const res = await request({
method: 'get',
url: '/wechat/order/' + id,
data: {}
})
return res;
},
/**
* 获取订单列表
* @param commit
* @returns {Promise<*>}
*/
async getOrderList({commit}) {
const res = await request({
method: 'get',
url: '/wechat/order',
data: {}
})
commit('setOrderList', res);
return res;
}
}
export default {
state,
actions,
mutations
}
现在已经接口API与请求数据分开统一处理,在页面仅仅需要调用就可以使用数据了
<script>
import {mapActions, mapState} from 'vuex';
export default {
computed: {
...mapState({
orderList: state => state.order.orderList,
}),
},
async onShow() {
// 调用请求获取订单列表接口
await this.getOrderList();
},
methods: {
...mapActions([
'getOrderList',
]),
}
}
</script>
在这稍微说一下个人观点,async/await和Promise异步,我这次项目有同时使用promise和async/await,两个有不同的优缺点,Promise的回调机制async/await好,缺点就是写很多then回调,async/await的写法与同步写起来很相似,写起代码来也整洁,易理解。建议大家在不同的场景下使用它们的各自优缺点。
mpvue 开发小程序接口数据统一管理的更多相关文章
- 使用mpvue开发小程序
前言: 最近接到小程序的开发需求,由于之前也没开发过小程序,心情还是有点激动.先花15分钟看一遍小程序官方文档,再花10分钟看一遍mpvue官方文档,然后拿着原型图和UI图就开干.踩了不少坑,写篇博客 ...
- 使用mpvue开发小程序教程(四)
在上一章节中,我们将vue-cli命令行工具生成的代码骨架中的src目录清理了一遍,然后从头开始配置和编写了一个可以运行的小程序页面,算是正真走上了使用mpvue开发小程序的第一步.今天我们将进一步来 ...
- 使用mpvue开发小程序教程(一)
前段时间,美团开源了mpvue这个项目,使得我们又多了一种用来开发小程序的框架选项.由于mpvue框架是完全基于Vue框架的(重写了其runtime和compiler),因此在用法上面是高度和Vue一 ...
- 使用mpvue开发小程序教程(二)
在上篇文章中,我们介绍了使用mpvue开发小程序所需要的一些开发环境的搭建,并创建了第一个mpvue小程序代码骨架并将其运行起来.在本文中,我们来研究熟悉一下mpvue项目的主要目录和文件结构. 在V ...
- 使用mpvue开发小程序教程(五)
在上一章节中,我们了解了组件的三个基本特性以及组件的基本使用方法.在实际的小程序开发中,我们应该以组件的思维去设计每个小程序的功能页面,对其进行合理的组件拆分,让每个部分都保持功能简洁.条理清楚.各司 ...
- 使用mpvue开发小程序教程(三)
在上一篇文章中,我们熟悉了一下通过vue-cli生成的mpvue工程代码骨架的基本结构,大致了解了每一个部分的代码到底要放到何处.从本文起我们就开始涉及真正的编码部分,学习使用Vue的语法去编写小程序 ...
- 学习笔记:mpvue开发小程序——入门
接下来可能要开发一个小程序,同事推荐使用mpvue,那么我提前熟悉下. 官网地址:http://mpvue.com/ 1.快速上手 http://mpvue.com/mpvue/quickstart/ ...
- 使用mpvue开发小程序教程(六)
在上一章节中,我们列举了在Vue中能用但在mpvue中不能用或需要特别注意的特性,在实际开发前了解一下还是很有必要的,可以避免浪费找错误的时间. 如果你使用过原生的小程序框架,你一定经历过或思考过怎么 ...
- 使用mpvue开发小程序如何定义全局变量
我们创建好mpvue项目之后,找到src/main.js打开在后面添加一行代码 (注意:不能在const app = new Vue(App) 之前添加) Vue.prototype.globalDa ...
随机推荐
- CentOS 7 部署 ASP.NET Core 应用程序
原文:CentOS 7 部署 ASP.NET Core 应用程序 看了几篇大牛写的关于 Linux 部署 ASP.NET Core 程序的文章,今天来实战演练一下.2017年最后一个工作日,提前预祝大 ...
- android Bluetooth程序设计
Bluetooth一个简短的引论 蓝牙,是一种短距离通信配套设备(一般10m中)无线技术. 包含移动电话.PDA.无线耳机.笔记本电脑.相关外设等众多设备之间进行无线信息交换.利用"蓝牙&q ...
- VS2005下如何安装配置编译Qt4.6
本文将使用简单的几个步骤说明在VC 2005下如何编译安装并开发Qt4.6应用程序,其实大部分方法和Qt4.6.0是一样的,不过Qt4.6.0集成了Qt Creater,目录的形式有点改变了,现在我就 ...
- Leetcode 144 Binary Tree Preorder Traversal 二叉树
二叉树的基础操作:二叉树的先序遍历(详细请看数据结构和算法,任意本书都有介绍),即根,左子树,右子树,实现方法中还有用栈实现的,这里不介绍了 /** * Definition for binary t ...
- 【LeetCode】LRU Cache 解决报告
插话:只写了几个连续的博客,博客排名不再是实际"远在千里之外"该.我们已经进入2一万内. 再接再厉.油! Design and implement a data structure ...
- krpano全球漫游相同的声音和声音添加的场景(文章内容已移至krpano中国网站)
请关注微信订阅号 krpano watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdG1ob2s=/font/5a6L5L2T/fontsize/400/f ...
- 如何加入该网站for Linux(绑定域名)
[路径跟踪配置由阿里云提供的标准环境的路径为准,假设你单独安装.请根据实际的安装路径配置]. 1.cd /alidata/server/httpd/conf/vhosts/ 进入绑定域名所在文件夹 ...
- sql执行分页查询
declare @PageSize int,@PageIndex int;set @PageSize=5;set @PageIndex=2;WITH Pagination AS( SELECT * ...
- ELINK离线编程器常见问题
Q1 编程器是否可以接JTAG JTAG接口已经包含SWD接口引脚,按以下引脚对应接线即可: SWDIO->目标板JTAG 的JTMS SWCLK->目标板JTAG 的JTCK Q2 PC ...
- 使用Notepad++远程编辑Ubuntu上的源码
简单搭建了在Windows上远程编辑Ubuntu Server 14.04上面源代码的环境,记录一下,给需要的人. Notepad++安装NppFTP 从插件菜单打开PluginManager,选中N ...