【问题标题】:how to listen for route change in react-router-dom v6如何在 react-router-dom v6 中监听路由变化
【发布时间】:2022-01-09 23:37:05
【问题描述】:

我正在尝试将旧的 react 路由器 dom 代码迁移到 v6,我想知道如何监听路由变化,我现在使用的是 useHistory

const history = useHistory()
//then
history.listen(...)

我确实阅读了新文档,发现 useHistory 已更改为 useNavigate

const navigate = useNavigate()
//then
navigate.listen(...) // listen is not a function

你能帮我找到一种方法来监听 v6 中的路由变化

// This is a React Router v6 app
import { useNavigate } from "react-router-dom";

function App() {
  let navigate = useNavigate();
  function handleClick() {
    navigate("/home");
  }
  return (
    <div>
      <button onClick={handleClick}>go home</button>
    </div>
  );
}

【问题讨论】:

    标签: javascript reactjs react-router-dom


    【解决方案1】:

    navigate 函数是一个函数,而不是像旧的 react-router-dom 版本 5 的 history 对象那样的对象。

    您仍然可以创建自定义 history 对象,但您需要创建自定义路由器才能使用它。这允许您导入 您的 history 对象并创建侦听器。

    创建一个自定义路由器示例,使用其中一个更高级别的路由器作为他们如何管理位置和状态的示例,即BrowserRouter

    const CustomRouter = ({ history, ...props }) => {
      const [state, setState] = useState({
        action: history.action,
        location: history.location
      });
    
      useLayoutEffect(() => history.listen(setState), [history]);
    
      return (
        <Router
          {...props}
          location={state.location}
          navigationType={state.action}
          navigator={history}
        />
      );
    };
    

    在您的代码中创建自定义 history 对象,供您的新自定义路由器和其他组件使用。

    const history = createBrowserHistory();
    export default history;
    

    使用您的路由器并将您的历史对象传递给它。

    import CustomRouter from '../CustomRouter';
    import history from '../myHistory';
    
    ...
    
    <CustomRouter history={history}>
      ....
    </CustomRouter>
    

    在您想要监听位置变化的组件中,导入您的历史对象并像之前一样调用listen 回调。

    import history from '../myHistory';
    
    ...
    
    useEffect(() => {
      const unlisten = history.listen((location, action) => {
        // ... logic
      });
    
      return unlisten;
    }, []);
    

    如果您愿意,您也可以创建自己的自定义 useHistory 挂钩,它只返回您的历史对象。

    【讨论】:

    • 在 de 依赖数组中使用 useEffectlocation.pathname 不是更容易吗? IE。 ` useEffect(() => { // ...code }, [location.pathname])`
    • @Reinier68 这取决于你想听的地方......如果你在一个 React 组件中,你可以简单地使用 useLocation 钩子和一个 useEffect 钩子,那么这可能就足够了。如果您需要实例化单个历史对象以附加更实质性的侦听器,以便在反应外部使用,例如在网络服务模块中,则此方法有效。我在这里的回答只是对 RRDv6 的转换,它允许使用history.listen 逻辑。
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 2022-07-09
    • 2022-06-23
    • 2022-08-02
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 2022-03-23
    相关资源
    最近更新 更多