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 相关文章推荐
利用JQuery的load函数动态加载其它页面的内容的实现代码
Dec 14 Javascript
基于jquery的无缝循环新闻列表插件
Mar 07 Javascript
jsPDF生成pdf后在网页展示实例
Jan 16 Javascript
Javascript中的Callback方法浅析
Mar 15 Javascript
js表单元素checked、radio被选中的几种方法(详解)
Aug 22 Javascript
点击页面任何位置隐藏div的实现方法
Sep 05 Javascript
BootStrap Table前台和后台分页对JSON格式的要求
Jun 28 Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 Javascript
Vue.js 中 axios 跨域访问错误问题及解决方法
Nov 21 Javascript
小程序封装路由文件和路由方法(5种全解析)
May 26 Javascript
关于引入vue.js 文件的知识点总结
Jan 28 Javascript
Js实现复选框的全选、全不选反选功能代码实例
Feb 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
在IIS上安装PHP4.0正式版
2006/10/09 PHP
php获取网页内容方法总结
2008/12/04 PHP
PHP实现下载功能的代码
2012/09/29 PHP
php 验证码(倾斜,正弦干扰线,黏贴,旋转)
2013/06/29 PHP
php进行md5加密简单实例方法
2019/09/19 PHP
js左侧多级菜单动态的解决方案
2010/02/01 Javascript
基于javascipt-dom编程 table对象的使用
2013/04/22 Javascript
jquery和雅虎的yql服务实现天气预报服务示例
2014/02/08 Javascript
浅谈javascript回调函数
2014/12/07 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
深入探寻seajs的模块化与加载方式
2015/04/14 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
javascript用正则表达式过滤空格的实现代码
2016/06/14 Javascript
BootStrap自定义popover,点击区域隐藏功能的实现
2018/01/23 Javascript
ES6 更易于继承的类语法的使用
2019/02/11 Javascript
微信小程序入口场景的问题集合与相关解决方法
2019/06/26 Javascript
python两种遍历字典(dict)的方法比较
2014/05/29 Python
Python实现的KMeans聚类算法实例分析
2018/12/29 Python
详解小白之KMP算法及python实现
2019/04/04 Python
PyQt5组件读取参数的实例
2019/06/25 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
加拿大最大的书店:Indigo
2017/01/01 全球购物
美国著名的女性内衣零售商:Frederick’s of Hollywood
2018/02/24 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
Farah官方网站:男士服装及配件
2019/11/01 全球购物
销售人员自我评价怎么写
2013/09/19 职场文书
优秀学生事迹材料
2014/02/08 职场文书
预备党员表决心书
2014/03/11 职场文书
决心书范文
2014/03/11 职场文书
实习报告评语
2014/04/26 职场文书
课外小组活动总结
2014/08/27 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android