【问题标题】:React control flow for manually entered route手动输入路线的反应控制流
【发布时间】:2021-09-29 12:29:12
【问题描述】:

我有一个 App 组件,其所有路由定义如下;

function App() {
//some logic for state including canShow which is a boolean and shows routes only if it is true
{canShow && (
<Route exact path="/Route1">
<Comp1 />
</Route>
<Route exact path="/Route2">
<Comp2 />
</Route>
)
}

现在说如果用户当前在 localhost/#/Route1 上并手动输入 URL,即说 localhost/#/Route2,控件似乎直接跳转到 Comp2

我还在 App 的子组件中设置了 props.history.listen() (在所有 Route 定义之外)。所以基本上这个监听是在 App 的一个直接子组件中。

有什么方法可以在手动输入 URL 时确保控件首先总是转到 App.js...这样我就可以更新设置“canShow”的逻辑,如果 canShow 为 false,我不渲染任何子组件,并且控件不去 Comp1 或 Comp2

通过链接导航时也可以控制 props.history.listen 回调,但使用直接 URL 输入时,它似乎不会先到 props.history.listen。

【问题讨论】:

    标签: reactjs react-hooks react-router


    【解决方案1】:

    您可以使用useHistory 挂钩让您的App 组件根据历史更改进行更新。这个钩子返回带有位置属性的历史对象。

    在 App 组件中,您可以添加一个useEffect 来确定您的canShow 状态并在需要时更新它。

    import { useHistory } from 'react-router';
    import { useEffect, useState } from 'react';
    
    function App() {
      const [canShow, setCanShow] = useState(true);
      const history = useHistory();
      
      useEffect(() => {
          if (history.location.pathname === '/Route1') {
            setCanShow(true);
          }
      }, [history])
      
      //some logic for state including canShow which is a boolean and shows routes only if it is true
      return canShow && (
        <Route exact path="/Route1">
          <Comp1 />
        </Route>
        <Route exact path="/Route2">
          <Comp2 />
        </Route>
      );
    }
    

    【讨论】:

    • 谢谢克里斯...所以我目前在我的 App 的直接子组件之一中设置了 props.history.listen()...所以你认为我应该使用 useEffect 并检查[历史] 变化?
    • 是的,有了钩子就不需要添加listen 事件处理程序:-)
    • 哦 k...但是两种方法的 UI 行为可能会有所不同(特别是在用户手动更新 URL 时)
    • 其实我试过这个...由于某种原因,在 URL chages(链接点击或手动输入)上,useEffect 回调没有被触发。
    • 你能创建一个可重现的例子吗?
    猜你喜欢
    • 1970-01-01
    • 2020-10-09
    • 2020-08-27
    • 2016-08-03
    • 2022-01-24
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多