React Router 4——监听路由操作并以编程方式继续/停止路由

IT技术 javascript reactjs react-router
2021-05-12 04:36:33

这是我的场景:

  • 我有一个用户表单,用户可以在其中输入详细信息
  • 我想在用户尝试离开当前页面时创建一条确认消息,即“嘿,您有未保存的更改”
  • 我的组件是我的路由指定的组件,因此它可以访问匹配项、位置、路由和历史记录。
  • 我知道历史的监听和阻止功能,但我们如何实现这一点?我们可以在某个生命周期中的某个地方调用这些函数,或者你们有其他想法来实现这一点吗?

参考:

https://github.com/ReactTraining/history#listening

https://github.com/ReactTraining/history#blocking-transitions

我的问题:

  • 当用户离开当前页面/路由时如何监听路由器?(你明白了)

  • 以编程方式允许用户继续或不

1个回答

有一个特定的组件react-router仅用于该特定目的:<Prompt>

引用自述文件

用于在离开页面之前提示用户。当您的应用程序进入应阻止用户导航离开的状态时(如表单填写一半),渲染<Prompt>.

<Prompt>whenmessageprops。当用户尝试离开并when设置为 true时会显示提示因此,您可以让函数根据您的要求将一些 bool 变量设置为 true/false,并将其作为props传递给<Prompt>.

例如:

//your component where you get user input

state = {
    name: "",
};

render() {
    return (
      <div>
        <div>
          <Prompt
            when={!!this.state.name} /* triggers the display of prompt */ 
                                  /*(checks if this.state.name is set)*/
            message={location => `You have unsaved changes. Are you sure you want to go to ${location.pathname}?`}
          />
          <div>Nice looking profile! What's your name?</div>
          <input value={this.state.name} onChange={e => this.setState({ name: e.target.value })} />
        </div>
      </div>
    );
  }

示例提示

Codesandbox 示例(不是我的)

这里找到教程

<Prompt>此处查看文档:docs