2015-10-14 7 views
8

Nel mio JSX, ho un caso di una logica di rendering condizionale - quando l'elemento A rende qualcosa (è render() funzione restituisce qualcosa di diverso da null), poi anche il rendering elemento B, appena sopra l'elemento A.C'è un modo per dire se ReactElement esegue il rendering "null"?

Esempio di codice (semplificato) sarebbe simile a questa:

function render() { 
    let elemA = (<ElementA someProp={this.someVar} />); 

    if (elemA.isNull()) { 
     return (
      <div> 
       { ...someElements } 
      </div> 
     ); 
    } 

    return (
     <div> 
      { ...someElements } 
      <ElementB /> 
      { elemA } 
     </div> 
    ); 
} 

Quindi la mia domanda è - c'è un modo per avere l'assegno elemA.isNull()?

+1

reazione può non "sapere" se Elema ha reso nulla, a questo punto, dal momento che il metodo render solo descrive una struttura . – David

+0

Ok, quindi in questo caso, vedo due opzioni per risolvere questo: ** a) ** Creare un metodo personalizzato all'interno della classe ElementA, che mi dirà se renderà '' null'' o qualcos'altro ** b) ** Sposta il rendering condizionale all'interno di ElementA e passa qualsiasi cosa per renderizzare come oggetto di scena. | Non sono sicuro che la prima opzione sia effettivamente possibile, anche se ... – mdziekon

+0

Se ElementA è un componente puro (onky descritto da oggetti di scena), allora dovrebbe anche essere possibile dire da this.someVar se l'ElementA dovrebbe essere reso. – wintvelt

risposta

3

No, non c'è modo di determinare cosa renderà un bambino utilizzando React. Il modo standard per farlo è esporre qualche funzione di utilità che dice se A renderà.

Qualcosa di simile:

if (AUtils.isStoryValid(story)) { 
    return <A story={story} />; 
} else { 
    return <B story={story} />; 
} 
1

È possibile utilizzare i seguenti componenti di ordine superiore (HOC) per intercettare il metodo di Elementa render e realizzare ciò che si vuole:

function withNullCheck(WrappedComponent) { 
    return class NullChecker extends WrappedComponent { 
    render() { 
     const result = super.render(); 
     return(
     <div> 
      { this.props.alwaysPrefix } 
      { result && this.props.ifNotNullPrefix } 
      { result ? result : this.props.ifNull } 
      { result && this.props.ifNotNullAppend } 
      { this.props.alwaysAppend } 
     </div> 
    ); 
    } 
    } 
} 

si dovrebbe utilizzare come this:

const NullCheckedElementA = withNullCheck(ElementA); 

... 

function render() { 

    return ( 
     <NullCheckedElementA 
     alwaysPrefix={someElements} 
     ifNotNullPrefix={elemB} 
     someProp={this.someVar} 
     /> 
    ); 

} 
0

Quindi mi sono imbattuto in una situazione in cui ero bloccato dover fare questo, qui io È un modo che funziona (anche se la sciatteria potrebbe farti piangere).

Dovrebbe essere utilizzato solo come ultima risorsa perché è davvero un trucco totale e si verificherà un calo di prestazioni di ~ 0-20 ms a seconda della complessità del componente. (Provider c'è supponendo che si sta utilizzando redux e il componente dipende dal vostro stato redux):

import { renderToStaticMarkup } from 'react-dom/server'; 
import { Provider } from 'react-redux'; 
import store from 'pathToYourReduxStoreInstance'; 


export default function isRenderingNull(componentInstance) { 
    return !renderToStaticMarkup(
    <Provider store={store}> 
     {componentInstance} 
    </Provider> 
) 
} 
Problemi correlati