站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

Vue應(yīng)用程序中實現(xiàn)AJAX的四個地方

Vue應(yīng)用程序中實現(xiàn)AJAX的四個地方

Vue沒有提供實現(xiàn)AJAX的正式方法,而且有許多不同的設(shè)計模式可以有效地使用。每種方法都有其優(yōu)缺點,應(yīng)該根據(jù)需求進行判斷。您甚至可以同時使用多個!

在本文中,我將向您展示在Vue應(yīng)用程序中實現(xiàn)AJAX的四個地方:

  • 根實例

  • 組件

  • Vuex行動

  • 路線導(dǎo)航警衛(wèi)

我將解釋每種方法,給出一個例子,并討論其優(yōu)缺點。

1、根實例

使用這種體系結(jié)構(gòu),您可以從根實例發(fā)出所有AJAX請求,并將所有狀態(tài)存儲在根實例中。如果任何子組件需要數(shù)據(jù),它將作為輔助。如果子組件需要刷新數(shù)據(jù),將使用自定義事件提示根實例請求它。

例子:

new Vue({   data: {     message: ''   },   methods: {     refreshMessage(resource) {       this.$http.get('/message').then((response) {         this.message = response.data.message;       });     }   } })  Vue.component('sub-component', {   template: '<div>{{ message }}</div>',   props: [ 'message' ]   methods: {     refreshMessage() {       this.$emit('refreshMessage');     }   } });

優(yōu)點:

  • 將所有AJAX邏輯和數(shù)據(jù)保存在一個地方。

  • 保持組件“dumb”,這樣它們就可以專注于表示。

缺點:

  • 隨著應(yīng)用程序的擴展,需要大量的道具和定制事件。

2、組件

使用這種體系結(jié)構(gòu),組件負責獨立地管理它們自己的AJAX請求和狀態(tài)。在實踐中,您可能希望創(chuàng)建幾個“容器”組件,這些組件為它們自己的本地“表示”組件組管理數(shù)據(jù)。

例如,filter-list可能是包裝filter-input和filter-reset的容器組件,它們充當表示組件。filter-list將包含AJAX邏輯,并將管理該組中所有組件的數(shù)據(jù),通過道具和事件進行通信。

為了使這個體系結(jié)構(gòu)的實現(xiàn)更容易,您可以將任何AJAX邏輯抽象到mixin中,然后使用組件中的mixin使其啟用AJAX。

let mixin = {   methods: {     callAJAX(resource) {       ...     }   } }  Vue.component('container-comp', {   // No meaningful template, I just manage data for my children   template: '<div><presentation-comp :mydata="mydata"></presentation-comp></div>',    mixins: [ myMixin ],   data() {     return { ... }   },  })  Vue.component('presentation-comp', {   template: <div>I just show stuff like {{ mydata }}</div>,   props: [ 'mydata' ] })

優(yōu)點:

  • 保持組件分離和可重用。

  • 獲取所需數(shù)據(jù)的時間和地點。

缺點:

  • 不容易與其他組件或組件組通信數(shù)據(jù)。

  • 組件可能會有太多的職責和重復(fù)的功能。

3、Vuex行動

使用這種體系結(jié)構(gòu),您可以在Vuex存儲中管理狀態(tài)邏輯和AJAX邏輯。組件可以通過分派操作請求新數(shù)據(jù)。

如果您實現(xiàn)了這種模式,那么最好在操作中返回一個promise,這樣您就可以對AJAX請求的解析做出響應(yīng),例如隱藏加載微調(diào)器、重新啟用按鈕等。

store = new Vuex.Store({   state: {     message: ''   },   mutations: {     updateMessage(state, payload) {       state.message = payload     }   },   actions: {     refreshMessage(context) {       return new Promise((resolve) => {         this.$http.get('...').then((response) => {           context.commit('updateMessage', response.data.message);           resolve();         });       });     }   } });  Vue.component('my-component', {   template: '<div>{{ message }}</div>',   methods: {     refreshMessage() {       this.$store.dispatch('refeshMessage').then(() => {         // do stuff       });     }   },   computed: {     message: { return this.$store.state.message; }   } });

我喜歡這種架構(gòu),因為它很好地解耦了狀態(tài)和表示邏輯。如果你正在使用Vuex,這是一個方法。如果你不使用Vuex,這可能是一個足夠好的理由。

優(yōu)點:

  • 根組件體系結(jié)構(gòu)的所有優(yōu)點,不需要道具和自定義事件。

缺點:

  • 增加了Vuex的開銷

4、路線導(dǎo)航警衛(wèi)

使用這種架構(gòu),您的應(yīng)用程序?qū)⒈环指顬槎鄠€頁面,當路由更改時,將獲取頁面及其子組件所需的所有數(shù)據(jù)。

這種方法的主要優(yōu)點是它確實簡化了UI。如果組件獨立地獲取它們自己的數(shù)據(jù),當組件數(shù)據(jù)以任意順序填充時,頁面將不可預(yù)測地重新呈現(xiàn)。

實現(xiàn)此功能的一個簡單方法是在服務(wù)器上為每個頁面創(chuàng)建端點,例如/about、/contact等,這些端點與應(yīng)用程序中的路由名匹配。然后,可以實現(xiàn)一個通用的beforeRouteEnter鉤子,將所有數(shù)據(jù)屬性合并到頁面組件的數(shù)據(jù)中:

import axios from 'axios';  router.beforeRouteEnter((to, from, next) => {   axios.get(`/api${to.path}`).then(({ data }) => {     next(vm => Object.assign(vm.$data, data))   }); })

優(yōu)點:

  • 使UI更加可預(yù)測。

缺點:

  • 整體上比較慢,因為頁面在所有數(shù)據(jù)都準備好之前無法呈現(xiàn)。

  • 如果您不使用路由,也沒有多大幫助。

附加模式:服務(wù)器—在頁面中呈現(xiàn)第一個AJAX調(diào)用

不建議在初始頁面加載時使用AJAX檢索應(yīng)用程序狀態(tài),因為它需要額外的到服務(wù)器的往返,這會延遲應(yīng)用程序的呈現(xiàn)。

相反,將初始應(yīng)用程序狀態(tài)注入HTML頁面頭部的內(nèi)聯(lián)腳本中,以便在需要時將其作為全局變量提供給應(yīng)用程序。

<html> ... <head>   ...   <script type="text/javascript">    window.__INITIAL_STATE__ = '{ "data": [ ... ] }';   </script> </head> <body>   <div id="app"></div> </body> </html>

然后,AJAX可以更恰當?shù)赜糜诤罄m(xù)數(shù)據(jù)獲取。

贊(0)
分享到: 更多 (0)
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品午夜一区二区福利| 996久久国产精品线观看| 久久国产精品99国产精| 精品久久久久久成人AV| 久久精品丝袜高跟鞋| 国产成人亚洲精品狼色在线 | 国产成人无码精品一区不卡| 色婷婷精品大在线视频| 日韩精品免费一级视频| 2021午夜国产精品福利| 久久夜色精品国产网站| 久久一区二区精品综合| 国产精品国色综合久久| 国内精品在线视频| 一本一本久久aa综合精品| 999精品视频这里只有精品| 中文字幕在线视频精品 | 国产精品久久久久影院嫩草| 91精品天美精东蜜桃传媒入口 | 国产精品久久久久久久| 亚洲精品国产av成拍色拍| 国产精品成人观看视频免费| 精品日产卡一卡二卡麻豆| 亚洲福利一区二区精品秒拍| 在线电影国产精品| 91精品视品在线播放| 亚洲国产成人精品电影| 亚洲精品美女久久久久9999| 亚洲精品偷拍无码不卡av| 亚洲av永久无码精品三区在线4| 亚洲精品电影天堂网| 久久久久精品国产亚洲AV无码| 亚洲国产精品成人精品小说 | 亚洲AV日韩AV永久无码色欲 | 亚洲AV永久无码精品一百度影院| 久久99精品国产99久久| 国产精品v片在线观看不卡| 精品久久久久久久| 久久国产免费观看精品| 久久精品九九热无码免贵| 久久久无码精品亚洲日韩按摩|