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 相关文章推荐
IE event.srcElement和FF event.target 功能比较
Mar 01 Javascript
JavaScript中实现块作用域的方法
Apr 01 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
Oct 24 Javascript
jQuery实现的导航下拉菜单效果示例
Sep 05 Javascript
js实现的光标位置工具函数示例
Oct 03 Javascript
JavaScript中object和Object的区别(详解)
Feb 27 Javascript
微信小程序 商城开发(ecshop )简单实例
Apr 07 Javascript
vue.js整合vux中的上拉加载下拉刷新实例教程
Jan 09 Javascript
如何编写一个d.ts文件的步骤详解
Apr 13 Javascript
jQuery实现input[type=file]多图预览上传删除等功能
Aug 02 jQuery
js的新生代垃圾回收知识点总结
Aug 22 Javascript
浅谈vue的第一个commit分析
Jun 08 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实现文件安全下载
2006/10/09 PHP
php截取utf-8中文字符串乱码的解决方法
2010/03/29 PHP
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
使用symfony命令创建项目的方法
2016/03/17 PHP
javascript 通用loading动画效果实例代码
2014/01/14 Javascript
jQuery实现文本展开收缩特效
2015/06/03 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
jQuery实现打开页面渐现效果示例
2016/07/27 Javascript
jQuery ajaxForm()的应用
2016/10/14 Javascript
微信小程序 wxapp内容组件 text详细介绍
2016/10/31 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
2020/08/04 Javascript
Python def函数的定义、使用及参数传递实现代码
2014/08/10 Python
Python中django学习心得
2017/12/06 Python
运动检测ViBe算法python实现代码
2018/01/09 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
python实现俄罗斯方块游戏
2020/03/25 Python
Python中的 enum 模块源码详析
2019/01/09 Python
python f-string式格式化听语音流程讲解
2019/06/18 Python
django 自定义过滤器(filter)处理较为复杂的变量方法
2019/08/12 Python
在vscode中配置python环境过程解析
2019/09/28 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
2019/09/28 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
使用canvas来完成线性渐变和径向渐变的功能的方法示例
2019/07/25 HTML / CSS
canvas绘制树形结构可视图形的实现
2020/04/03 HTML / CSS
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
伦敦的高级牛仔布专家:Trilogy
2018/08/06 全球购物
MONNIER Frères英国官网:源自巴黎女士奢侈品配饰电商平台
2018/12/06 全球购物
客户代表实习人员自我鉴定
2013/09/27 职场文书
内科护士节演讲稿
2014/09/11 职场文书
离婚协议书格式
2015/01/26 职场文书
2015年党小组工作总结
2015/05/26 职场文书
Python 多线程处理任务实例
2021/11/07 Python
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏