vue之封装多个组件调用同一接口的案例
作者:_freely 发布时间:2024-04-09 10:47:32
标签:vue,封装,组件,接口
背景:项目中有多个组件调用同一接口,为提高代码可维护性,需要封装公共方法
直接return 接口调用的结果
export function getAll() {
let all = [];
let opt = {
method: 'get',
url: 'all/teacher',
success: res => {
all = res.data.value || [];
},
fail: err => {
tipInfo(err.data.desc, '提示', false, 'warning');
}
};
$http(opt);
return all;
}
console.log(getAll()); // []
$http是在axios基础 进行封装的,是一个异步的方法,所以在组件中调用getAll()方法,拿到的是一个空数组
使用promise进行封装
export function getAll() {
return new Promise((resolve, reject) => {
let opt = {
method: 'get',
url: 'all/teacher',
success: res => {
resolve(res.data.value || []);
},
fail: err => {
reject(err.data.desc);
}
};
$http(opt);
});
}
// 调用
getAll()
.then(data => {
console.log(data); //
})
.catch(err => {
this.tipInfo(err.data.desc, '提示', false, 'warning');
});
使用promise进行封装后,方法,不够简洁,达不到优化的目的
使用回调函数进行封装
export function getAll(callback) {
let opt = {
method: 'get',
url: 'all/teacher',
success: res => {
callback(res.data.value || []);
},
fail: err => {
tipInfo(err.data.desc, '提示', false, 'warning');
}
};
$http(opt);
}
// 调用
getAllPark(data => {
console.log(data); // 成功拿到数据
});
补充知识:vue多个页面用到同一个接口的数据( 比如名称列表 ),使用 vuex
第一种: 调接口不传参数
1、在 store文件夹下的 modules文件夹下新建 getName.js
// getName.js
import { getNameList } from "@/apis/apis"; // 导入接口
export default {
state: {
nameList: [] // 名称列表
},
mutations: {
changeNameList(state, payload) {
state.nameList= payload;
}
},
actions: {
geName(context) {
getNameList ({}).then(res => {
if (res.code == 0) {
context.commit("changeNameList", res.data);
} else {
Message.error(res.message);
}
});
}
}
};
2、在 store文件夹下 index.js 中引入 getName.js
import getNamefrom "./modules/getName";
export default new Vuex.Store({
modules: {
getName
},
});
3、在整个项目刚开始加载的时候就是用 dispatch 分发,这样就不管在哪个页面需要使用到都可以使用
比如打开页面首页的时候,在mounted里面就 dispatch 触发geName函数
<script>
export default {
mounted() {
this.$store.dispatch('geName')
},
}
4、如在多个页面都需要使用 nameList , 以在某一个页面使用为例,其余页面一样用法
<template>
<div>
<el-select v-model="form.name" placeholder="请选择名称" clearable>
<el-option v-for="item in nameList" :key="item.id" :label="item.fieldName" :value="item.fieldName"></el-option>
</el-select>
</div>
</template>
<script>
export default {
computed: {
nameList() {
return this.$store.state.getName.nameList
}
},
}
</script>
第二种: 调接口传参数
import movieService from '../services/movieService.js'
export default {
namespaced: true,
state: {
current: 1,
pageSize: 2,
total: 0,
datas: [],
isLoading: false
},
mutations: { //改变状态的通用方法 设置整个状态
setState(state, newState) {
for (const prop in newState) {
state[prop] = newState[prop]
}
}
},
actions: {
fetch(context) { // 根据当前的分页设置,获取电影
context.commit("setState", { isLoading: true })
movieService.getMovies(context.state.current, context.state.pageSize).then(resp => {
console.log(resp)
context.commit("setState", resp)
context.commit("setState", { isLoading: false })
})
}
}
}
// 在 movieService.js
export default {
async getMovies(page, pageSize) {
const datas = await fetch("https://api.myjson.com/bins/15f8x1")
.then(resp => resp.json())
return {
total: datas.length,
datas: datas.slice((page - 1) * pageSize, page * pageSize) //返回分页的电影数据
}
},
//通过id获取电影数据
async getMovie(id) {
const datas = await fetch("https://api.myjson.com/bins/15f8x1")
.then(resp => resp.json())
return datas.find(item => item._id === id)
}
}
在页面使用:
mounted() { //远程获取数据
this.$store.dispatch("movie/fetch") //出发vuex中movie.js里的action,获取数据
},
来源:https://blog.csdn.net/hbjiankely/article/details/87924295


猜你喜欢
- 目录一、两个模块二、SMTP端口三、四大步骤1、构造邮件内容2、连接邮件服务器3、登陆邮件服务器4、发送邮件四、常用场景1、纯文本邮件2、发
- 前言Vue 框架通过数据双向绑定和虚拟 DOM 技术,帮我们处理了前端开发中最脏最累的 DOM 操作部分, 我们不再需要去考虑如何操作 DO
- 一、前言我们今天要安装的selenium 就是浏览器自动化测试框架,是一个用于Web应用程序的测试工具,就是模拟用户操作。支持的浏览器包括C
- --程序员们在编写一个雇员报表,他们需要得到每个雇员当前及历史工资状态的信息, --以便生成报表。报表需要显示每个人的晋升日期和工资数目。
- 如何制作一个安全的页面?随后,让我们来编程:manage.asp' 登录页面<%@ Language=VB
- 假设要生成一千万个随机数,常规的做法如下:var numbers = [];for (var&nbs
- 我 们知道Express是一个基于NodeJS的非常优秀的服务端开发框架,本篇CSSer将提供express框架的route和route c
- 这两天终于忍不住的去实验了一下,为什么网页的字体有时会显示成超级无敌难看的宋体呢?其实宋体不难看,难看的只是把它放在Leopard下,没有点
- 前言上一篇介绍了客户端流式RPC,客户端不断的向服务端发送数据流,在发送结束或流关闭后,由服务端返回一个响应。本篇将介绍双向流式RPC。双向
- 简介除ide的执行方式外,命令行的方式执行Python脚本是参数化程序执行的一种常见且简单的方法,正确处理命令行参数,可以提供给包含某种参数
- 修改my.ini或my.conf,将sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_US
- 阅读目录什么是前端代码异常 window.onerror写一个js报错的上报库注意点:缺点:在平时的工作,js报错是比较常见的一个
- 线性代数线性代数,矩阵计算,优化与内存;比如矩阵乘法,分解,行列式等数学知识,是所有数组类库的重要组成部分。和MATLAB等其他语言相比,n
- 今天设计models时,用到了choice这个属性,用来限制用户做出选择的范围。比如说性别的选择(男或女)。class User(Abstr
- 使用MySQL的命令终端时,如果输入SQL有误,将有beep声。若要关闭该功能,根据mysql --help,使用mysql --no-be
- Javascript有许多内建的方法来产生对话框,如:window.alert(), window.confirm(),window.pro
- 导入相关包import timeimport pydashimport base64import requestsfrom lxml imp
- tkinter是python的标准Tk GUI工具包的接口,在windows下如果你安装的python3,那在安装python的时候,就已经
- 前言老照片上色其实很早之前就想写了,也有不少人问了我这个项目。最近把DeOldify项目好好弄了弄。项目地址:DeOldify项目地址先看看
- 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别os._exit() 和