2014-10-14 29 views
22

Próbuję "zresetować" element ReactJS.Jak "zresetować" element ReactJS?

W tym przypadku element stanowi 90% + zawartości strony.

Używam replaceState do zamiany stanu elementu na jego stan początkowy.

Niestety, podelementy, które mają swój "stan", nie są resetowane. W szczególności pola formularzy zachowują ich zawartość.

Czy istnieje sposób na wymuszenie ponownego renderowania elementu, który spowoduje również ponowne renderowanie pod-elementów, tak jakby strona właśnie została załadowana?

+0

Powinieneś prawdopodobnie przekazać stan jako rekwizyty dla dzieci – David

+0

Jeśli używasz parametr [kontrolowane komponenty] (https://facebook.gitub.io/react/docs/forms.html#controlled-components) wspomniany w dokumentach React i przechowuje stan wysoko w hierarchii, w której wywołujesz 'replaceState', możesz także "zresetować" stan formularza. –

+1

@ssorallen Wejścia są osadzone w elementach, które mają swoją własną funkcjonalność i komunikację z serwerem. na przykład pole "username", które wykonuje własne sprawdzanie AJAX dla duplikatów, jako część sprawdzania * pola *. – fadedbee

Odpowiedz

49

Dodanie do elementu elementu key powoduje, że element (i wszystkie jego elementy potomne) są ponownie renderowane po zmianie tego klucza.

(ustawić wartość „klucza” po prostu znacznika czasu, gdy początkowe dane zostały wysłane.)

render: function() { 
    return (
    <div key={this.state.timestamp} className="Commissioning"> 
     ... 
1

Chociaż nie osobiście, że należy przechowywać lokalnych, stanowych komponentów tymczasowy (jak pola wprowadzania w toku) w scentralizowanej lokalizacji (jak w przypadku magazynu strumieniowego) w większości przypadków, tutaj może mieć sens, w zależności od tego, ile masz, szczególnie, że wygląda na to, że dane wejściowe mają już trochę interakcji/sprawdzania serwera wokół nich. Przeniesienie tego stanu do hierarchii komponentów lub do innej centralnej lokalizacji może bardzo pomóc w tym przypadku.

Jedną z alternatywnych idei z mojej głowy jest użycie mixinu w komponentach, które mogą wymagać zresetowania stanu lokalnego i zrobienia pewnego rodzaju wyzwalania zdarzeń itp., Aby to się stało. Na przykład, można użyć węzła EventEmitter lub bibliotekę jak EventEmitter3 z wstawek tak (ostrzeżenie: nie testowane, może najlepiej to jako Pseudokod :)

var myEmitter = new EventEmitter(); // or whatever 

var ResetStateMixin = { 
    componentWillMount: function() { 
    myEmitter.on("reset", this._resetState); 
    }, 

    componentWillUnmount: function() { 
    myEmitter.off("reset", this._resetState); 
    }, 

    _resetState: function() { 
    this.replaceState(this.getInitialState()); 
    }, 

    triggerReset: function() { 
    myEmitter.emit("reset"); 
    } 
}; 

następnie można użyć go w składniki tak:

React.createClass({ 
    mixins: [ResetStateMixin], 

    getInitialState: function() { 
    return { ... }; 
    }, 

    onResetEverything: function() { 
    // Call this to reset every "resettable" component 
    this.triggerReset(); 
    } 
}); 

Jest to bardzo prosty i bardzo ciężki w obsłudze (można zresetować tylko wszystkie komponenty, każdy składnik wywołuje replaceState(this.getInitialState()), itp.), Ale problemy te można rozwiązać przez rozszerzenie nieco mixin (np. O wielu emitujących zdarzenia, pozwalając na komponent specyficzne implementacje resetState i tak dalej).

Warto zauważyć, że musisz do użyć kontrolowanych danych wejściowych, aby to zadziałało; podczas gdy nie będziesz musiał wciskać swojego stanu aż do hierarchii komponentów, nadal będziesz chciał, aby wszystkie twoje dane wejściowe posiadały procedury obsługi value i onChange (itp.).

+0

W jakich okolicznościach jest to lepsze niż dodanie "klucza" do elementu? – fadedbee

+0

@brandon, czy mogę prosić o zapoznanie się z pytaniem dotyczącym "reagowania na renderowanie" tutaj: http://stackoverflow.com/questions/27913004/react-js-render-a-component- from-outside-react? –

+0

Zgadzam się z tobą w sprawie rozwiązania strumienia. Po prostu waży mi się potencjał wywoływania akcji za każdym razem, gdy zmienia się forma (jest zmiana wejścia). – backdesk

6

Metoda this.replaceState(this.getInitialState()) w rzeczywistości nie resetuje dzieci, które są wejściowe, jeśli tego właśnie szukasz. Dla każdego, kto chce tylko zresetować pola formularza, dostępna jest standardowa funkcja DOM reset(), która usunie wszystkie wejścia w danym elemencie.

Więc z React, że to będzie coś takiego:

this.refs.someForm.getDOMNode().reset(); 

Doumentation:

https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement/reset

4

Jeśli jest to forma chcesz zresetować, po prostu można użyć tej