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

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

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

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

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

使用promise進(jìn)行封裝

   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進(jìn)行封裝后,方法,不夠簡(jiǎn)潔,達(dá)不到優(yōu)化的目的

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

  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ù)
  });

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

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

1、在 store文件夾下的 modules文件夾下新建 getName.js

// getName.js
import { getNameList } from "@/apis/apis";  // 導(dǎo)入接口

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、在整個(gè)項(xiàng)目剛開始加載的時(shí)候就是用 dispatch 分發(fā),這樣就不管在哪個(gè)頁(yè)面需要使用到都可以使用

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

<script>
export default {
 mounted() {
  this.$store.dispatch('geName')
 },
}

4、如在多個(gè)頁(yè)面都需要使用 nameList , 以在某一個(gè)頁(yè)面使用為例,其余頁(yè)面一樣用法

<template>
 <div>
   <el-select v-model="form.name" placeholder="請(qǐng)選擇名稱" 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)的通用方法  設(shè)置整個(gè)狀態(tài)
    setState(state, newState) {
      for (const prop in newState) {
        state[prop] = newState[prop]
      }
    }
  },
  actions: {
    fetch(context) { // 根據(jù)當(dāng)前的分頁(yè)設(shè)置,獲取電影
      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) //返回分頁(yè)的電影數(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)
  }
}

在頁(yè)面使用:

 mounted() { //遠(yuǎn)程獲取數(shù)據(jù)
    this.$store.dispatch("movie/fetch") //出發(fā)vuex中movie.js里的action,獲取數(shù)據(jù)
 },

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

相關(guān)文章

  • 輕松學(xué)Vue組件之單文件組件

    輕松學(xué)Vue組件之單文件組件

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

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

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

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

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

    vue 解決循環(huán)引用組件報(bào)錯(cuò)的問題

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

    element?Drawer?抽屜無(wú)法渲染問題及解決

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

    vue-cli3.0 腳手架搭建項(xiàng)目的過程詳解

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

    vue實(shí)現(xiàn)頁(yè)面刷新動(dòng)畫

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

    vue實(shí)現(xiàn)動(dòng)態(tài)顯示與隱藏底部導(dǎo)航的方法分析

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

    vue實(shí)現(xiàn)移動(dòng)端的開關(guān)按鈕

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

    vue表格顯示字符串過長(zhǎng)的問題及解決

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

最新評(píng)論

夏津县| 阿克苏市| 广东省| 漾濞| 太和县| 丰城市| 宜君县| 铜梁县| 宜兴市| 阿图什市| 麦盖提县| 江安县| 牙克石市| 岳普湖县| 衡东县| 西乌| 玉林市| 河西区| 汕尾市| 大连市| 北流市| 海口市| 金阳县| 体育| 泗洪县| 微山县| 河南省| 衡南县| 南安市| 仙游县| 丰县| 繁峙县| 沙湾县| 兴仁县| 威远县| 越西县| 资源县| 响水县| 特克斯县| 玉屏| 阳泉市|