vue之封装多个组件调用同一接口的案例


Posted in Javascript onAugust 11, 2020

背景:项目中有多个组件调用同一接口,为提高代码可维护性,需要封装公共方法

直接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,获取数据
 },

以上这篇vue之封装多个组件调用同一接口的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
你的编程语言可以这样做吗?
Sep 07 Javascript
获取css样式表内样式的js函数currentStyle(IE),defaultView(FF)
Feb 14 Javascript
window.location.reload()方法刷新页面弹出要再次显示该网页对话框
Apr 24 Javascript
js实现可折叠展开的手风琴菜单效果
Sep 07 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
Nov 30 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
Jan 19 Javascript
微信小程序 UI布局常用技巧整理总结
Dec 05 Javascript
webpack配置文件和常用配置项介绍
Apr 28 Javascript
Windows安装Node.js报错:2503、2502的解决方法
Oct 25 Javascript
JS中用EL表达式获取上下文参数值的方法
Mar 28 Javascript
openlayers4实现点动态扩散
Aug 17 Javascript
JavaScript中arguments的使用方法详解
Dec 20 Javascript
vue接口请求加密实例
Aug 11 #Javascript
vue组件暴露和.js文件暴露接口操作
Aug 11 #Javascript
vue npm install 安装某个指定的版本操作
Aug 11 #Javascript
小程序自动化测试的示例代码
Aug 11 #Javascript
vue自定义组件(通过Vue.use()来使用)即install的用法说明
Aug 11 #Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
Aug 11 #Javascript
Vue自定义全局弹窗组件操作
Aug 11 #Javascript
You might like
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
PHP 和 HTML
2006/10/09 PHP
PHP新手上路(四)
2006/10/09 PHP
PHP 事务处理数据实现代码
2010/05/13 PHP
js猜数字小游戏的简单实现代码
2013/07/02 Javascript
jsonp原理及使用
2013/10/28 Javascript
JQuery中serialize() 序列化
2015/03/13 Javascript
JavaScript实现在页面间传值的方法
2015/04/07 Javascript
跟我学习javascript的基本类型和引用类型
2015/11/16 Javascript
微信小程序 保留小数(toFixed)详细介绍
2016/11/16 Javascript
bootstrap警告框使用方法解析
2017/01/13 Javascript
BootStrap注意事项小结(五)表单
2017/03/10 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
JS实现的缓冲运动效果示例
2018/04/30 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
vue前端和Django后端如何查询一定时间段内的数据
2021/02/28 Vue.js
Python操作CouchDB数据库简单示例
2015/03/10 Python
Python使用Flask框架同时上传多个文件的方法
2015/03/21 Python
使用PDB简单调试Python程序简明指南
2015/04/25 Python
python查看列的唯一值方法
2018/07/17 Python
分享8个非常流行的 Python 可视化工具包
2019/06/05 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
详解python中的模块及包导入
2019/08/30 Python
Django中modelform组件实例用法总结
2020/02/10 Python
Waterford美国官网:爱尔兰水晶制品品牌
2017/04/26 全球购物
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
公司承诺书范文
2014/05/19 职场文书
大跃进口号
2014/06/16 职场文书
安全例会汇报材料
2014/08/23 职场文书
工厂标语大全
2014/10/06 职场文书
2015年幼儿园卫生保健工作总结
2015/05/12 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
创业计划书之熟食店
2019/10/16 职场文书
Golang 入门 之url 包
2022/05/04 Golang