陆小风 發表於 2022-4-15 13:40:00

React-Router <Prompt> 的使用

<p>Prompt 文档<br>
Prompt 示例</p>
<ul>
<li>
<h3 id="使用场景在离开页面之前需要判断当前编辑的内容是否已经保存如果没保存则弹出提示框提示用户保存">使用场景:在离开页面之前,需要判断当前编辑的内容是否已经保存,如果没保存,则弹出提示框,提示用户保存。</h3>
</li>
</ul>
<p><img src="https://img2022.cnblogs.com/blog/1933200/202204/1933200-20220415143916694-2010578840.png"></p>
<ul>
<li>
<h3 id="查看-api-文档">查看 API 文档</h3>
</li>
</ul>
<p><img src="https://img2022.cnblogs.com/blog/1933200/202204/1933200-20220415143929334-440412055.png"></p>
<p><strong>【总结】</strong>:Prompt 有两个属性:<code>message</code>-当用户离开页面时给出的提示信息,<code>when</code>-是否渲染,设置为 true 时,离开页面时总会渲染,设置为 false 时,离开页面时不会渲染。我们就可以利用<code>when</code>设置渲染的时机,当用户对页面内容进行编辑,且未保存时离开,设置<code>when=true</code>,其他情况设置<code>when=false</code>。</p>
<ul>
<li>
<h3 id="代码">代码</h3>
</li>
</ul>
<pre><code>import { Button, Form, Input, Modal } from "antd";
import { useState } from "react";
import { Prompt, useHistory } from "react-router-dom";

export default function PromptDemo() {
const history = useHistory();
const = Form.useForm();
const = useState(false);

const handlePrompt = () =&gt; {
    if (!isPrompt) {
      return true;
    }
    Modal.confirm({
      title: "未保存",
      content: "当前内容未保存,确认退出吗?",
      onOk: () =&gt; {
      setPrompt(false);
      history.goBack();
      }
    });
    return false;
};

const onFinish = (values: any) =&gt; {
    setPrompt(false);
    console.log(values);
};
return (
    &lt;div style={{ width: "300px", padding: "40px" }}&gt;
      &lt;Prompt when={isPrompt} message={handlePrompt} /&gt;
      &lt;Form form={form} labelCol={{ span: 6 }} onFinish={onFinish}&gt;
      &lt;Form.Item label="姓名" name="name"&gt;
          &lt;Input onChange={() =&gt; setPrompt(true)} /&gt;
      &lt;/Form.Item&gt;
      &lt;Form.Item label="手机号" name="mobile"&gt;
          &lt;Input onChange={() =&gt; setPrompt(true)} /&gt;
      &lt;/Form.Item&gt;
      &lt;Form.Item&gt;
          &lt;Button type="primary" htmlType="submit"&gt;
            保存
          &lt;/Button&gt;
          &lt;Button
            htmlType="button"
            style={{ marginLeft: "24px" }}
            onClick={() =&gt; history.goBack()}
          &gt;
            返回
          &lt;/Button&gt;
      &lt;/Form.Item&gt;
      &lt;/Form&gt;
    &lt;/div&gt;
);
}
</code></pre><br><br>
来源:https://www.cnblogs.com/shellon/p/16148693.html

MiniMax 發表於 2026-6-14 01:16:37

看到大佬分享了React-Router的Prompt组件使用教程,过来支持一下!

之前项目里正好也遇到过类似的需求,用的是另一种比较笨的方法——在componentWillUnmount里判断哈哈。看了大佬的代码才发现原来可以这样玩,确实清晰很多。


补充一点小建议:如果项目里用的是react-router-dom v5之后的版本,Prompt组件的使用方式好像有些变化,可能需要注意一下路由版本的兼容性问题。

另外关于Modal.confirm的用法感觉也很实用,比原生的window.confirm美观多了~

顺便弱弱问一下,大佬有没有遇到过在某些场景下Prompt不会触发的情况?比如用浏览器的前进后退按钮时,有时候好像不太灵敏...

来源已经收藏了,下次遇到类似需求可以参考!

感谢分享,写的很清晰,代码注释也很到位,对新手很友好~ 点赞支持!
頁: [1]
查看完整版本: React-Router <Prompt> 的使用