2016-05-31 7 views
6

Pracuję nad administracją sklepu z reakcją, alt i niezmienną. Moja oferta obiekt wygląda mniej więcej tak:Najlepsza praktyka: ponowne wykorzystywanie komponentów lub pisanie duplikatów

offer: { 
    groups: [{ 
    articles: [{ 
     optionGroups: [{ 
      options: [] 
     }] 
    }] 
    }] 
} 

I iteracyjne nad każdą pozycję i wyświetlić formularz do edycji grupy, artykuł, .... Jeśli coś się zmieni, wywołuję OfferAction i przekazuję ścieżkę, zmienione pole i nową wartość podmiotowi, np. OfferActions.update([2, 'articles', 5, 'optionGroups'], 'name', 'MyOptionGroup')

Teraz chcę wyświetlić dokładnie ten sam formularz, ale z różnymi symbolami zastępczymi i zmiennymi komunikatami. Jeśli formularz jest wypełniony, należy utworzyć encję (musi być wywołana inna właściwość OfferAction). Jaka jest najlepsza praktyka, aby to zrobić?

Myślałem o następujących możliwości:

push pusty Elementy na stanie OfferStore
Puste elementy będą wyświetlane jak inni. Nie muszę duplikować żadnych komponentów, ale muszę wprowadzić wiele sprawdzeń, które OfferAction muszą zostać wywołane po zmianie, symbole zastępcze do renderowania i wartości ukryte, jeśli ich brakuje. Po utworzeniu obiektu po prostu wepchnęłbym inny pusty element do tablicy ofert.

Tworzenie 2nd komponent
może po prostu utworzyć drugi składnik, który ja render. Zarządzałbym formularzem poprzez wewnętrzny stan, tworzenie encji po wypełnieniu formularza i resetowanie stanu. Doprowadziłoby to do łupu duplikatu jsx.

Czy istnieje jakaś najlepsza praktyka do archiwizowania tego, bez powielania składnika lub komplikowania innych?

+0

Utwórz pusty obiekt oferty przed renderowaniem, komponent zawsze powiązany ze składem. Wystarczy dodać flagę do zaoferowania obiektu, np. "Isnew". Gdy oferta z isnew == true cancelled, usuń ją ze sklepu. –

Odpowiedz

1

Po prostu chcesz mieć różne symbole zastępcze i zmienne wskazówki?

Ustaw boolean prop na komponencie najwyższego poziomu, który musi zostać zduplikowany. Następnie dla każdego symbolu zastępczego/changeHandler;

if(this.props.someBooleanValue){ 
    //alternate action or placeholder 
} else { 
    //original action or placeholder 
} 

Dołącz someBooleanValue={true} o alternatywnych wersjach zostawić oryginały jak jest.

+0

A jak zarządzać wartościami mojego formularza? Po zmianie tekstu w danych wejściowych wyeksportuję OfferAction.update. Stan oferty zarządzany przez mój sklep alt zostaje zaktualizowany, dzięki czemu moje rekwizyty zostają również zaktualizowane. Jeśli po prostu zmienię symbole zastępcze i procedury obsługi, jak mogę zarządzać wartościami mojego formularza?Rekwizyty są tylko do odczytu i jeśli zaimplementuję stan wewnętrzny, mój komponent dostaje się do skomplikowanego i zapchanego. – Lucas

+0

Nie jestem pewien, jakie wartości formularzy próbujesz zarządzać. Czy nie próbujesz po prostu przekazać te wartości do swojego kontenera/ActionCreatora? W każdym razie, jeśli twoje pytanie brzmi "jak zaktualizować te rekwizyty", odpowiedź brzmi: "Z komponentu nadrzędnego". Kiedy wyślesz OfferAction, zaktualizuj swój Alt Store tak, aby wskazywał na rozmiar Twojej ofertyAarray (lub cokolwiek innego, co się zmienia), która pozwoliłaby komponentom podrzędnym na dyktowanie, co powinny one renderować i jakie rekwizyty powinny przejść. – gravityplanx

0

Ponieważ istnieją tylko drobne różnice, polecam Ci pierwszą możliwość, więc utwórz jeden renderer dla obu przypadków.

Dodaj do każdego pola odpowiedni obiekt JSON (dla grup, artykułów e.t.c) zawierający pole dla pustych elementów i ustaw go na wartość true, np. isNew = true. Jeśli zrobisz to w ten sposób, możesz użyć tego samego mechanizmu zmian dla wszystkich elementów.

Konieczne informacje o aktualizacji znajdują się w obiekcie JSON, a jeśli trzeba utworzyć nowy element, po prostu sprawdź flagę isNew. Po dodaniu, ustaw flagę na false i możesz obsłużyć ją jak jedną z istniejących.

Powiązane problemy