reactjs - Access React component from this.props.children with react-router -
i have website following react-router
, react-router-relay
setup:
main.jsx:
<router history={browserhistory} render={applyroutermiddleware(userelay)}> <route path="/:classroom_id" component={mainview} queries={classroomqueries}> <indexroute component={start} queries={classroomqueries} /> <route path="tasks" component={taskroot} queries={classroomqueries}> <indexroute component={tasklist} queries={classroomqueries} /> <route path="task/:task_id" component={taskview} queries={classroomtaskqueries} /> <route path="task/:task_id/edit" component={taskedit} queries={classroomtaskqueries} /> </route> </route> </router>
the site virtual classroom, in teacher can create tasks students. these tasks can edited.
when user edits task in taskedit
, hits save, changes applied , user redirected tasklist
. want give user "your changes saved!" message once task edited.
i have created bootstrap alert component (<alert>
) exact purpose.
for illustration purposes, assume have following mainview
component (check router above):
mainview.js:
render() { <div> <menu /> <row> <col md={3}> <sidebar /> </col> <col md={9}> {this.props.children} <-- start, taskroot, etc go here </col> </row> <alert someprops={...} /> <-- popup component </div> }
normally, create alert component outside of active component , pass kind of function displays alert prop active component. similar shown here.
however, works specific component. because <alert>
sits @ root-level of page (along menubar, sidebar, , other things static on pages), cannot pass prop due {this.props.children}
.
allow me illustrate flow want achieve once more:
- user saves edits task in
<taskedit>
. - edits saved , user taken
<tasklist>
. - immediately after, want
<alert>
trigger, , show message.
i've seen other solutions suggesting can clone children of react element , apply prop needed open alert
, because of nature of react-router
doesn't seem work.
how can accomplish above? there way component globally accessible? please note don't want recreate <alert>
in each component. one such component whole dom.
simple answer:
put alert component once in top level view, use pubsub or event bus lib update it.
in alert component oncomponentdidmount function listen specific event , data , update state accordingly (visibility , message)
in task save function publish event event bus.
more advance answer:
use react flux library https://facebook.github.io/flux/docs/overview.html
Comments
Post a Comment