为了减少重复书写同样的数据请求代码,我们需要将类似的请求进行封装
一、封装请求列表数据类请求
第一步我们需要创建一个api目录,并创建一个index.js文件,再创建一个列表数据请求get_list.js文件
在get_list.js中书写以下代码:
export const get_list = (parames) => {
return new Promise((reslove,reject) => {//返回一个Promise对象实例
uniCloud.callFunction({
name: parames.name//传入需要执行的云函数名称
data: parames.data//传入客户端需要提交的数据
}).then((res) => {
if(res.result.code === 200) {//判断客户端响应状态码
reslove(res.result)//返回正确结果
}else {
reject(res.result)//返回错误结果
}
}).catch((err) => {
reject(err)//抛出异常
})
})
}
第二步在index.js中导入get_list.js
import {get_list} from './get_list.js'
export default {
get_list
}
第三步在main.js中导入index.js并挂载到Vue实例上
import api from '@/common/api/index.js'
Vue.prototype.$api = api
到此我们就可以在想用的地方通过this.$api.get_list()方法来进行请求了,如下代码:
this.$api.get_list({name:'get_article_list'}).then((res) => {
console.log(res)
})
二、对该封装进行下一步改善
根据上面的代码,我们实现了第一步封装,但会发现,我们每写一个数据请求时,都需要像get_list.js中那样返回一个Promise对象,于是我们需要新建一个http目录,并创建一个http.js文件,将get_list.js中的Promise代码移植到http.js中,并将其导出:
export default function $http(parames) {
return new Promise((reslove,reject) => {
uniCloud.callFunction({
name: parames.name,
data: parames.data
}).then((res) => {
if(res.result.code === 200) {
reslove(res.result)
}else {
reject(res.result)
}
}).catch((err) => {
reject(err)
})
})
}
随后在get_list.js中引入,并书写以下代码:
import $http from '../http/http.js'
export const get_list = (parames) => {
return $http({
name: parames.name,
data: parames.data
})
}
这样我们每次新增一个请求时只需要返回一个$http方法,并将执行的云函数名和参数传入即可
三、改善index.js使其实现自动化导入
现在我们每增加一个数据请求文件,都需要在index.js中引入并导出,当文件比较多的时候我们处理就比较麻烦,所以我们在这运用require.context()方法实现自动化导出,其第一个参数是需要导出的目录地址,第二个参数是是否遍历子目录,第三个参数是,我们需要遍历什么样的文件,此处我们的目录结构如图:
index.js文件代码如下:
const requireApi = require.context(
'.',//遍历当前目录
false,//不遍历子目录
/.js$///遍历以.js结尾的文件
)
let mod = {}
requireApi.keys().forEach((key, index) => {
if(key === './index.js') return
Object.assign(mod, requireApi(key))
})
export default mod
自动化导出到此就完工了!