Sto usando ModalTrigger di react-bootstrap per mostrare un modale field-heavy (basato su Modal react-bootstrap), che significa inviarlo un po 'di oggetti di scena:Contesto di reazione non trasferisce quando si usa un componente come prop
<ModalTrigger modal={<MyModal field1={value1} field2={value2} (more fields...)/>}>
Click here to open
</ModalTrigger>
la componente principale che crea il grilletto ha i campi/valori passati in via oggetti di scena, e il componente principale di che componente ha passò come oggetti di scena così, dal componente di livello superiore che in realtà contiene i dati . Entrambi sono fondamentalmente pipe, che è un classico scenario childContext, tranne per il fatto che non funziona. Ecco una versione semplificata di quello che ho provato:
var MyModal = React.createClass({
contextTypes : {foo : React.PropTypes.string},
render : function() {
return (
<Modal {...this.props} title="MyTitle">
<div className="modal-body">
The context is {this.context.foo}
</div>
</Modal>
);
}
});
var Content = React.createClass({
childContextTypes : {foo: React.PropTypes.string},
getChildContext : function() {return {foo : "bar"}},
render : function() {
return (
<ModalTrigger modal={<MyModal/>}>
<span>Show modal</span>
</ModalTrigger>
)
}
});
Il modale si apre con "Il contesto è", senza mostrare il contesto reale.
Credo che stia succedendo perché l'oggetto inviato a ModalTrigger è già reso/montato in qualche modo, ma non sono sicuro del perché. Per quanto ne so, il proprietario di MyModal è il componente Contenuto, il che significa che il contesto dovrebbe essere ok, ma non è questo il caso.
Altre informazioni: Ho già provato a passare {...this.props}
e context={this.context}
a MyModal senza esito positivo. Inoltre, forse rilevante, ModalTrigger usa cloneElement per assicurarsi che i punti prop onRequestHide del mod alla funzione hide del trigger.
Quindi cosa mi manca qui? :/
Poiché il contesto è una funzionalità non documentata di reazione, non abbiamo ancora documentato questa funzionalità. Per i dettagli, consulta https://github.com/react-bootstrap/react-bootstrap/pull/644. Jimmy ha fatto un ottimo lavoro per abilitare il tuo uso dei contesti. –
Grazie! Non ero a conoscenza del comportamento di 'cloneElement' .. Puoi approfondire un po 'cosa intendi con" questo approccio non funzionerà "? –
La mia precedente descrizione del comportamento di 'cloneElement' era sbagliata: il proprietario verrà conservato a meno che l'oggetto' ref' non venga sovrascritto, il che non sembra essere il caso di 'ModalTrigger'. Ho aggiornato la mia risposta con una correzione, oltre a una soluzione più chiara al problema che viene fornita con react-bootstrap. –