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验证表单大全
Nov 25 Javascript
js动画效果制件让图片组成动画代码分享
Jan 14 Javascript
使用RequireJS库加载JavaScript模块的实例教程
Jun 06 Javascript
基于JavaScript实现图片连播和联级菜单实例代码
Jul 28 Javascript
详解利用 Vue.js 实现前后端分离的RBAC角色权限管理
Sep 15 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
微信小程序分享海报生成的实现方法
Dec 10 Javascript
微信小程序实现的动态设置导航栏标题功能示例
Jan 31 Javascript
利用Promise自定义一个GET请求的函数示例代码
Mar 20 Javascript
微信小程序页面传多个参数跳转页面的实现方法
May 17 Javascript
JS中的算法与数据结构之队列(Queue)实例详解
Aug 20 Javascript
JS使用for in有序获取对象数据
May 19 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
深入了解php4(1)--回到未来
2006/10/09 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
2014/04/21 PHP
php中in_array函数用法探究
2014/11/25 PHP
Yii框架在页面输出执行sql语句以方便调试的实现方法
2014/12/24 PHP
php链表用法实例分析
2015/07/09 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
thinkPHP5.0框架开发规范简介
2017/03/25 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
jquery解决客户端跨域访问问题
2015/01/06 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
Node.js实现数据推送
2016/04/14 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
jQuery中常用动画效果函数(日常整理)
2016/09/17 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
解决antd Form 表单校验方法无响应的问题
2020/10/27 Javascript
[01:24:16]2018DOTA2亚洲邀请赛 4.6 全明星赛
2018/04/10 DOTA
python2.7的编码问题与解决方法
2016/10/04 Python
python实现读取并显示图片的两种方法
2017/01/13 Python
用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例
2017/12/14 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
python实现微信自动回复机器人功能
2019/07/11 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
Sunglasses Shop丹麦:欧洲第一的太阳镜在线销售网站
2017/10/22 全球购物
英国Flybe航空官网:欧洲最大的独立支线廉价航空公司
2019/07/15 全球购物
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
用Python写一个for循环的例子
2016/07/19 面试题
法院实习人员自我鉴定
2013/09/26 职场文书
办公室内勤岗位职责范本
2013/12/09 职场文书
会计与出纳自荐书范文
2014/03/16 职场文书
大型公益活动策划方案
2014/08/20 职场文书
小学教师党员承诺书
2015/04/27 职场文书
公司车队管理制度
2015/08/04 职场文书
Java字符串逆序方法详情
2022/03/21 Java/Android