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 相关文章推荐
js获取单元格自定义属性值的代码(IE/Firefox)
Apr 05 Javascript
jQuery实用函数用法总结
Aug 29 Javascript
详谈JavaScript 匿名函数及闭包
Nov 14 Javascript
JS实现网页滚动条感应鼠标变色的方法
Feb 26 Javascript
js实现网页抽奖实例
Aug 05 Javascript
使用jQuery判断Div是否在可视区域的方法 判断div是否可见
Feb 17 Javascript
javascript cookie用法基础教程(概念,设置,读取及删除)
Sep 20 Javascript
JS返回只包含数字类型的数组实例分析
Dec 16 Javascript
微信小程序数据存储与取值详解
Jan 30 Javascript
简单的vuex 的使用案例笔记
Apr 13 Javascript
React传值 组件传值 之间的关系详解
Aug 26 Javascript
jQuery实现飞机大战小游戏
Jul 05 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 将excel导入mysql
2009/11/09 PHP
php trim 去除空字符的定义与语法介绍
2010/05/31 PHP
Javascript中的常见排序算法
2007/03/27 Javascript
ext监听事件方法[初级篇]
2008/04/27 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
jQuery中parents()和parent()的区别分析
2014/10/28 Javascript
BootstrapTable refresh 方法使用实例简单介绍
2017/02/20 Javascript
Three.js获取鼠标点击的三维坐标示例代码
2017/03/24 Javascript
TypeScript入门-基本数据类型
2017/03/28 Javascript
react native带索引的城市列表组件的实例代码
2017/08/08 Javascript
Webpack devServer中的 proxy 实现跨域的解决
2018/06/15 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
转换layUI的数据表格中的日期格式方法
2019/09/19 Javascript
Node.js path模块,获取文件后缀名操作
2020/11/07 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
Python标准库之Sys模块使用详解
2015/05/23 Python
Python制作简单的网页爬虫
2015/11/22 Python
python 自动去除空行的实例
2018/07/24 Python
浅谈TensorFlow之稀疏张量表示
2020/06/30 Python
全面解析CSS Media媒体查询使用操作(推荐)
2017/08/15 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
美国折扣地毯销售网站:Rugs.com
2020/03/27 全球购物
介绍一下except的用法和作用
2015/01/22 面试题
精细化工应届生求职信
2013/11/17 职场文书
大一新生军训时的自我评价分享
2013/12/05 职场文书
接受捐赠答谢词
2014/01/27 职场文书
课外科技活动总结
2014/08/27 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2014年仓库保管员工作总结
2014/12/03 职场文书
2015年清明节网上祭英烈活动总结
2015/03/26 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
Python一些基本的图像操作和处理总结
2021/06/23 Python
详解MySql中InnoDB存储引擎中的各种锁
2022/02/12 MySQL