【发布时间】:2016-08-18 10:11:09
【问题描述】:
我有一个带有以下react-router 和react-router-relay 设置的网站:
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>
该网站是一个虚拟教室,教师可以在其中为学生创建任务。这些任务也可以编辑。
当用户在TaskEdit 中编辑任务并点击保存时,更改将应用并且用户重定向到TaskList。现在我想在编辑任务后向用户发送“您的更改已保存!”消息。
为此,我创建了一个 bootstrap alert 组件 (<Alert>)。
出于说明目的,假设我有以下mainView 组件(检查上面的路由器):
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>
}
通常,我会在活动组件之外创建此警报组件,然后将某种将警报显示为道具的函数传递给活动组件。类似于here 显示的内容。
但是,这仅适用于特定组件。但是因为<Alert> 位于我页面的根级别(以及所有页面上的菜单栏、侧边栏和其他静态内容),所以由于{this.props.children},我不能将其作为道具传递。
请允许我再次说明我想要实现的流程:
- 用户将编辑保存到
<TaskEdit>中的任务。 - 编辑被保存,用户返回
<TaskList>。 - 紧接着,我希望
<Alert>触发并显示一条消息。
我看到其他解决方案建议您可以克隆 React 元素的所有子元素并应用打开 alert 所需的道具,但由于 react-router 的性质,这似乎并不真正起作用。
我怎样才能完成上述任务?有没有办法让组件可以全局访问?请注意,我不想在每个组件中重新创建 <Alert>。对于整个 DOM,只有 一个 这样的组件。
【问题讨论】:
-
你听说过 Redux 吗? (github.com/reactjs/react-redux) 它可以帮助您以良好的模式组织代码
标签: reactjs react-router react-router-relay