React と Redux および Material UI を使用して webapp を構築しています。Web アプリケーションは、いくつかのページとコンポーネントで構成されています。スナックバーまたはダイアログは、ユーザーが行っていることに直接接続する必要があることを知っています。ただし、ページとコンポーネントでスナックバーとダイアログを独立させたいと考えています。したがって、ユースケースは、のようなメッセージbackground synchronization of your data failed
とアクションを表示していますretry now
。私のアイデアは、スナックバーを というページにレンダリングすることでしたRootFrame
。これは、他のすべてのページをラップし、アクションのペイロードとしてスナックバーのテキストをディスパッチするために使用されます。
スナックバーを表示する私の Redux アクション:
export function showSnackbar(message: string) {
return {
type: SHOW_SNACKBAR,
payload: message
};
}
もちろん、メッセージを引数として受け取る代わりに、アクションでメッセージを指定することも良いかもしれませんが、それは今のところ私の問題ではありません。問題は、このシステムを使用してアクション付きのスナックバーを表示するにはどうすればよいかということです。自分の行動を次のように変更できますか
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)}
/>;
スナックバーが閉じられると、アクションによって state: の変数が変更されますsnackbar.visible = false
。これは、スナックバーを有効にするために使用されます ( の場合にレンダリングされますsnackbar.visible === true
)。ユーザーが をクリックするとretry now
、同期を開始するアクション (props としてコンポーネントに渡される) がディスパッチされる必要があります。ダイアログを使用する場合、問題は非常に似ています。したがって、表示するテキストだけでなく、次の可能なアクションもコンポーネントに渡す必要があります。
このように Redux を使用しても問題ないと思いますか、それともより良い解決策はありますか?