2014-09-24 20 views
5

Come posso cambiare lo stato di un componente React dal mio vecchio pacchetto legacy jQuery ?Cambia stato del componente React dal vecchio Javascript esterno?

Ho un componente come questo:

var AComponent = React.createClass({ 
    getInitialState: function() { 
    return { ids: [] } 
    }, 
    render: function() { 
    ... 
    }, 
    onButtonClick: function() { 
    ids.splice(…); // remove the last id 
    } 
}); 

Quando accade qualcosa di speciale nel vecchio codice jQuery zuppa, vorrei spingere un id a AComponent.state.ids. Come lo posso fare?

Una soluzione "ovvia" è un anti-pattern; qui è:

var componentInstance = AComtonent({}); 
React.renderComponent(componentInstance, document.getElementById(...)); 

// Somewhere else, in the jQuery soup. Something special happens: 
componentIntance.state.ids.push(1234); 
componentIntance.setState(componentInstance.state); 

Questo è un antipattern, secondo this email from a Facebook developer, perché scrive che componentInstance potrebbe essere distrutta da reagire.

+0

Penso che per progettazione si supponga che una mutazione di stato sia interna, quindi se si desidera cambiarla dall'esterno, è necessario utilizzare un oggetto di scena. Il che significa dividere il componente in due nel tuo caso. IE: spostando il tuo stato su qualcosa che comprende il grilletto della tua jquery e quindi risolvendo il tuo problema. –

+0

@plus Buono a sapersi che la mutazione di stato dovrebbe essere solo interna. Non ho capito cosa intendi con * "che comprende il tuo grilletto jquery" * - intendevi che lo stato dovrebbe essere posizionato all'esterno del componente e passarei i mutatori di stato come oggetti di scena al componente? (Come nella risposta di kulesa.) – KajMagnus

risposta

4

renderei il componente stateless. Archiviare l'array ids al di fuori del componente e passarlo come supporto con funzioni che modificano l'array. Vedere l'esempio su JSFiddle: http://jsfiddle.net/ohvco4o2/5/