reactjs - getUserConfirmation Prompt React Router with History Redirect
问题描述
在离开表单状态已更改的页面时,我使用createBrowserHistory
with来处理确认用户验证:getUserConfirmation
import { createBrowserHistory } from 'history';
import store from './store';
import { displayPrompt } from './ui/navigation-prompt/navigationPromptDucks';
export default createBrowserHistory({
getUserConfirmation(message, callback) {
store.dispatch(displayPrompt(message, callback));
},
});
它运作良好:当我开始编辑表单并尝试离开当前页面时,我得到了确认提示。
现在,假设我有一个删除按钮来删除表单的资源,当删除成功时,我将历史重定向到资源列表页面。
我的问题是:如果我开始编辑表单并最终决定点击删除按钮来删除资源而不是编辑它,历史会触发表单已更改,并将在历史重定向之前显示确认提示。
我有两个选择。首先,我可以放回初始表单状态以避免出现提示。其次,在某些情况下,还有另一种方法可以防止出现提示。
什么是最好的解决方案?如果是第二个,你能告诉我怎么做吗?
解决方案1(首选)
在历史重定向之前重置表单:
const mapDispatchToProps = (dispatch, { user, history, t }) => ({
deleteUser: () => new Promise((resolve, reject) => {
dispatch(newAlertDialog(
t('confirmDeleteUser', { user: user.name }),
t('confirmDeleteTitle'),
() => dispatch(requestDeleteUser(user.id, resolve, reject)),
t('delete'),
))
}).then(() => {
// reset form to avoid prompt user confirmation
dispatch(reset('EditUser'));
history.push('/users');
})
});
解决方案
在我的情况下,在历史重定向之前重置表单似乎是最好的解决方案:
const mapDispatchToProps = (dispatch, { user, history, t }) => ({
deleteUser: () => new Promise((resolve, reject) => {
dispatch(newAlertDialog(
t('confirmDeleteUser', { user: user.name }),
t('confirmDeleteTitle'),
() => dispatch(requestDeleteUser(user.id, resolve, reject)),
t('delete'),
))
}).then(() => {
// reset form to avoid prompt user confirmation
dispatch(reset('EditUser'));
history.push('/users');
})
});
由于资源将被删除,使用初始值重置表单是避免提示弹出的好方法。
推荐阅读
- kotlin - 如何在终端中从用户那里获取字符?
- java - 在 jpa 中保存具有一对多关系的实体会出现以下错误
- shell - Informatica Pre Session 命令读取目录中匹配模式的文件并删除文件中的“”
- asp.net-core - 如何在计时器回调或触发我的任务的方法中获得正确的 IMemoryCache 实例?
- javascript - 从 HTML 表单数据创建 JS 对象失败
- c# - WPF 全局热键未注册
- sql - 为我定义的函数创建触发器时,Postgres SQL 中的语法错误?
- java - 如何绕过或禁用 Ssl 握手错误
- android - 检查数据状态是否完全写入文件?
- c# - 无法让 InvokedItemContainer 与 Android 一起使用