激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - js教程 - 微信小程序全局狀態的深入講解

微信小程序全局狀態的深入講解

2022-02-17 19:31明月依舊 js教程

這篇文章主要介紹了微信小程序全局狀態的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

在微信小程序中,可以利用 App.js 的 globalData 作為中間橋梁,在 Page, Component 之間,包括頁面與頁面,頁面與組件,組件與組件之間傳遞需要傳遞的信息。但是,我們不能及時的知道 globalData 下的變化,在新建小程序的官方的默認事例中,獲取 UserInfo 這一網絡操作有延遲的,為此寫了很多不必要的代碼。就連官方案例都存在這一情況,相信在開發中你也會遇到類似的情況。在本文中將介紹如何解決這一類問題。

需求分析

相信以下情況是我們在沒有全局狀態管理下常有的操作:

  • 在 Page,Component 的 OnLoad,Attached 兩個生命周期鉤子函數中,進行一些從 App 的 globalData 賦值一些已經存在的屬性到頁面或組件中的 data 中。
  • 在最開始就存在一些異步的網絡請求,獲取的數據用于全局,剛開始可能這個 globalData 還沒有相關屬性,直到請求成功,才把相關屬性添加到 globalData,而這時 Page 的從 globalData 的賦值操作可能已經完成了,只不過是 undefined,為此需要進一步的判斷再進行賦值到 Page,Component 中。如果只是一兩個這個還說很簡單的,但是多個頁面,或者多個變量都需要賦值的話,我想你會拒絕并尋找偷懶的辦法。
  • 一些在頁面和組件從 globalData 賦值的變量不僅是用于判斷、展示,我們可能還需要依據用戶交互而改變變量的值,那么在其他頁面,其他組件中同樣的變量也需要統一改變。

以上情況我們可提出以下幾點需求:

  1. 在頁面,組件初始加載時,盡早的從 globalData 獲取并賦值到頁面,組件所需要的一些屬性
  2. 及時的獲取一些 globalData 某一屬性的變化,并進行一些后續相關操作
  3. 在改變 Page,Component 的值的同時,其他頁面,組件也進行一樣的改變

下面是需求的原始代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// app.js
App({
 globalData: {
  userInfo: null
 },
 onLaunch(){
  wx.getSetting({
   success: res => {
    if(res.authSetting['scope.userInfo']){
     wx.getUserInfo({
      success: res => {
       this.globalData.userInfo = res.userInfo
       // 需求2
       if (this.userInfoReadyCallback) {
        // 存在此回調函數,意味著 page 執行了 onLoad
        // 且沒有獲取到 userInfo 并賦值到 page 的 data 中
        // 執行此回調函數,賦值到相應的頁面中
        this.userInfoReadyCallback(res)
       }
      }
     })
    }
   }
  })
 }
})
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// Pages/index/index.js
const app = getApp()
Page({
 // ...
 onLoad(options){
  // 需求1
  const userInfo = app.globalData.userInfo
  userInfo && this.setData({useInfo})
  // 需求2
  // 如果沒有獲取到 app.globalData.userInfo
  // 意味還未執行 wx.getUserInfo 的回調函數
  // 給 app 添加響應的一個回調函數,綁定此時的 this 到回調函數
  userInfo || app.userInfoReadyCallback = res => {
   this.setData({
    userInfo: res.userInfo
   })
   delete app.userInfoReadyCallback
  }
 }
})

微信小程序全局狀態的深入講解

這是官方小程序案例的代碼,我只做了一點修改,這里只是展示了需求 2 ,globalData 屬性從無到有時執行頁面設置的回調函數,并沒有實現每一次都會執行回調函數,需求 3 的代碼比較復雜,不在此展示。

我們可以思考,以上幾點需求需要實現的,一定要有的代碼有哪些。可以發現,需求 1 和需求 3 主要就是頁面,組件初始化,和 globalData 屬性被改變時都需要使用 this.setData 方法,只不過每次 this 的指向的實例不同。而需求 2 則是應該存在一個回調函數,且回調函數的 this 也應該指向相應的實例,在 globalData 屬性被改變時執行這些回調函數。
從時間點來看,我們有兩個,一個是頁面,組件初始化,一個是 globalData 屬性改變時,那么第一個時間點,我們可以考慮到小程序的生命周期的鉤子函數,onLoad 和 attached,在這兩個時間點執行 this.setData 的操作。而 globalData 屬性的改變都是我們主動或者用戶事件而產生的,就是可以看作這一操作是一個對 globalData 某個屬性的事件,而這個事件發生后再去執行一些寫好的回調函數。

從操作對象來看,基本都是頁面和組件的實例 this,以及 app.globalData。

需求理論性總結

綜上,我們可以在初始化時,進行自動的 this.setData(不用自己手動),和保存 this(用于事件執行時指向相應的實例),存儲相應的回調函數為事件(事件就是未執行的函數),在需要時主動觸發這個事件即可。那么可以看到,整個流程下來,我們需要一個橫跨 app,page,component 之間的一個變量,用于劫持初始化的鉤子函數,進行自動化賦值,存儲相應的事件,暴露一個事件觸發的接口。

紙上得來終覺淺,絕知此事要躬行

看到這里,相信你已經有一定的了解全局狀態管理,那么到底如何實現呢?在這里,我要強調,如果你閱讀此文后對此有一定的了解了,我說的思路,那么你一定要自己嘗試實現出代碼,不管是否好壞,總是比沒有實現的好,在自己實現中也許有更多的收獲。下面以上上面案例展示一下簡單的實現代碼,給沒看太明白的一個思路。在下次我會寫一遍相關代碼實現的講解,應該會有。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
// app.js
class Store {
 constructor(app){
 this['event'] = {}
 this.app = app
 }
 autoSet(globalData, instance){
 const instanceData = {}
 for (let prop of globalData){
  instanceData[prop] = this.app.globalData[prop]
  const callBack = (newValue) => {
  instance.setData({[prop]: newValue})
  instance.watch[prop] && instance.watch[prop].call(instance, newValue)
  }
  this.addEvent(prop, callBack)
  instance.setData(instanceData)
  callBack(instanceData[prop])
  delete instance.watch
  delete instance.globalData
 }
 }
 addEvent(eventName, callBack){
 this.event[eventName] = this.event[eventName] || []
 this.event[eventName].push(callBack)
 }
 dispatch(eventName, newValue){
 this.app.globalData[eventName] = newValue
 this.event[eventName] && this.event[eventName].forEach(item => item(newValue))
 }
}
 
App({
 globalData: {
  userInfo: null
 },
 onLaunch(){
  // new 一個實例并保存到小程序 app 中,用于全局調用
  this.store = new Store(this)
  wx.getSetting({
   success: res => {
    if(res.authSetting['scope.userInfo']){
     wx.getUserInfo({
      success: res => {
       // 獲取到 userInfo 后,觸發事件
       this.store.dispatch('userInfo', res.userInfo)
      }
     })
    }
   }
  })
 }
})
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Pages/index/index.js
const app = getApp()
Page({
 // ...
 data: {
  userName: null
 },
 // globalData 數組用于自動賦值
 globalData: ['userInfo'],
 // 監聽相應的 globalData 屬性,設置回調函數
 watch: {
  userInfo(userInfo){
  console.log('userInfo 更新啦', this)
  this.setData({userName: userInfo.nickName})
  }
 },
 onLoad(options){
  // 傳入此 globalData,和實例,設置該實例需要的 data,創建事件
  app.store.autoSet(this.globalData, this)
  // 其他你想做的...
 }
})

上面的代碼并沒有劫持鉤子函數,只是額外在函數開始時執行了綁定函數,而且也沒有頁面銷毀時,釋放內存的操作。還是有許多可優化的地方,這些都留到下一次講解。

總結

到此這篇關于微信小程序全局狀態的文章就介紹到這了,更多相關小程序全局狀態內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://juejin.cn/post/6916377392441229326

延伸 · 閱讀

精彩推薦
  • js教程JavaScript數據結構之雙向鏈表

    JavaScript數據結構之雙向鏈表

    這篇文章主要為大家詳細介紹了JavaScript數據結構之雙向鏈表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    希魔王的塔羅牌7852022-02-13
  • js教程JavaScript 防盜鏈的原理以及破解方法

    JavaScript 防盜鏈的原理以及破解方法

    這篇文章主要介紹了JavaScript 防盜鏈的原理以及破解方法,幫助大家更好的理解和使用JavaScript,感興趣的朋友可以了解下...

    LuckyChou10362021-12-22
  • js教程確保JavaScript 安全的五大做法

    確保JavaScript 安全的五大做法

    如果你運行交互式網站或應用程序,JavaScript 安全性是重中之重。 從程序錯誤和不安全的用戶輸入到惡意攻擊,有很多事情可能會出錯。...

    粵嵌教育8752022-01-11
  • js教程微信小程序自定義膠囊樣式

    微信小程序自定義膠囊樣式

    這篇文章主要為大家詳細介紹了微信小程序自定義膠囊樣式,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    四曦11512021-12-21
  • js教程mustache.js實現首頁元件動態渲染的示例代碼

    mustache.js實現首頁元件動態渲染的示例代碼

    這篇文章主要介紹了mustache.js實現首頁元件動態渲染的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可...

    code2roc4262021-12-21
  • js教程JS+CSS實現過渡特效

    JS+CSS實現過渡特效

    這篇文章主要為大家詳細介紹了JS+CSS實現過渡特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Dr_空山3642021-12-23
  • js教程javascript實現倒計時關閉廣告

    javascript實現倒計時關閉廣告

    這篇文章主要為大家詳細介紹了javascript實現倒計時關閉廣告,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    愛前端的茂茂11572022-01-20
  • js教程利用 Chrome Dev Tools 進行頁面性能分析的步驟說明(前端性能優化)

    利用 Chrome Dev Tools 進行頁面性能分析的步驟說明(前端性能優化

    這篇文章主要介紹了利用 Chrome Dev Tools 進行頁面性能分析的步驟說明(前端性能優化),本文給大家介紹的非常想詳細,對大家的學習或工作具有一定的參考借...

    小蚊4192022-01-22
主站蜘蛛池模板: 国产色视频在线观看免费 | 国产亚洲精久久久久久蜜臀 | 国产精品一区在线免费观看 | 男女羞羞视频在线免费观看 | 亚洲成人中文字幕在线 | 成人男女视频 | 国产亚洲精品综合一区91 | 日韩欧美动作影片 | 成年人国产视频 | 第一福利在线 | 久久精品视频免费 | 国产精品一区免费在线观看 | 精品一区二区久久久 | 国产精品视频在线免费观看 | 91中文在线观看 | 免费看成人av | 国产精品久久久麻豆 | 污黄视频在线播放 | 国产精品视频免费在线观看 | 国产一区二区三区四区波多野结衣 | 久久露脸国语精品国产91 | 91网页| 精品亚洲午夜久久久久91 | 国产精品视频免费网站 | 欧美一区永久视频免费观看 | 色婷婷综合久色aⅴ | 韩毛片| 精品国产一区二区三区在线观看 | 国产精品久久久久久影院8一贰佰 | 一级性色 | 国产精品自拍99 | 羞羞视频免费网站男男 | 深夜免费观看视频 | 成人偷拍片视频在线观看 | 日韩av片在线播放 | 欧美激情 在线播放 | 亚洲四播房 | 成人免费在线视频 | 伊人在线视频 | 成人情欲视频在线看免费 | 特级无码毛片免费视频尤物 |