2016-12-02 29 views
7

Po przeczytaniu redux doc I okazało się, że doc wspomniano to:Dlaczego sklep redux powinien być możliwy do serializacji?

Mimo to, należy zrobić wszystko, aby utrzymać stan serializacji. Nie wkładaj do środka żadnych przedmiotów, których nie można łatwo zmienić w JSON.

Moje pytanie brzmi: jaka jest korzyść z utrzymywania stanu z możliwością serializacji? Albo jakie mam trudności, jeśli umieszczę dane nie nadające się do serializacji w sklepie?

I wierzę, że nie jest to jedyne w przypadku redux - Flux, nawet React Local State sugerują to samo.


Aby mnie tu wyjaśnić, jest przykładem. Załóżmy, że struktura sklepu jest taka.

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

To wszystko powinno wyglądać dobrze. Jednak przy próbie dostępu „autor Księgi 1”, muszę napisać kod tak:

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

Teraz idę do zdefiniowania klasy:

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

A mój sklep będą:

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

Tak, że mogę się z autorem łatwo za pomocą:

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

Drugie podejście może uczynić obiekt "książki" świadomym, jak pobierać dane autora, więc osoba dzwoniąca nie musi znać relacji między książkami i autorami. Dlaczego nie używamy go, zamiast trzymać "czysty przedmiot" w sklepie tak jak podejście nr 1?

Wszelkie pomysły są mile widziane.

+0

w JS można wykonywać wywołania ogólne/zastosować wywołania, więc takie defs nie muszą żyć w danych, a mimo to należy rozdzielić dane i logikę. utwórz kolejną warstwę abstrakcji, jeśli chcesz mieć przydatne przysmaki metodyczne. – dandavis

Odpowiedz

9

Bezpośrednio z the redux FAQs:

mogę umieścić funkcje, obietnic lub innych przedmiotów niż SERIALIZABLE w moim stanie sklepu?

Zdecydowanie zaleca się umieszczanie w swoim sklepie wyłącznie obiektów, tablic i elementów prymitywnych nadających się do serializacji. Z technicznego punktu widzenia możliwe jest wstawienie do produktu elementów nie nadających się do serializacji, ale może to uniemożliwić utrwalanie i nawodnienie zawartości sklepu, a także zakłócać debugowanie w czasie podróży.

Jeśli jesteś w porządku z takimi problemami, jak utrwalanie i debugowanie w czasie podróży, które mogą nie działać zgodnie z zamierzeniami, możesz złożyć przedmioty nie nadające się do serializacji do swojego sklepu Redux. Ostatecznie jest to Twoja aplikacja, a sposób jej wdrożenia zależy od Ciebie. Podobnie jak w przypadku wielu innych rzeczy dotyczących Redux, po prostu upewnij się, że rozumiesz, jakie kompromisy są w to zaangażowane.


Dalsze czytanie:

+0

Dzięki za odpowiedź, szczególnie za wspomnienie podróży w czasie. Jest to dla mnie nowe i ma sens, aby przechowywać w katalogu seryjnym. – charlee

+1

Jako autor FAQ Redux, to _exactly_ dlaczego to napisałem :) Bardzo się cieszę, że widzę go i używam go do odpowiedzi na pytania! – markerikson

+1

@markerikson Zrobiłeś z nimi świetną robotę, szczególnie zbiór linków do problemów i zasobów stron trzecich jest naprawdę pomocny! – Timo

0

Dodając do tego, co @Timo powiedział: Jeśli chcesz konfiguracji relacji między 2 stany w drzewie państwowej i wykorzystania komputerowej wartości, reselect jest najlepiej pasuje do tego scenariusza. Pozwala na tworzenie selectors, które mogą być używane do definiowania stanów obliczeniowych. W twoim przypadku author można utworzyć za pomocą selektora nad book. https://github.com/reactjs/reselect