【问题标题】:How can I change URL without render using React Router 6?如何使用 React Router 6 在不渲染的情况下更改 URL?
【发布时间】:2022-02-16 23:35:12
【问题描述】:
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<App />}>
          <Route path="object" element={<Navigate to="/object/new" />} />
          <Route path="object/:objId" element={<ObjEditor />} />
          <Route path="object/new" element={<ObjEditor />} />
          <Route index element={<Navigate to="/object/new" />} />
        </Route>

使用 react 路由器,您可以导航到 URL /object/1234 的对象。 &lt;ObjEditor&gt; 将在渲染时从数据库中获取数据。我希望如果您在 URL 中输入未知的objId,地址将更改为object/new,而不会导致重新渲染。

我尝试从 useEffect 挂钩调用 react 路由器的 navigate("/object/new") 函数,但由于数据获取是异步的,它甚至会从数据库中确实存在的 objId 导航离开。

我在这里缺少什么?谢谢。

【问题讨论】:

  • 为什么不在 ObjEditor 组件内部导航,如果 id 不存在,在 fetch 回调中?
  • @MWO 我最终大致进入了那个球场。谢谢:)

标签: reactjs asynchronous react-hooks react-router use-effect


【解决方案1】:

这是我最终做的:

  const [requestedObj, setRequestedObj] = useState();
  const { objId } = useParams();

  useEffect(() => {
    if (requestedObj)
      dispatch({ type: Actions.LOAD_OBJECT, obj: requestedObj });
  }, [requestedObj]);

  useEffect(() => {
    let isSubscribed = true;

    const fetchObject = async () => {
      const obj = await db.getObject(objId | 0);

      if (isSubscribed && obj) {
        setRequestedObj(obj);
      }
    };

    fetchObject().catch(() => {
      navigate("/object/new");
    });

    return () => (isSubscribed = false);
  }, [objId, setRequestedObj]);

【讨论】:

  • 你真的想要这个按位运算db.getObject(objId | 0)吗?
  • @DrewReese 好问题。它将数字字符串转换为整数。因为我的 ID 都是自然数,所以我觉得它是一个很好的速记。
  • 我明白了,这是一个不错的技巧,尽管在 objId 是虚假值的情况下很容易与备用值语法 db.getObject(objId || 0) 混淆。 db.getObject(Number(objId)) 会,IMO,同样有效且更具可读性。
  • @DrewReese 我完全同意你的看法
猜你喜欢
  • 1970-01-01
  • 2019-12-11
  • 2018-01-24
  • 2015-11-19
  • 1970-01-01
  • 2017-12-31
  • 2022-01-20
  • 1970-01-01
  • 2020-10-18
相关资源
最近更新 更多