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

預(yù)填充Vue.js全局存儲(chǔ)狀態(tài)的三種方法

譯文
開(kāi)發(fā) 前端
有時(shí),您只需要在加載應(yīng)用程序之前預(yù)先填充Vue.js應(yīng)用程序存儲(chǔ)。本文介紹了3種不同的方法及其優(yōu)缺點(diǎn)。

【51CTO.com快譯】當(dāng)構(gòu)建Vue.js應(yīng)用程序并切程序達(dá)到一定的規(guī)模時(shí),可能會(huì)有全局狀態(tài)管理的需求。方便的是,核心開(kāi)發(fā)團(tuán)隊(duì)提供Vuex,它是 Vue.js 應(yīng)用程序?qū)嶋H的狀態(tài)管理庫(kù)。 

VUE入門(mén)并不是很難,假設(shè)你已經(jīng)熟悉實(shí)現(xiàn) Vuex。這篇文章畢竟不是關(guān)于新手的。如果您需要,那么我建議您查看文檔。

Vuex 的使用使得的管理全局?jǐn)?shù)據(jù)存儲(chǔ)變得更加簡(jiǎn)單,對(duì)于以下示例,假設(shè)有一個(gè)類(lèi)似以下內(nèi)容的存儲(chǔ):

  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. }) 

存儲(chǔ)區(qū)的狀態(tài)從一個(gè)空user對(duì)象開(kāi)始, setUser可以更新?tīng)顟B(tài)。然后在我們的應(yīng)用程序中,顯示用戶(hù)詳細(xì)信息:

  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> 

因此,當(dāng)應(yīng)用程序加載時(shí),如果用戶(hù)已登錄,它會(huì)向用戶(hù)顯示“Hi,用戶(hù)名,welcome back!”的消息。否則,提示用戶(hù)需要登錄,這是一個(gè)很小的例子。 

但是,問(wèn)題來(lái)了,假如有幾個(gè)選項(xiàng)的時(shí)候,又該如何解決呢?

設(shè)置初始狀態(tài)

預(yù)先填充全局存儲(chǔ)的最簡(jiǎn)單方法是在創(chuàng)建存儲(chǔ)時(shí)設(shè)置初始狀態(tài):

  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. }) 

顯然,這只有在您提前知道有關(guān)用戶(hù)的詳細(xì)信息時(shí)才可以。在構(gòu)建應(yīng)用程序時(shí),我們可能不知道用戶(hù)的姓名,但還有另一種選擇。 

我們可以利用本地存儲(chǔ)來(lái)保留用戶(hù)信息的副本。當(dāng)他們登錄時(shí),在 本地存儲(chǔ)中設(shè)置詳細(xì)信息,當(dāng)他們注銷(xiāo)時(shí),從本地存儲(chǔ)中刪除詳細(xì)信息即可。

當(dāng)應(yīng)用加載時(shí),您可以將用戶(hù)詳細(xì)信息從本地存儲(chǔ)初始狀態(tài)拉入初始狀態(tài):

  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. }) 

如果您使用的數(shù)據(jù)不需要非常嚴(yán)格的安全限制,那么這樣做是可以實(shí)現(xiàn)。我建議使用vuex-persistedstate庫(kù)來(lái)幫助實(shí)現(xiàn)自動(dòng)化。 

注意,永遠(yuǎn)不要將非常敏感的數(shù)據(jù)(如身份驗(yàn)證令牌)存儲(chǔ)在本地存儲(chǔ)中,因?yàn)樗赡軙?huì)受到XSS的 攻擊。因此,上述的例子適用于用戶(hù)名,但不適用于身份驗(yàn)證令牌之類(lèi)的東西(它仍然可以是 Vuex,只是不持久化)。

安裝應(yīng)用程序時(shí)請(qǐng)求數(shù)據(jù)

現(xiàn)在假設(shè),不將數(shù)據(jù)存儲(chǔ)在本地存儲(chǔ)中。我們的下一個(gè)操作可能是將初始狀態(tài)留空,并允許應(yīng)用程序掛載。安裝應(yīng)用程序后,我們可以向服務(wù)器發(fā)出一些 HTTP 請(qǐng)求以獲取數(shù)據(jù),然后更新全局狀態(tài):

  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> 

但是,現(xiàn)在有一個(gè)奇怪的用戶(hù)體驗(yàn)。應(yīng)用程序?qū)⒓虞d并發(fā)送請(qǐng)求,但當(dāng)用戶(hù)等待請(qǐng)求返回時(shí),會(huì)看到“您可能應(yīng)該登錄”。當(dāng)請(qǐng)求返回時(shí),假設(shè)有一個(gè)登錄的會(huì)話(huà),該消息會(huì)迅速更改為“嗨{{ user.name }},歡迎回來(lái)!”。這看起來(lái)會(huì)顯得奇怪。

為了解決這個(gè)問(wèn)題,我們只需在請(qǐng)求發(fā)出時(shí)顯示加載元素:

  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> 

記住,這是一個(gè)非常簡(jiǎn)單的示例。在您的應(yīng)用程序中,您可能有一個(gè)用于加載動(dòng)畫(huà)的專(zhuān)用組件,并且可能有一個(gè)<router-view>組件來(lái)代替此處的用戶(hù)消息。還可以選擇從 Vuex 操作發(fā)出該 HTTP 請(qǐng)求,這個(gè)概念仍然適用。

在加載應(yīng)用承載之前請(qǐng)求數(shù)據(jù)

最后一個(gè)示例是發(fā)出類(lèi)似于上一個(gè)的 HTTP 請(qǐng)求,但在應(yīng)用程序加載之前,等待請(qǐng)求返回并更新存儲(chǔ)。

Vuex 存儲(chǔ)只是一個(gè)具有一些屬性和方法的對(duì)象,可以將其視為任何其他 JavaScript 對(duì)象。 

將我們的存儲(chǔ)導(dǎo)入main.js文件(或任何應(yīng)用程序的入口點(diǎn))并在安裝應(yīng)用程序之前調(diào)用HTTP 請(qǐng)求:

  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.   }) 

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

有一個(gè)重要的警告。當(dāng) HTTP 請(qǐng)求掛起時(shí),不必?fù)?dān)心顯示加載微調(diào)器,與此同時(shí),應(yīng)用程序中沒(méi)有顯示任何內(nèi)容。如果應(yīng)用程序是單頁(yè)應(yīng)用程序,那么用戶(hù)可能會(huì)一直盯著空白頁(yè)面,直到請(qǐng)求返回。

因此,并沒(méi)有真正解決延遲問(wèn)題,只是在等待數(shù)據(jù)時(shí)決定顯示什么樣的 UI 體驗(yàn)。

結(jié)語(yǔ)

對(duì)于上述方法,并沒(méi)有說(shuō)哪種比較好。實(shí)際上,可以根據(jù)要獲取的數(shù)據(jù)以及應(yīng)用程序需要,使用這三種方法。  

還需要提到的是,fetch請(qǐng)求不是使用 Vuex 變體直接提交到存儲(chǔ)。您可以同樣使用 Vuex 操作來(lái)實(shí)現(xiàn)fetch請(qǐng)求. 也還可以將這些相同的原則應(yīng)用于任何其他狀態(tài)管理工具,例如 Vue.observable。

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請(qǐng)注明原文譯者和出處為51CTO.com】

 

責(zé)任編輯:梁菲 來(lái)源: DZone
相關(guān)推薦

2009-07-08 12:56:32

編寫(xiě)Servlet

2021-09-14 05:32:49

React 前端 組件

2010-09-14 15:10:49

CSS注釋

2009-12-11 18:49:39

預(yù)算編制博科資訊

2022-07-13 16:06:16

Python參數(shù)代碼

2011-04-18 15:32:45

游戲測(cè)試測(cè)試方法軟件測(cè)試

2024-11-15 07:00:00

Python發(fā)送郵件

2023-08-14 17:58:13

RequestHTTP請(qǐng)求

2022-01-04 16:50:47

JavaScript圖片網(wǎng)站

2011-06-10 10:43:12

Ubuntu應(yīng)用安裝

2009-06-23 10:45:18

Hibernate支持

2021-09-10 18:09:42

SQL注入漏洞網(wǎng)絡(luò)攻擊

2023-09-25 15:08:43

Python方離群值

2023-05-16 16:07:07

大數(shù)據(jù)數(shù)據(jù)管理工具

2021-07-13 12:31:27

IT組織改進(jìn)首席技術(shù)官

2021-12-20 07:11:26

Java List排序 Java 基礎(chǔ)

2021-10-09 06:59:36

技術(shù)MyBatis數(shù)據(jù)

2010-10-20 13:52:07

SQL Server數(shù)

2009-07-23 15:17:54

JDBC連接Acces

2016-09-09 13:07:56

CentOSJDKLinux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲激情在线观看 | 国产日韩欧美一区二区 | 精品一级 | 亚洲第一视频网站 | 美女视频h | 亚洲精品在线播放 | 久久精品屋 | 午夜av在线 | 亚洲视频在线观看 | 黄色网址av | 黄网站涩免费蜜桃网站 | 91视频日本 | 欧美激情综合 | 亚洲一区二区三区免费视频 | 韩日精品一区 | 狠狠躁18三区二区一区 | 亚洲一区久久久 | 男人天堂99 | 日韩视频一区二区 | 成人一级视频在线观看 | 色婷婷综合网站 | 中文字幕在线观看视频网站 | 91精品一区二区三区久久久久久 | 欧美成人精品一区二区男人看 | 羞羞视频网 | 精久久久久 | 91社区在线观看播放 | 黄色男女网站 | 91在线精品视频 | 日韩欧美手机在线 | 国产一区二区精品在线观看 | 亚洲乱码一区二区 | 国产成人免费视频网站视频社区 | 国内久久精品 | 综合另类| 国产区精品 | 久久国内精品 | 欧美精品一区免费 | 成人影院网站ww555久久精品 | 欧美日韩专区 | 久久综合成人精品亚洲另类欧美 |