2016-06-10 34 views
0

Ich habe eine Container-Komponente mit einem Modal darin, das basierend auf einer State-Eigenschaft geöffnet und geschlossen wird.Setze Zustandseigenschaft von URL mit react-router

Ich möchte dies über die URL steuern, dh ich

/projects - the modal is NOT open 
/projects/add - the modal IS open 

Wie auch in der Lage zu verbinden direkt mit ihm haben wollen, möchte ich die URL, wenn ich auf die Links in der Haupt klicken sich ändern Container, um das Modal zu öffnen.

Kann jemand erklären, wie ich das machen könnte, oder mir in die richtige Richtung eines guten Tutorials zeigen?

+0

Sie können direkt auf 'params' und' pathname' zugreifen, indem Sie 'this.props.params' verwenden, und vielleicht direkt auf diese verweisen, um die Modale zu verwalten. – Kujira

Antwort

0

HINWEIS: Dieser Weg ist nicht perfekt. Noch mehr ist es eher antipattern als Muster. Der Grund, warum ich es hier veröffentliche, ist, dass es gut für mich funktioniert und ich mag die Art, wie ich Modale hinzufügen kann (ich kann modal zu jeder Seite hinzufügen und ihre Komponenten hängen im Allgemeinen nicht von der anderen App ab. Und ich bleibe nett URLs statt hässlich ?modal=login-form). Aber sei bereit, Probleme zu bekommen, bevor du alles funktionstüchtig findest. Denke nochmal nach!

Betrachten wir Sie URLs sollen folgende:

  • /users<Users /> Komponente zeigen

  • /users/login<Users /> Komponente zeigen und <Login /> modal darüber

Sie Login nicht wollen abhängig von Users in, sagen Sie, Hinzufügen von Login-Modal zu anderen Seiten ohne Schmerzen.

Nehmen wir an, Sie haben eine Wurzelkomponente, die auf anderen Komponenten steht. Zum Beispiel Usersrender kann wie folgt aussehen:

render() { 
    return (
    <Layout> 
     <UsersList /> 
    </Layout> 
); 
} 

Und Layout ‚s render etwas wie folgt aussehen:

render() { 
    return (
    <div className="page-wrapper"> 
     <Header /> 
     <Content> 
     {this.props.children} 
     </Content> 
     <Footer /> 
    </div> 
); 
} 

Der Trick ist modal der Injektion zu <Layout /> jedes Mal, wenn wir es brauchen zu erzwingen.

Der einfachste Weg ist, Flussmittel dafür zu verwenden. Ich benutze Redux und habe ui Reducer für solche Seite Meta-Informationen, können Sie ui Store erstellen, wenn Sie andere Fluss-Implementierung verwenden. Wie auch immer, Endziel ist es, modal zu rendern, wenn <Layout />s Zustand (oder sogar bessere Requisiten) modal enthält, die einer Zeichenfolge entsprechen, die den modalen Namen darstellt.Etwas wie:

render() { 
    return (
    <div className="page-wrapper"> 
     <Header /> 
     <Content> 
     {this.props.children} 
     </Content> 
     {this.props.modal ? 
     <Modal key={this.props.modal} /> : 
     null 
     } 
     <Footer /> 
    </div> 
); 
} 

<Modal /> kehrt modale Komponente auf bestimmten Schlüssel hängt (Bei unserer login-form Schlüssel wollen wir <Login /> Komponente empfangen).

Okay, gehen wir zum Router. Berücksichtigen Sie das folgende Code-Snippet.

const modal = (key) => { 
    return class extends React.Component { 

    static displayName = "ModalWrapper"; 

    componentWillMount() { 
     // this is redux code that adds modal to ui store. Replace it with your's flux 
     store.dispatch(uiActions.setModal(key)); 
    } 

    componentWillUnmount() { 
     store.dispatch(uiActions.unsetModal()); 
    } 

    render() { 
     return (
     <div className="Next">{this.props.children}</div> 
    ); 
    } 

    } 
}; 

... 
<Route path="users" component={Next}> 
    <IndexRoute component={Users}> 
    <Route path="login" component={modal('login-form')}> 
    <IndexRoute component={Users} /> 
    </Route> 
</Route> 

(Sie kümmern uns um nicht Next - ich es hier der Einfachheit halber hinzufügen Stellen Sie sich this.props.children einfach macht.)

modal() Funktion zurück Komponente reagieren, die Änderung in ui Speicher auslöst. Sobald der Router also /users/login erhält, fügt er login-form zu ui hinzu, speichert ihn als prop (oder state) <Layout /> und rendert <Modal />, was für den gegebenen modalen Schlüssel entspricht.

0

Um programmgesteuert eine neue URL zu bewerten, übergeben Sie die router to your component und verwenden Sie push. push zum Beispiel wird im Callback-Trigger durch die Benutzeraktion aufgerufen.

Wenn Sie Ihren Router einstellen, geben Sie eine Route zu /projects/:status ein. dann können Sie in Ihrer Komponentenroute den Wert status mit this.props.param.status lesen. Lesen Sie "whats-it-look-lik" von react-router für ein Beispiel.

Verwandte Themen