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 相关文章推荐
TFDN图片播放器 不错自动播放
Oct 03 Javascript
jQuery Dialog 弹出层对话框插件
Aug 09 Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
May 23 Javascript
javascript 二进制运算技巧解析
Nov 27 Javascript
浅谈JavaScript事件绑定的常用方法及其优缺点分析
Nov 01 Javascript
微信小程序 登录的简单实现
Apr 19 Javascript
微信小程序实现给循环列表添加点击样式实例
Apr 26 Javascript
jQuery实现checkbox全选功能完整实例
Jul 12 jQuery
详解Vue CLI3配置之filenameHashing使用和源码设计使用和源码设计
Aug 31 Javascript
vue计算属性get和set用法示例
Feb 08 Javascript
JS扁平化输出数组的2种方法解析
Sep 17 Javascript
js 数组当前行添加数据方法详解
Jul 28 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
php学习之变量的使用
2011/05/29 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
php简单计算页面加载时间的方法
2015/06/19 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
php实现文件上传基本验证
2020/03/04 PHP
用正则获取指定路径文件的名称
2007/02/27 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
使用纯javascript实现经典扫雷游戏
2015/04/23 Javascript
JavaScript对Cookie进行读写操作实例
2015/07/25 Javascript
Ajax跨域实现代码(后台jsp)
2017/01/21 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
详解如何使用PM2将Node.js的集群变得更加容易
2017/11/15 Javascript
JS中的回调函数实例浅析
2018/03/21 Javascript
详解vue组件基础
2018/05/04 Javascript
WebPack配置vue多页面的技巧
2018/05/15 Javascript
layui 富文本图片上传接口与普通按钮 文件上传接口的例子
2019/09/23 Javascript
Python实现读取邮箱中的邮件功能示例【含文本及附件】
2017/08/05 Python
python函数的作用域及关键字详解
2019/08/20 Python
PyTorch中常用的激活函数的方法示例
2019/08/20 Python
在pycharm中配置Anaconda以及pip源配置详解
2019/09/09 Python
Python使用requests xpath 并开启多线程爬取西刺代理ip实例
2020/03/06 Python
如何使用Cython对python代码进行加密
2020/07/08 Python
Python jieba结巴分词原理及用法解析
2020/11/05 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
美国儿童玩具、装扮和玩偶商店:Magic Cabin
2018/09/02 全球购物
公司行政经理岗位职责
2013/12/24 职场文书
生日寿宴答谢词
2014/01/19 职场文书
电气自动化专业职业规划范文
2014/02/16 职场文书
小学班主任经验交流材料
2014/12/16 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
Java中常用解析工具jackson及fastjson的使用
2021/06/28 Java/Android
Python数据处理的三个实用技巧分享
2022/04/01 Python