谢谢你的问题,我们知道这会出现很多。这是我们多年来得到的一个常见问题。当我们开始记录所有这些类型的事情时,请耐心等待,还有很多工作要做!
简短回答:通常人们将 thunk 用于异步工作,这会导致想要导航到其他地方(登录后、创建记录后等)。当您的 thunk 成功时,将状态更改为类似"success"
或"redirect"
,然后使用效果 + 导航:
export function AuthForm() {
const auth = useAppSelector(selectAuth);
const dispatch = useAppDispatch();
const navigate = useNavigate();
useEffect(() => {
if (auth.status === "success") {
navigate("/dashboard", { replace: true });
}
}, [auth.status, navigate]);
return (
<div>
<button
disabled={auth.status === "loading"}
onClick={() => dispatch(login())}
>
{auth.status === "idle"
? "Sign in"
: auth.status === "loading"
? "Signing in..."
: null}
</button>
</div>
);
}
多一点解释:
例如,我们如何保持我们的历史同步以便从 redux 内部导航
我们一直认为这是一种不好的做法,并且不情愿地将history
对象作为一流的 API 提供,以停止关于应用程序状态和 URL 的哲学对话😅。
但今天情况有些不同。当与 React 最近的异步渲染、流媒体和悬念功能混合时,对话不再只是哲学问题,而是有一些具体的错误。为了保护 React 路由器应用程序免受 URL 同步错误(开发人员无能为力),v6 不再公开历史对象。
希望这个解释会有所帮助:
更改 URL 是副作用,而不是状态。Thunk 用于执行副作用,最终确定状态容器的某些状态,但不用于其本身的副作用(至少这是我的理解)。
例如,您可能希望在 redux 状态更改后更改页面上的焦点。您可能不会尝试通过 redux 操作和状态始终同步和控制文档的焦点。滚动位置相同。最终,用户可以控制这些事情:他们可以按 Tab 键、单击某些内容或滚动浏览。您的应用程序不会尝试自己或同步此状态下,它只是改变了它不时响应动作和状态,你做控制。
网址是一样的。用户可以在地址栏中输入他们想要的任何内容,单击后退、前进,甚至单击并按住后退按钮返回 3 个条目!它与焦点和滚动位置的状态相同:由用户拥有。容器无法真正拥有 URL 状态,因为它无法控制围绕它的操作。混合 React 的新功能和即将推出的功能,你会输掉这场比赛。
简而言之:在 UI 中更改 redux 状态 > useEffect > 导航。希望有帮助!