成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

預填充Vue.js全局存儲狀態的三種方法

譯文
開發 前端
有時,您只需要在加載應用程序之前預先填充Vue.js應用程序存儲。本文介紹了3種不同的方法及其優缺點。

【51CTO.com快譯】當構建Vue.js應用程序并切程序達到一定的規模時,可能會有全局狀態管理的需求。方便的是,核心開發團隊提供Vuex,它是 Vue.js 應用程序實際的狀態管理庫。 

VUE入門并不是很難,假設你已經熟悉實現 Vuex。這篇文章畢竟不是關于新手的。如果您需要,那么我建議您查看文檔。

Vuex 的使用使得的管理全局數據存儲變得更加簡單,對于以下示例,假設有一個類似以下內容的存儲:

  1. import Vue from 'vue' 
  2. import Vuex from 'vuex' 
  3. Vue.use(Vuex) 
  4. const store = new Vuex.Store({ 
  5.   state: { 
  6.     user: null 
  7.   }, 
  8.   mutations: { 
  9.     setUser (state, user) { 
  10.       state.user = user 
  11.     } 
  12.   }, 
  13. }) 

存儲區的狀態從一個空user對象開始, setUser可以更新狀態。然后在我們的應用程序中,顯示用戶詳細信息:

  1. <template> 
  2.   <div> 
  3.     <p v-if="user">Hi {{ user.name }}, welcome back!</p> 
  4.     <p v-else>You should probably log in.</p> 
  5.   </div> 
  6. </template> 
  7.  
  8. <script> 
  9. export default { 
  10.   computed { 
  11.     user() { 
  12.       return this.$store.state.user 
  13.     } 
  14.   } 
  15. </script> 

因此,當應用程序加載時,如果用戶已登錄,它會向用戶顯示“Hi,用戶名,welcome back!”的消息。否則,提示用戶需要登錄,這是一個很小的例子。 

但是,問題來了,假如有幾個選項的時候,又該如何解決呢?

設置初始狀態

預先填充全局存儲的最簡單方法是在創建存儲時設置初始狀態:

  1. import Vue from 'vue' 
  2. import Vuex from 'vuex' 
  3.  
  4. Vue.use(Vuex) 
  5.  
  6. const store = new Vuex.Store({ 
  7.   state: { 
  8.     user: { name: "Austin" } 
  9.   }, 
  10.   mutations: { 
  11.     setUser (user) { 
  12.       state.user = user 
  13.     } 
  14.   } 
  15. }) 

顯然,這只有在您提前知道有關用戶的詳細信息時才可以。在構建應用程序時,我們可能不知道用戶的姓名,但還有另一種選擇。 

我們可以利用本地存儲來保留用戶信息的副本。當他們登錄時,在 本地存儲中設置詳細信息,當他們注銷時,從本地存儲中刪除詳細信息即可。

當應用加載時,您可以將用戶詳細信息從本地存儲初始狀態拉入初始狀態:

  1. import Vue from 'vue' 
  2. import Vuex from 'vuex' 
  3.  
  4. Vue.use(Vuex) 
  5.  
  6. const store = new Vuex.Store({ 
  7.   state: { 
  8.     user: localStorage.get('user'
  9.   }, 
  10.   mutations: { 
  11.     setUser (user) { 
  12.       state.user = user 
  13.     } 
  14.   } 
  15. }) 

如果您使用的數據不需要非常嚴格的安全限制,那么這樣做是可以實現。我建議使用vuex-persistedstate庫來幫助實現自動化。 

注意,永遠不要將非常敏感的數據(如身份驗證令牌)存儲在本地存儲中,因為它可能會受到XSS的 攻擊。因此,上述的例子適用于用戶名,但不適用于身份驗證令牌之類的東西(它仍然可以是 Vuex,只是不持久化)。

安裝應用程序時請求數據

現在假設,不將數據存儲在本地存儲中。我們的下一個操作可能是將初始狀態留空,并允許應用程序掛載。安裝應用程序后,我們可以向服務器發出一些 HTTP 請求以獲取數據,然后更新全局狀態:

  1. <template> 
  2.   <div> 
  3.     <p v-if="user">Hi {{ user.name }}, welcome back!</p> 
  4.     <p v-else>You should probably log in.</p> 
  5.   </div> 
  6. </template> 
  7. <script> 
  8. export default { 
  9.   computed { 
  10.     user() { 
  11.       return this.$store.state.user 
  12.     } 
  13.   }, 
  14.   async mounted() { 
  15.     const user = await getUser() // Assume getUser returns a user object with a name property 
  16.     this.$store.commit('setUser', user) 
  17.   } 
  18. </script> 

但是,現在有一個奇怪的用戶體驗。應用程序將加載并發送請求,但當用戶等待請求返回時,會看到“您可能應該登錄”。當請求返回時,假設有一個登錄的會話,該消息會迅速更改為“嗨{{ user.name }},歡迎回來!”。這看起來會顯得奇怪。

為了解決這個問題,我們只需在請求發出時顯示加載元素:

  1. <template> 
  2.   <div> 
  3.     <p v-if="loading">Loading...</p> 
  4.     <p v-else-if="user">Hi {{ user.name }}, welcome back!</p> 
  5.     <p v-else>You should probably log in.</p> 
  6.   </div> 
  7. </template> 
  8.  
  9. <script> 
  10. export default { 
  11.   data: () => ({ 
  12.     loading: false 
  13.   }), 
  14.   computed { 
  15.     user() { 
  16.       return this.$store.state.user 
  17.     } 
  18.   }, 
  19.   async mounted() { 
  20.     this.loading = true 
  21.     const user = await fetch('/user').then(r => r.json()) // Assume getUser returns a user object with a name property 
  22.     this.$store.commit('setUser', user) 
  23.     this.loading = false 
  24.   } 
  25. </script> 

記住,這是一個非常簡單的示例。在您的應用程序中,您可能有一個用于加載動畫的專用組件,并且可能有一個<router-view>組件來代替此處的用戶消息。還可以選擇從 Vuex 操作發出該 HTTP 請求,這個概念仍然適用。

在加載應用承載之前請求數據

最后一個示例是發出類似于上一個的 HTTP 請求,但在應用程序加載之前,等待請求返回并更新存儲。

Vuex 存儲只是一個具有一些屬性和方法的對象,可以將其視為任何其他 JavaScript 對象。 

將我們的存儲導入main.js文件(或任何應用程序的入口點)并在安裝應用程序之前調用HTTP 請求:

  1. import Vue from "vue" 
  2. import store from "./store" 
  3. import App from "./App.vue" 
  4. fetch('/user'
  5.   .then(r => r.json()) 
  6.   .then((user) => { 
  7.     store.commit('setUser', user) 
  8.     new Vue({ 
  9.       store, 
  10.       render: (h) => h(App), 
  11.     }).$mount("#app"
  12.   }) 
  13.   .catch((error) => { 
  14.     // Don't forget to handle this 
  15.   }) 

在應用程序加載之前,將需要從 API 獲取的任何數據預加載到全局存儲中。這種方法可以避免前面提到的janky跳躍或管理某些加載邏輯的問題。
然而,

有一個重要的警告。當 HTTP 請求掛起時,不必擔心顯示加載微調器,與此同時,應用程序中沒有顯示任何內容。如果應用程序是單頁應用程序,那么用戶可能會一直盯著空白頁面,直到請求返回。

因此,并沒有真正解決延遲問題,只是在等待數據時決定顯示什么樣的 UI 體驗。

結語

對于上述方法,并沒有說哪種比較好。實際上,可以根據要獲取的數據以及應用程序需要,使用這三種方法。  

還需要提到的是,fetch請求不是使用 Vuex 變體直接提交到存儲。您可以同樣使用 Vuex 操作來實現fetch請求. 也還可以將這些相同的原則應用于任何其他狀態管理工具,例如 Vue.observable。

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

 

責任編輯:梁菲 來源: DZone
相關推薦

2009-07-08 12:56:32

編寫Servlet

2021-09-14 05:32:49

React 前端 組件

2022-01-04 16:50:47

JavaScript圖片網站

2010-09-14 15:10:49

CSS注釋

2022-07-13 16:06:16

Python參數代碼

2009-12-11 18:49:39

預算編制博科資訊

2024-11-15 07:00:00

Python發送郵件

2011-04-18 15:32:45

游戲測試測試方法軟件測試

2023-08-14 17:58:13

RequestHTTP請求

2011-06-10 10:43:12

Ubuntu應用安裝

2009-06-23 10:45:18

Hibernate支持

2021-07-13 12:31:27

IT組織改進首席技術官

2023-05-16 16:07:07

大數據數據管理工具

2009-07-23 15:17:54

JDBC連接Acces

2016-09-09 13:07:56

CentOSJDKLinux

2023-09-25 15:08:43

Python方離群值

2021-09-10 18:09:42

SQL注入漏洞網絡攻擊

2021-10-09 06:59:36

技術MyBatis數據

2010-10-20 13:52:07

SQL Server數

2021-12-20 07:11:26

Java List排序 Java 基礎
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人性视频免费网站 | 午夜精品导航 | 欧美日韩久久精品 | 97人澡人人添人人爽欧美 | 91视频在线观看 | 日韩无| 久久合久久 | 一区二区在线 | 久久99精品国产麻豆婷婷 | 国产成人啪免费观看软件 | 欧美一区二区三区四区在线 | 精品一区av | 国产精品免费看 | 精品国产乱码久久久久久88av | 精品国产乱码久久久久久丨区2区 | 久草久草久草 | 中文字幕一区二区三区四区五区 | 嫩草黄色影院 | 久久久久国产精品一区二区 | 91精品久久久 | 亚洲欧美视频 | 亚洲色图综合 | 精品欧美激情精品一区 | 亚洲在线成人 | 中文字幕四虎 | www.日本国产 | 一区二区视频在线观看 | 99久久国产综合精品麻豆 | 自拍偷拍精品 | 国产成人aⅴ | 国产欧美精品区一区二区三区 | 欧美性久久 | 亚洲国产精品日本 | 中文一区二区 | 日韩视频一区二区在线 | 国产精品久久久久久久久久免费看 | 黄网站涩免费蜜桃网站 | 日韩精品一区二区三区视频播放 | av黄色在线 | 中国大陆高清aⅴ毛片 | 麻豆91av |