2016-07-19 5 views
6

zu senden Ich baue eine App auf re-frame default template.Was ist der richtige Weg, Sekretärin URL-Parameter zu Reagenz-Komponente

ich folgende Sekretärin Route haben:

(defroute "https://stackoverflow.com/users/:id" [] 
    (re-frame/dispatch [:set-active-panel :user-panel]) 

Ich möchte in meinem Reagenzkomponente id Parameter von URL zuzugreifen. Der einzige Weg, es zu erreichen, den ich gefunden habe, setzt es auf db. Etwas wie:

(defroute "https://stackoverflow.com/users/:id" [id] 
    (re-frame/dispatch [:set-user-id id]) 
    (re-frame/dispatch [:set-active-panel :user-panel]) 

Dies wird definitiv meine db und ein solcher Ansatz verschmutzen scheint für mich komisch zu sein, wie ich verwendet, so etwas wie dies in der Reaktion (mit react-router) zu schreiben:

<Route path="/user/:id" component={MyComponent}> 
// object with params automatically attached as props to MyComponent 

Was ist der korrekte Weg, URL-Parameter für Sekretoren an die Reagenzkomponente zu senden?

UPD: In den Kommentaren gibt es einen Link zu github discussion dieses Problems. Ones beziehen sich auf URL-Parameter zu Db als einen richtigen Weg zu setzen. Wie auch immer, ich mag es nicht wirklich. Es verursacht viel mehr Komplexität (params setzen, abonnieren, unscharf schalten). Und ich denke nicht über URL-Parameter als App-Status nach. Gibt es irgendeinen Hack oder sowas?

+0

@PiotrekBzdyl ich meine Frage aktualisiert haben . Wenn Sie irgendwelche Hacks haben, lassen Sie es mich wissen, trotzdem danke. –

+0

@PiotrekBzdyl Können Sie dies bitte als Antwort hinzufügen. Ich werde es als richtig markieren, wenn in einigen Tagen nichts Neues erscheint. Danke für die Hilfe –

+0

Ich habe meine Kommentare in eine Antwort verschoben. –

Antwort

1

Die Diskussion auf https://github.com/gadfly361/reagent-seed/issues/4 scheint genau Ihr Szenario abzudecken, und ich denke, dieser Ansatz folgt der "Single DB" Philosophie von Re-Frame, wo Ihr DB-Inhalt den gesamten Zustand Ihrer Anwendung (einschließlich des Panels und seiner Parameter) bestimmt.

Ich würde argumentieren, dass es eine Frage des Glaubens ist, dass ein einzelnes Atom DB der richtige Ansatz ist oder nicht. Die Verwendung von Pfadparametern direkt (wie Route Komponenten, die sie direkt von der URL lesen) ist wie das Schreiben einer Komponente, die nicht die Atom-DB, sondern eine alternative Datenquelle (in diesem Fall den URL-Pfad) verwendet.

Man könnte sagen, dass die Komponente Route genau das tut, was Sie als komplexe Logik bezeichnen (sie registriert Pfadänderungen und verwaltet einen anderen Komponentenstatus). In diesem Fall verwenden Sie nur das vorhandene Codeelement aus der Komponente Route, anstatt dasselbe in Ihrem Code zu tun, indem Sie die DB-Daten zu den URL-Pfadänderungen gemäß den Sekretariatsrouten aktualisieren.

1

die Daten aus dem Browser-URL verfügbar

(.. js/window -location -pathname) 

dann bidi mit (wir verwenden bidi und aufdringlich statt Sekretärin, z. B. as blogged) dann

(bidi/match-route your-routes url) 
Verwandte Themen