Invariant Violation: You should not use <Switch> outside a <Router>

阅读时长 4 分钟读完

在 React 前端开发中,我们有时会遇到一个错误信息:Invariant Violation: You should not use <switch> outside a <router>。这个错误的意思是,在某些情况下使用了 <Switch> 组件而没有包裹在一个 <Router> 中,导致程序崩溃。那么这个错误是什么原因造成的呢?如何解决?

背景

React 是一个非常流行的前端框架,它提供了一种声明式的方式来构建用户界面。React Router 是 React 官方提供的路由库,用于管理应用程序中的 URL,以及在不同 URL 上呈现不同的 UI 组件。在 React Router 中,<Router> 是顶层组件,用于设置路由规则和渲染 UI。

示例代码:

-- -------------------- ---- -------
------ - ------------- -- ------- ------- ----- - ---- -------------------

-------- ----- -
  ------ -
    --------
      -----
        --------
          ------ --------------
            ---------- --
          --------
          ------ ---------
            --------- --
          --------
        ---------
      ------
    ---------
  --
-

在这个示例代码中,我们首先引入了 BrowserRouter 组件做为 <Router> 的别名,并从 react-router-dom 库中引入了 SwitchRoute 组件。然后在 App 组件中,我们将整个应用程序包裹在一个 <Router> 组件中,并在其中使用了 <Switch><Route> 组件来设置路由规则和渲染 UI。

错误信息

当我们在某些情况下使用了 <Switch> 组件而没有包裹在一个 <Router> 中,就会出现以下错误信息:

这个错误信息的意思是:你不应该在 <Router> 外部使用 <Switch> 组件。原因是 <Switch> 组件是 React Router 提供的一种特殊组件,它只能在 <Router> 内部使用,否则会导致程序崩溃。

原因分析

为什么 <Switch> 组件必须放在 <Router> 内部呢?这是因为 React Router 是通过监听浏览器地址栏的 URL 变化来实现路由切换的。而 <Router> 组件就是负责监听 URL 变化并渲染相应的 UI 的组件。当我们使用 <Switch> 组件时,它会根据当前的 URL 匹配对应的 <Route> 组件并渲染它们的 UI。但如果把 <Switch> 放到 <Router> 外面,它就无法获取当前的 URL 信息,也就无法正确地匹配和渲染 <Route> 组件了。

解决方案

要解决这个错误,我们只需要确保 <Switch> 组件始终包裹在一个 <Router> 组件内部即可。

示例代码:

-- -------------------- ---- -------
------ - ------------- -- ------- ------- ----- - ---- -------------------

-------- ----- -
  ------ -
    --------
      -----
        --------
          ------ --------------
            ---------- --
          --------
          ------ ---------
            --------- --
          --------
        ---------
      ------
    ---------
  --
-

总结

在 React 前端开发中,使用 <Switch> 组件时一定要放在 <Router> 内部。否则会出现 Invariant Violation: You should not use <switch> outside a <router> 的错误信息。这个错误的原因是由于 <Switch> 组件需要获取当前 URL 信息来正确匹配和渲染 <Route> 组件。解决这个错误非常简单,只需要确保 <Switch> 组件

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60543c528d846479e750af15

纠错
反馈