【问题标题】:How can I prevent the unmount in React Components?如何防止 React 组件中的卸载?
【发布时间】:2019-03-02 21:46:19
【问题描述】:

我正在尝试在我的应用中实现一项功能,当用户尝试离开未提交的表单时,他们会收到确认,询问他们是否确定要离开,然后再保存他们的变化。

componentWillUnmount 方法似乎是完美的候选,因为它会触发用户可能放弃表单的所有各种方式(更改导致其消失的父组件状态,导航到不同的路线等...)。但是...当确认返回 false 时,我无法阻止卸载。

关于如何实现这一点有什么建议吗?

【问题讨论】:

标签: javascript reactjs


【解决方案1】:

最好通过 react-router: setRouteLeaveHook 处理。

componentWillMount() {
    this.unregisterLeaveHook = props.router.setRouteLeaveHook(props.route, this.routerWillLeave.bind(this));
}

routerWillLeave(nextLocation) {
  return false;        
}

当组件被卸载时,注销离开钩子:

componentWillUnmount() {
    this.unregisterLeaveHook();
}

【讨论】:

  • 我刚看到类似的东西,谢谢你的回答,它对我很有效
  • 你能详细解释一下吗?我想有条件地阻止卸载
【解决方案2】:

使用react-router,您可以使用Prompt 轻松防止路由更改(这将防止组件卸载)。

import { Prompt } from 'react-router';

const BlockingComponent = ({ isBlocking }) => (
  <div>
    <Prompt
      when={isBlocking}
      message={location =>
        `Are you sure you want to go to ${location.pathname}`
      }
    />
    {/* Rest of the JSX of your component */}
  </div>
);

这里的isBlocking 应该是bool,指示是否应显示阻止提示。可以找到完整的demo on react-router website

此方法适用于BrowserRouterHashRouter,但如果您使用的是MemoryRouter,则需要按如下所示创建路由器,然后在组件中使用提示:

<MemoryRouter
  getUserConfirmation={(message, callback) => {
    callback(window.confirm(message));
  }}
>
  {/* Your App */}
</MemoryRouter>

您需要手动传递 getUserConfirmation 属性,这是一个函数。
您可以在任何路由器(浏览器、内存或哈希)中随意修改此功能,以创建自定义确认对话框(例如模式),而不是使用浏览器的默认 confirm

【讨论】:

  • 它执行 URL 效果 - 当出现提示窗口时 - 它会将 URL 字符串更改为前一个。然后您单击“取消”按钮,出现了一个惊喜 - URL 可以改回也可以不改。但是您停留在当前页面上,这没关系。这个问题来自 2017 年,似乎仍未解决
【解决方案3】:

我不建议在 componentWillUnmount 中这样做。我通常想在商店里这样做(如果你使用的是通量架构)。通常是商店需要跟踪所有数据。 componentWillUnmount 函数是您想要卸载存储侦听器的功能。

【讨论】:

  • Demon,其实我找到了其他方法来实现我想要的,没错,它不使用 componentWillUnmount。谢谢你的回答。
  • 没问题。 :) aa
  • 你采用了什么解决方案?
  • @JoshuaNavarroRuíz:什么解决方案?
猜你喜欢
  • 1970-01-01
  • 2016-01-14
  • 2019-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多