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中的数组Array定义与sort方法使用示例
Aug 29 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
Sep 05 Javascript
javascript包装对象实例分析
Mar 27 Javascript
实现隔行换色效果的两种方式【实用】
Nov 27 Javascript
基于pako.js实现gzip的压缩和解压功能示例
Jun 13 Javascript
微信小程序实现点击按钮移动view标签的位置功能示例【附demo源码下载】
Dec 06 Javascript
angular json对象push到数组中的方法
Feb 27 Javascript
vue translate peoject实现在线翻译功能【新手必看】
Jun 07 Javascript
vue-quill-editor富文本编辑器简单使用方法
Sep 21 Javascript
layui form.render('select', 'test2') 更新渲染的方法
Sep 27 Javascript
vue获取data数据改变前后的值方法
Nov 07 Javascript
vue实现图片上传预览功能
Dec 23 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读取和保存base64编码的图片内容
2017/04/22 PHP
php设计模式之工厂模式用法经典实例分析
2019/09/20 PHP
iframe 异步加载技术及性能分析
2011/07/19 Javascript
取消选中单选框radio的三种方式示例介绍
2013/12/23 Javascript
jquery中load方法的用法及注意事项说明
2014/02/22 Javascript
javascript屏蔽右键代码
2014/05/15 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
javascript结合canvas实现图片旋转效果
2015/05/03 Javascript
javascript中Date()函数在各浏览器中的显示效果
2015/06/18 Javascript
JavaScript使用RegExp进行正则匹配的方法
2015/07/11 Javascript
jquery获取url参数及url加参数的方法
2015/10/26 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
JavaScript中获取纯正的undefined的方法
2016/03/06 Javascript
JavaScript中的Number数字类型学习笔记
2016/05/26 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
layui从数据库中获取复选框的值并默认选中方法
2018/08/15 Javascript
angularjs http与后台交互的实现示例
2018/12/21 Javascript
浅谈express.js框架中间件(middleware)
2019/04/07 Javascript
node.js ws模块搭建websocket服务端的方法示例
2019/04/25 Javascript
vue 对axios get pust put delete封装的实例代码
2020/01/05 Javascript
[02:45]2016年中国刀塔全程回顾,完美“圣”典即将上演
2016/12/15 DOTA
Python简单实现控制电脑的方法
2018/01/22 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
python游戏开发的五个案例分享
2020/03/09 Python
Python pip安装第三方库实现过程解析
2020/07/09 Python
Python实现给PDF添加水印的方法
2021/01/25 Python
薇诺娜官方网上商城:专注敏感肌肤
2017/05/25 全球购物
教师远程培训感言
2014/03/06 职场文书
中等生评语大全
2014/05/04 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js
图文详解matlab原始处理图像几何变换
2021/07/09 Python
Python中的pprint模块
2021/11/27 Python
Python 居然可以在 Excel 中画画你知道吗
2022/02/15 Python
详解Spring Security中的HttpBasic登录验证模式
2022/03/17 Java/Android