6
Redux初探 (www.facebook.com)
IngramChen 積分 1

那 side effect 放哪?redux 是 pure ,virtualdom 也是 pure...

popcorny 積分 2 編輯於

一個page出來的時候應該有initial state,不管是page init state還是server side render的init state。

而每個event都可以改變狀態。例如click event, input event, 甚至ajax complete的event,都可以當做一個讓狀態改變的action。但是reducer只專注於input跟中間的參數,跟應該有的output。

以ajax read more的例子來說。先是ajax request到server,complete的時候增加一個append的action去reduce舊狀態(只有第一頁)到新狀態(增加ajax load的新文章),再呼叫react去render。

所以還是可以保持render跟reduce都是pure的。

popcorny 積分 0 編輯於

action感覺比較像是input的包裝,應該沒有邏輯層面。真正邏輯是做在reducer。

所謂的no side-effect,也可以說不會改變外部的狀態。所以在redux中,mutation是交給redux內部去做。而redux會把目前狀態跟action交給reducer,最後再redux內部去改變store的狀態。所以side-effect(mutation)應該說發生在redux內部。

IngramChen 積分 0

side effect 是指 ajax call 或是 persist 到 local storage 之類的。 ajax code 是放在 action,persist 大概放 store 吧 ? 。

剩下可以 pure 處理的才可放在 reducer (大概是 model 之類的吧?)

不知有沒理解錯

siuying 積分 2

Redux 在文件 Async Actions1 中有說到,這時候通常用 redux trunk middleware 寫一種叫 Action Creator 的東西。儲存理應放在 Store 。

不喜歡 Redux 的地方就是這種造一大堆新的 abstraction 出來,而且也不是唯一的做法,新手不知道對不對。

popcorny 積分 2 編輯於

天啊!! 這東西好複雜,看了好久才知道他在說什麼。

一般來說store.dispatch應該只吃Action1 type,但是透過middleware可以包裝此dispatch變成可以吃Thunk這個型態,此型態的定義在 這裡2 ,簡單講就是一個

function(dispatch, getState)

這種型態的function。透過closure的方式,可以讓在async的地方去call這兩個redux會用到的function,來達到ajax complete的時候,去sync的呼叫dispatch來通知complete。

這個可能對於用redux的人可能會知其然但不知所以然吧,如果沒有搞懂thunk的機制,可能覺得莫名其妙吧。我同意你說的,這些abstraction不太必要,只是讓一且覺得很神奇而已,對於新手入門門檻太高了。

popcorny 積分 2 編輯於

side effect就是改變外面的狀態就是side effect,例如counter++就是side effect。所以以下的increase function就是有side-effect

var myObject = {
    counter: 0,
    increase: function() {
        this.counter++;
    }
}

因為他改變了counter的值了。而no side-effect的版本是

function addOne(counter)  {
    return counter + 1;
}
而redux做的事情是
state = reducer(state);

所以這個assignment是做redux裡面,而非reducer。

事實上在functional language中,assignment is evil XD。所以他們才那麼不同意Imperative programming style。

IngramChen 積分 0 編輯於

ok, 所以 side effect 拆到 action 去了。感覺是將傳統的 controller 的角色再細分成 action, reduce, flow ...etc