我正在将 React 与 Redux 和 Material UI 一起使用来构建 web 应用程序。webapp 由多个页面和组件组成。我知道快餐栏或对话框应该直接连接到用户正在做的事情。但是,我想让快餐栏和对话框独立于页面和组件。因此,一个用例正在显示一条消息 likebackground synchronization of your data failed
和一个 action retry now
。我的想法是在一个名为 的页面上呈现snackbar,该页面RootFrame
用于包装所有其他页面并将snackbar 的文本作为操作的有效负载发送。
我的 Redux 操作来显示一个小吃吧:
export function showSnackbar(message: string) {
return {
type: SHOW_SNACKBAR,
payload: message
};
}
当然,在操作中指定消息而不是将消息作为参数也可能会很好,但这不是我现在的问题。问题是:我怎样才能使用这个系统并显示一个带有动作的snackbar?我可以将我的操作更改为
export function showSnackbar(message, action) {
return {
type: SHOW_SNACKBAR,
payload: {
message,
action
}
};
}
RootFrame
并以类似的方式渲染我的小吃店
<Snackbar
message={this.props.message}
ref='snackbar'
onDismiss={() => this.props.dispatch(dismissSnackbar())}
action='retry now'
onActionTouchTap={() => this.props.dispatch(this.props.action)}
/>;
当快餐栏被关闭时,一个动作会改变状态中的一个变量:snackbar.visible = false
。这用于激活快餐栏(它在 时呈现snackbar.visible === true
)。当用户点击 时retry now
,启动同步的动作(作为道具传递给组件)应该被调度。使用对话框时问题非常相似。因此,不仅要显示的文本,而且下一个可能的操作都必须传递给组件。
你认为像这样使用 Redux 是可以的还是有更好的解决方案?