javascript - 在 React / Next js 中路由之前检查更改
问题描述
我有一个 Next JS 应用程序,其中有非常简单的两个页面。
->主页
import Header from "../components/header";
const handleForm = () => {
console.log("trigger");
};
export default () => (
<>
<Header />
<h1>Home</h1>
<form onSubmit={handleForm}>
<input type="text" placeholder="Username" />
<input type="password" placeholder="Password" />
<button type="submit"> Login </button>
</form>
</>
);
->关于页面
import Header from "../components/header";
export default () => (
<>
<Header />
<h1>About us</h1>
</>
);
要求:
-> 主页有一个登录表单
-> 如果用户在没有提交表单的情况下开始输入任何字段,如果他尝试移动到About us
页面,则需要显示类似于beforeunload_event的警告。
我不确定我们如何处理它,因为我是新手。如果用户在编辑表单字段时尝试导航到其他 url,请帮助我处理警报。
解决方案
据我了解,您可以通过监听事件来实现您的目标,routeChangeStart
然后在拒绝移动目标网址的情况下引发异常。
我在代码框上分叉并根据您的想法创建了一个简单的演示,它不允许在用户名有价值的情况下切换页面(表单很脏)。
这是一般的想法:
import router from "next/router";
export default () => {
// Assume this value holds the status of your form
const [dirty, setDirty] = React.useState();
// We need to ref to it then we can access to it properly in callback properly
const ref = React.useRef(dirty);
ref.current = dirty;
React.useEffect(() => {
// We listen to this event to determine whether to redirect or not
router.events.on("routeChangeStart", handleRouteChange);
return () => {
router.events.off("routeChangeStart", handleRouteChange);
};
}, []);
const handleRouteChange = (url) => {
console.log("App is changing to: ", url, ref.current);
// In this case we don't allow to go target path like this
// we can show modal to tell user here as well
if (ref.current) {
throw Error("stop redirect since form is dirty");
}
};
return (
// ...
)
}
链接代码框在这里https://codesandbox.io/s/react-spring-nextjs-routes-forked-sq7uj
推荐阅读
- javascript - 使用 PropTypes.InferProps 和默认参数时如何删除 Object is possible is 'null' TS2531 警告?
- animation - 是否可以在 Flutter 中制作液体动画?
- angular - Angular:当组件发生更改时如何提供视觉/UI提示?
- node.js - 按百分比排序数组,但如果用户具有相同的百分比,则按杀戮排序
- javascript - 有什么方法可以知道 socket.io 连接来自哪个域?
- c# - SqlKata - 加入字符串值和 ISNULL 条件
- javascript - 如何在javascript中检测数据属性
- javascript - 反转页面颜色
- java - Apache HTTP 客户端:未捕获 NoHttpResponseException 异常?
- php - 以安全高效的方式访问云存储桶中的文件/图像