最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue之封裝多個組件調(diào)用同一接口的案例

 更新時間:2020年08月11日 14:50:50   作者:_freely  
這篇文章主要介紹了vue之封裝多個組件調(diào)用同一接口的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

背景:項目中有多個組件調(diào)用同一接口,為提高代碼可維護性,需要封裝公共方法

直接return 接口調(diào)用的結(jié)果

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基礎 進行封裝的,是一個異步的方法,所以在組件中調(diào)用getAll()方法,拿到的是一個空數(shù)組

使用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);
  });
 }
 // 調(diào)用
 getAll()
  .then(data => {
  console.log(data); // 
  })
  .catch(err => {
  this.tipInfo(err.data.desc, '提示', false, 'warning');
  });

使用promise進行封裝后,方法,不夠簡潔,達不到優(yōu)化的目的

使用回調(diào)函數(shù)進行封裝

  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);
 }
  // 調(diào)用
  getAllPark(data => {
   console.log(data); // 成功拿到數(shù)據(jù)
  });

補充知識:vue多個頁面用到同一個接口的數(shù)據(jù)( 比如名稱列表 ),使用 vuex

第一種: 調(diào)接口不傳參數(shù)

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 分發(fā),這樣就不管在哪個頁面需要使用到都可以使用

比如打開頁面首頁的時候,在mounted里面就 dispatch 觸發(fā)geName函數(shù)

<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>

第二種: 調(diào)接口傳參數(shù)

import movieService from '../services/movieService.js'

export default {
  namespaced: true,
  state: {
    current: 1,
    pageSize: 2,
    total: 0,
    datas: [],
    isLoading: false
  },
  mutations: { //改變狀態(tài)的通用方法  設置整個狀態(tài)
    setState(state, newState) {
      for (const prop in newState) {
        state[prop] = newState[prop]
      }
    }
  },
  actions: {
    fetch(context) { // 根據(jù)當前的分頁設置,獲取電影
      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) //返回分頁的電影數(shù)據(jù)
    }
  },
  //通過id獲取電影數(shù)據(jù)
  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() { //遠程獲取數(shù)據(jù)
    this.$store.dispatch("movie/fetch") //出發(fā)vuex中movie.js里的action,獲取數(shù)據(jù)
 },

以上這篇vue之封裝多個組件調(diào)用同一接口的案例就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 輕松學Vue組件之單文件組件

    輕松學Vue組件之單文件組件

    一個組件相當于是一個小模塊,它是html、css與js的集合體,可以用于描述頁面中的某個結(jié)構(gòu)(模塊),下面這篇文章主要給大家介紹了關(guān)于輕松學Vue組件之單文件組件的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • 深入理解Vue-cli搭建項目后的目錄結(jié)構(gòu)探秘

    深入理解Vue-cli搭建項目后的目錄結(jié)構(gòu)探秘

    本篇文章主要介紹了深入理解Vue-cli搭建項目后的目錄結(jié)構(gòu)探秘,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • vue3動態(tài)監(jiān)聽瀏覽器窗口變化實例

    vue3動態(tài)監(jiān)聽瀏覽器窗口變化實例

    這篇文章主要給大家介紹了關(guān)于vue3動態(tài)監(jiān)聽瀏覽器窗口變化的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家學習或者使用vue3具有一定的參考學習價值,需要的朋友可以參考下
    2023-07-07
  • vue 解決循環(huán)引用組件報錯的問題

    vue 解決循環(huán)引用組件報錯的問題

    今天小編就為大家分享一篇vue 解決循環(huán)引用組件報錯的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-09-09
  • element?Drawer?抽屜無法渲染問題及解決

    element?Drawer?抽屜無法渲染問題及解決

    這篇文章主要介紹了element?Drawer?抽屜無法渲染問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • vue-cli3.0 腳手架搭建項目的過程詳解

    vue-cli3.0 腳手架搭建項目的過程詳解

    這篇文章主要介紹了vue-cli3.0 腳手架搭建項目的過程,本文分步驟給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-10-10
  • vue實現(xiàn)頁面刷新動畫

    vue實現(xiàn)頁面刷新動畫

    這篇文章主要為大家詳細介紹了vue實現(xiàn)頁面刷新動畫,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue實現(xiàn)動態(tài)顯示與隱藏底部導航的方法分析

    vue實現(xiàn)動態(tài)顯示與隱藏底部導航的方法分析

    這篇文章主要介紹了vue實現(xiàn)動態(tài)顯示與隱藏底部導航的方法,結(jié)合實例形式分析了vue.js針對導航隱藏與顯示的路由配置、事件監(jiān)聽等相關(guān)操作技巧,需要的朋友可以參考下
    2019-02-02
  • vue實現(xiàn)移動端的開關(guān)按鈕

    vue實現(xiàn)移動端的開關(guān)按鈕

    這篇文章主要為大家詳細介紹了vue實現(xiàn)移動端的開關(guān)按鈕,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • vue表格顯示字符串過長的問題及解決

    vue表格顯示字符串過長的問題及解決

    這篇文章主要介紹了vue表格顯示字符串過長的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-10-10

最新評論

嘉黎县| 桃江县| 江北区| 芜湖市| 桃园市| 黑山县| 吴桥县| 鄂伦春自治旗| 长治县| 巴彦县| 芜湖市| 兰西县| 广灵县| 报价| 青海省| 陵川县| 黄龙县| 武冈市| 勃利县| 花莲市| 会泽县| 湖北省| 屏东县| 田阳县| 抚顺县| 任丘市| 安乡县| 宝清县| 镇康县| 荥经县| 龙岩市| 青铜峡市| 临武县| 汝阳县| 库伦旗| 陆河县| 汝州市| 商南县| 宿迁市| 禄丰县| 南靖县|