在小程序中使用redux

手把手教你在微信小程序使用Redux

來自知乎 凌空

首先挡篓,為什么要在微信小程序中使用Redux澜倦?小程序雖然主張輕量級應用料按,但也難免會有些復雜情況。在應對某些異步場景瞬内,以及多個打開著的頁面相互影響的情況下迷雪,你需要有一個數(shù)據(jù)流管理庫才能更好地縷清思路,增加項目的可維護性虫蝶。

舉個栗子:你在A頁面點一個按鈕會發(fā)送遠程請求章咧,同時轉跳到B頁面,遠程請求返回值在B頁面顯示能真。這個場景在B頁面加載時遠程請求并沒有結束赁严,此請求會在獲得返回值的同時響應到B頁面上。

因為在A頁面點按鈕時并不存在B頁面粉铐,所以無法在遠程請求的異步回調(diào)中用getCurrentPages()在B頁面setData疼约。如果用app對象下的全局變量周轉,手寫代碼監(jiān)聽變化蝙泼,在項目變大后會變得極其難維護程剥。而使用Redux就可以很好地適應這種場景。

下面我針對剛舉的例子一步一步來說說如何將Redux整合進小程序汤踏,在文章結尾有GitHub鏈接织鲸。先創(chuàng)一個項目,有沒有appId都行溪胶。

image

在創(chuàng)建完后會有一個默認的小項目搂擦,我們就基于這個來吧。獲取redux.min.js并放進目錄哗脖∑偬撸可以找cdn下載到本地扳还,也可以從redux官方repo里自己編譯,只有10kb左右橱夭。然后創(chuàng)建actions.js和reducers.js普办,目錄如下圖。

image

添加一個修改文字的action徘钥,以及一個reducer用來改變Store里文字的狀態(tài)

// actions.js 
export const changeText = (text) => {
    return { type: 'CHANGE_TEXT', text }
}

// reducers.js
export default {
    myText(state = '', action) {
        switch (action.type) {
            case 'CHANGE_TEXT':
                return action.text
            default:
                return state
        }
    }
}

app.js中初始化Store,并放在App實例里以方便調(diào)用

//app.js
import { createStore, combineReducers } from './lib/redux.min'
import reducers from './reducers'

const Store = createStore(combineReducers(reducers))

App({
  Store,
  onLaunch: function () {
    // ...

在首頁index.wxml編輯下肢娘,添加一個按鈕呈础,并bindtap

<!--index.wxml-->
<view class="container">
  <view  bindtap="bindViewTap" class="userinfo">
    <image class="userinfo-avatar" src="{{userInfo.avatarUrl}}" background-size="cover"></image>
    <text class="userinfo-nickname">{{userInfo.nickName}}</text>
  </view>
  <view class="usermotto">
    <button type="primary" bindtap="bindBtn">2秒后改變下一頁的文字</button>
  </view>
</view>

image

修改index.js,在bindBtn里用setTimeout 2000的方式模擬異步遠程請求2秒后返回橱健,再dispatch action將下一頁的文字設為'new text'而钞。同時轉跳到下一頁。

//index.js
import { changeText } from '../../actions'
//獲取應用實例
const app = getApp()
const Store = app.Store
const dispatch = Store.dispatch

Page({
  data: {
    userInfo: {}
  },
  bindBtn() {
    setTimeout(() => {
      dispatch(changeText('new text'))
    }, 2000)
    wx.navigateTo({
      url: '../logs/logs',
    })
  },
// ...

在logs.wxml里只放一個{{foo}}

<!--logs.wxml-->
<view class="container">
  {{foo}}
</view>

這一步是重點拘荡,在logs.js里的onLoad訂閱Store并響應式刷新data臼节,在onUnload里取消訂閱以節(jié)省資源。生命周期的管理看需要珊皿,也可以在onShow里訂閱网缝,onHide里取消訂閱。

//logs.js
const app = getApp()
const Store = app.Store
const dispatch = Store.dispatch

Page({
  data: {
    foo: ''
  },
  onLoad() {
    const updateDate = () => {
      const foo = Store.getState().myText
      this.setData({ foo })
    }

    updateDate();
    this.unsubStore = Store.subscribe(() => updateDate())
  },
  onUnload() {
    this.unsubStore()
  }
})

我們可以看到蟋定,logs頁面foo變量的初始值是空String粉臊,當Redux Store里的myText變化后馬上觸發(fā)subscribe的回調(diào),并用setData設置本頁面變量驶兜。

我們來測試下扼仲,在首頁點擊綠色按鈕后,瞬間轉跳到下一頁抄淑,過兩秒后出現(xiàn)'new text'字樣

image

這就是一個最基本的在微信小程序使用Redux的方法了屠凶。更高級的用法比如再配合redux-thunk這樣的中間件使用,讓異步流程更清晰肆资。

GitHub Repo地址 https://github.com/lhz516/wechat-mina-redux-example

本文例子是用Redux底層API實現(xiàn)矗愧,另外還可以用高階函數(shù)綁定的方式實現(xiàn),比如這個庫 wechat-weapp-redux 迅耘,它是參照react-redux中Provider和connect的概念贱枣。但我還是推薦初學者用Redux底層API走一遍,因為目前在小程序用Redux高階函數(shù)綁定的思路還不夠成熟颤专,比如是否只在onLoad里subscribe store纽哥,在onUnload里unsubscribe store?如果想使用栖秕,得做好自己維護的準備春塌。

相關傳送門:Redux文檔

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子只壳,更是在濱河造成了極大的恐慌俏拱,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吼句,死亡現(xiàn)場離奇詭異锅必,居然都是意外死亡,警方通過查閱死者的電腦和手機惕艳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門搞隐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人远搪,你說我怎么就攤上這事劣纲。” “怎么了谁鳍?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵癞季,是天一觀的道長。 經(jīng)常有香客問我倘潜,道長佑淀,這世上最難降的妖魔是什么傍妒? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任峰鄙,我火速辦了婚禮殊者,結果婚禮上,老公的妹妹穿的比我還像新娘蕊退。我一直安慰自己郊楣,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布瓤荔。 她就那樣靜靜地躺著净蚤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪输硝。 梳的紋絲不亂的頭發(fā)上今瀑,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音点把,去河邊找鬼橘荠。 笑死,一個胖子當著我的面吹牛郎逃,可吹牛的內(nèi)容都是我干的哥童。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼褒翰,長吁一口氣:“原來是場噩夢啊……” “哼贮懈!你這毒婦竟也來了匀泊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤朵你,失蹤者是張志新(化名)和其女友劉穎各聘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抡医,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡躲因,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忌傻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毛仪。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖芯勘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腺逛,我是刑警寧澤荷愕,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站棍矛,受9級特大地震影響安疗,放射性物質發(fā)生泄漏。R本人自食惡果不足惜够委,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一荐类、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧茁帽,春花似錦玉罐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铁追,卻和暖如春季蚂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背琅束。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工扭屁, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涩禀。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓料滥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親埋泵。 傳聞我的和親對象是個殘疾皇子幔欧,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345