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 相关文章推荐
javascript温习的一些笔记 基础常用知识小结
Jun 22 Javascript
JavaScript Promise启示录
Aug 12 Javascript
浅析JavaScript中的事件机制
Jun 04 Javascript
javascript冒泡排序小结
Apr 10 Javascript
jquery自定义插件开发之window的实现过程
May 06 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
May 31 Javascript
jQuery 操作input中radio的技巧
Jul 18 Javascript
jQuery tip提示插件(实例分享)
Apr 28 jQuery
jquery实现图片放大点击切换
Jun 06 jQuery
Vue实现动态添加或者删除对象和对象数组的操作方法
Sep 21 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
Nov 30 Javascript
jQuery冲突问题解决方法
Jan 19 jQuery
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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
php简单浏览目录内容的实现代码
2013/06/07 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
php创建和删除目录函数介绍和递归删除目录函数分享
2014/11/18 PHP
php抽象类用法实例分析
2015/07/07 PHP
php无限级评论嵌套实现代码
2018/04/18 PHP
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
JavaScript直播评论发弹幕切图功能点集合效果代码
2016/06/26 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
单行 JS 实现移动端金钱格式的输入规则
2017/05/22 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
浅谈基于Vue.js的移动组件库cube-ui
2017/12/20 Javascript
vue2.0组件之间传值、通信的多种方式(干货)
2018/02/10 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
Python 字符串操作实现代码(截取/替换/查找/分割)
2013/06/08 Python
python实现log日志的示例代码
2018/04/28 Python
浅谈python中拼接路径os.path.join斜杠的问题
2018/10/23 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
超实用的 30 段 Python 案例
2019/10/10 Python
Python 多进程原理及实现
2020/12/21 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
anello泰国官方网站:日本流行包包品牌
2019/08/08 全球购物
Expedia瑞典官网:预订度假屋、酒店、汽车租赁、机票等
2021/01/23 全球购物
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
求职自荐信范文格式
2013/11/29 职场文书
会计系个人求职信范文分享
2013/12/20 职场文书
祖国在我心中演讲稿600字
2014/05/04 职场文书
经营理念口号
2014/06/21 职场文书
事业单位年度考核评语
2014/12/31 职场文书
2016年“5.12”国际护士节活动总结
2016/04/06 职场文书
SQL 尚未定义空闲 CPU 条件 - OnIdle 作业计划将不起任何作用
2021/06/30 SQL Server
Python使用mitmproxy工具监控手机 下载手机小视频
2022/04/18 Python