【问题标题】:Routes React Router Dom路由 React Router Dom
【发布时间】:2021-12-31 17:53:17
【问题描述】:

我有这样的路线:

export enum routes {
  PROFILE_SETTINGS = "/settings/profile",
  ACCOUNT_SETTINGS = "/settings/account",
  PASSWORD_CHANGE = "/settings/account/password",
  ACCOUNT_DELETE = "/settings/account/delete",
  EMAIL_CHANGE = "/settings/account/email",
  USER_COMMENTS = "/profile/:user/comments",
  USER_PRODUCTS = "/profile/:user/products",
}
<BrowserRouter>
      <ThemeProvider theme={theme}>
        <CommunicatorTemplate>
          <MainTemplate>
            <Switch>
              <ProfileTemplate>
                <Route
                  exact
                  path={routes.USER_COMMENTS}
                  component={UserComments}
                />
                <Route
                  exact
                  path={routes.USER_PRODUCTS}
                  component={UserProducts}
                />
              </ProfileTemplate>
              <SettingsTemplate>
                <Route
                  exact
                  path={routes.PROFILE_SETTINGS}
                  component={ProfileSettings}
                />
                <Route
                  exact
                  path={routes.ACCOUNT_SETTINGS}
                  component={AccountSettings}
                />
                <Route
                  path={routes.PASSWORD_CHANGE}
                  component={PasswordChange}
                />
                <Route path={routes.EMAIL_CHANGE} component={EmailChange} />
                <Route path={routes.ACCOUNT_DELETE} component={AccountDelete} />
              </SettingsTemplate>
            </Switch>
          </MainTemplate>
        </CommunicatorTemplate>
      </ThemeProvider>
    </BrowserRouter>

问题是,当我转到任何以 /settings 开头的页面时,我会被重定向到 Profile 页面而不是 f.e. PROFILE_SETTINGSACCOUNT_SETTINGS。我认为问题出在/settings/profile,因为它也有/profile 部分,但我该如何解决?

【问题讨论】:

  • 尝试重现一个更简单的例子,这样更容易隔离问题
  • 能否请您添加其他代码来详细说明您的模板组件?并请提供路由器声明的应用程序的根目录。也许你的组件中有一个循环或类似的东西
  • 这是根。我不认为模板代码有用,因为就像:&lt;Wrapper&gt;{children}&lt;/Wrapper&gt;.
  • 我刚刚添加了整个根组件
  • 即使我从模板中删除路由,它也会将我重定向到配置文件模板

标签: javascript reactjs react-router react-router-dom


【解决方案1】:

问题在于,在 Switch 组件中,只有 RouteRedirect 组件是有效的子组件。回想一下,Switch 组件会渲染与位置匹配的第一个子 &lt;Route&gt;&lt;Redirect&gt;,但您已将路线包裹在 ProfileTemplateSettingsTemplate 中,因此,只有 ProfileTemplate是“匹配的”并呈现。包装器内的包装路线现在只是包含性匹配和渲染,就像 Switch 根本不存在一样。

将包装器包装在匹配的路由中,然后将路由包装在Switch 中,以便它们完全匹配。

<BrowserRouter>
  <ThemeProvider theme={theme}>
    <CommunicatorTemplate>
      <MainTemplate>
        <Switch>
          <Route path={[routes.USER_COMMENTS, routes.USER_PRODUCTS]}>
            <ProfileTemplate>
              <Switch>
                <Route
                  exact
                  path={routes.USER_COMMENTS}
                  component={UserComments}
                />
                <Route
                  exact
                  path={routes.USER_PRODUCTS}
                  component={UserProducts}
                />
              </Switch>
            </ProfileTemplate>
          </Route>
          <Route
            path={[
              routes.PROFILE_SETTINGS,
              routes.ACCOUNT_SETTINGS,
              routes.PASSWORD_CHANGE,
              routes.EMAIL_CHANGE,
              routes.ACCOUNT_DELETE
            ]}
          >
            <SettingsTemplate>
              <Switch>
                <Route
                  exact
                  path={routes.PROFILE_SETTINGS}
                  component={ProfileSettings}
                />
                <Route
                  exact
                  path={routes.ACCOUNT_SETTINGS}
                  component={AccountSettings}
                />
                <Route
                  path={routes.PASSWORD_CHANGE}
                  component={PasswordChange}
                />
                <Route path={routes.EMAIL_CHANGE} component={EmailChange} />
                <Route path={routes.ACCOUNT_DELETE} component={AccountDelete} />
              </Switch>
            </SettingsTemplate>
          </Route>
        </Switch>
      </MainTemplate>
    </CommunicatorTemplate>
  </ThemeProvider>
</BrowserRouter>

【讨论】:

    【解决方案2】:

    Route 中删除确切的内容。所以

    <Route
        path={routes.PROFILE_SETTINGS}
        component={ProfileSettings}
        />
    

    【讨论】:

    • 不是这样的。 /settings/profile返回我的个人资料网站
    猜你喜欢
    • 1970-01-01
    • 2018-01-28
    • 2019-05-30
    • 2018-06-08
    • 2018-06-04
    • 1970-01-01
    • 2022-10-16
    • 2022-07-07
    • 2021-11-03
    相关资源
    最近更新 更多