- 用一個去銀行存款的例子來說明Redux的概念
- 對銀行來說,每個存戶的帳戶資訊可以記錄在一個state裡面如下,裡面存的資料是key-value的形式,key是該帳戶的號碼,value是帳戶資訊
const state = {
6685943: {
name: 'Tyler',
balance: 20
},
6685266: {
name: 'Mikenzi',
balance: 60
},
668508: {
name: 'Jake',
balance: 50
}
}
- 想要存錢的話必須填存款單,你必須寫清楚要存到哪個帳戶,存多少錢的資訊。而存款單就等同於Redux中的Action概念,Action用來描述我想要對state做怎樣的修改。Action是一個物件,其中type欄位是必須的,搭配其他欄位資訊可以描述想要做的動作。
const action = {
type: 'DEPOSIT',
accountNumber: 6685943
amount: 10
}
- 接著你會把存款單跟錢放到一個透明的管子裡面,它不是必須的,但它可以讓你更方便的把存款單跟錢交給行員。這根管子在Redux裡面是Action Creator的概念。Action Creator讓你的action是portable且易於測試,通常會把它包成一個function,創造並return一個Action。
function handleDeposit (accountNumber, amount) {
type: 'DEPOSIT',
accountNumber,
amount
}
- 行員負責將管子內的東西取出,根據上面的資訊決定怎麼處理你的存款。行員在Redux裡面是Reducer的概念,Reducer會接受目前的state以及要做的action,產生目前state的一份copy,根據action修改這個copy,最後把這個copy設定成state。
function reducer (state, action) {
switch (action.type) {
case 'DEPOSIT' :
return Object.assign({}, state, {
[action.accountNumber]: state.amount + action.amount
})
case 'WITHDRAWAL' :
return Object.assign({}, state, {
[action.accountNumber]: state.amount - action.amount
})
default :
return state
}
}
- 那要怎麼呼叫Reducer並且帶給它特定的action呢? Redux提供一個dispatch( ) function,讓你可以帶入action (通常由Action Creator產生),接著Reducer就會被呼叫,並且將現在的state以及所帶入的action帶進去Reducer。下面的例子中,submitUser()是一個Action Creator。
dispatch(submitUser('Tyler'))
沒有留言:
張貼留言