2016-12-02 18 views
7

當閱讀了Redux文檔我發現,文檔提到了這一點:仍然爲什麼redux應該是可序列化的?

,你應該盡最大努力保持狀態序列化。 不要把任何東西放在裏面,你不能輕易變成JSON。

所以我的問題是,保持狀態序列化的好處是什麼? 或者,如果我將不可序列化的數據放入存儲區,可能會遇到什麼困難?

我相信這不是唯一的redux - 通量,即使React本地狀態表明同樣的事情。


爲了讓我清楚這裏是一個例子。假設商店結構是這樣的。

{ 
    books: { 
     1: { id: 1, name: "Book 1", author_id: 4 } 
    }, 
    authors: { 
     4: { id: 4, name: "Author 4" } 
    } 
} 

這應該都很好看。然而,當我試圖進入「1書的作者」,我必須寫這樣的代碼:

let book = store.getState().books[book_id]; 
let author = store.getState().authors[book.author_id]; 

現在,我要定義一個類:

class Book { 
    getAuthor() { 
     return store.getState().authors[this.author_id]; 
    } 
} 

而且我的商店將是:

{ 
    books: { 
     1: Book(id=1, name="Book 1") 
    }, 
    ... 
} 

所以,我可以用輕鬆搞定作者:

let author = store.getState().books[book_id].getAuthor(); 

第二種方法可以使「書」對象知道如何檢索作者數據,因此調用者不需要知道書和作者之間的關係。那麼,爲什麼我們不使用它,而不是像方法1那樣在商店中保留「普通對象」?

任何想法表示讚賞。

+0

在JS中,您可以進行泛型調用/應用調用,因此這樣的defs不需要駐留在數據中,而且無論如何都應該分離數據和邏輯。如果你想要方便的有條不紊的好東西,可以創建另一個抽象層。 – dandavis

回答

9

直接從the redux FAQs

我可以把功能,承諾或其他非序列在我的商店狀態的項目?

強烈建議您只將普通的可序列化的對象,數組和基元放入商店。將不可序列化的商品插入商店在技術上是可行的,但這樣做可能會打破商店內容的堅持和補水的能力,並干擾時間旅行調試。

如果你對持久性和時間旅行調試等事情沒有問題,可能無法按預期工作,那麼非常歡迎您將不可序列化的項目放入Redux商店。最終,這是您的應用程序,您如何實施它取決於您。與Redux的其他許多事情一樣,只要確保您明白涉及到哪些折衷。


延伸閱讀:

+0

非常感謝您提及時間旅行的答案。這對我來說是新的,保持商店可序列化是有意義的。 – charlee

+1

作爲Redux FAQ的作者,這是_exactly_爲什麼我寫了:)很高興看到有人引用它並用它來幫助回答問題! – markerikson

+1

@markerikson您在他們身上做得很好,尤其是收集問題鏈接和第三方資源真的很有幫助! – Timo

0

添加到什麼@Timo說,如果你想2個國之間建立關係在您的狀態樹和使用計算值,reselect是適合該場景的最佳選擇。它允許創建可用於定義計算狀態的selectors。在你的情況下,author可以使用book之上的選擇器來創建。 https://github.com/reactjs/reselect

相關問題