2017-03-22 5 views
1

Das ist mein Ziel. Ich möchte eine zusammengesetzte Komponente erstellen, die die Gültigkeit der übereinstimmenden URL überprüft, bevor das Element children angezeigt wird. Andernfalls wird eine gemeinsame Komponente zurückgegeben, um eine Fehlermeldung anzuzeigen.Wie übergebe ich eine zusätzliche Eigenschaft an ein Child-Element in einem reactjs?

So, hier ist mein Code meines 'decorator':

const EnforceUrlValidation = (test, children) => { 
    const fn = ({ match }) => { 
    if (! test(match)) { 
     return (<InvalidUrlContainer />); 
    } 
    return ({children}); 
    } 
    return fn; 
} 

Es ist, wie es in meinem Router verwendet wird:

const WelcomePage = EnforceUrlValidation(
    (match) => { 
     const articleId = match.params.articleId; 
     return articleId && isValidarticleId(articleId); 
    } 
    , <WelcomeContainer/> 
) 
... 
<Routers> 
    <Switch> 
      <Route 
       path="/:articleId" 
       component={WelcomePage} 
      /> 
... 

</Routers> 

Das Problem, das ich jetzt habe, ist, dass ich will noch Pass das match Objekt in die children innerhalb EnforceUrlValidation. Wie kann ich das erreichen?

Versuch 1:

const EnforceUrlValidation = (test, children) => { 
    const fn = ({ match }) => { 
    if (! test(match)) { 
     return (<InvalidUrlContainer />); 
    } 
    return (<children match={match} />); 
    } 
    return fn; 
} 

Die children ist in diesem Fall nicht gemacht.

Versuch 2:

const EnforceUrlValidation = (test, children) => { 
    const fn = ({ match }) => { 
    if (! test(match)) { 
     return (<InvalidUrlContainer />); 
    } 
    return (
     <div match={match} >{children} </div> 
    ) 
    } 
    return fn; 
} 

Es schlägt fehl, weil div nicht match

Antwort

7

Sie können React.cloneElement unterstützt verwenden Eigenschaft Kinder hinzuzufügen:

const EnforceUrlValidation = (test, children) => { 
    const fn = ({ match }) => { 
    if (! test(match)) { 
     return (<InvalidUrlContainer />); 
    } 
    const extendedChild = React.cloneElement(children, {match: match}); 
    return extendedChild; 
    } 
    return fn; 
} 
+0

Danke für die Antwort! FYI, die Return-Anweisung kann einfach "Return extendedChild;" (ohne die umschließenden Klammern) –

+0

Ich bin froh, ich könnte helfen :) Du hast Recht, danke! Antwort aktualisiert –

+0

Nur kurz: Werden nach dem Klonen die "Kinder" Müll gesammelt? Gibt es einen Haken in Bezug auf die Speichernutzung? –

Verwandte Themen