首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将React Router与开关一起使用,并且在更改路由时无法让页面呈现不同的组件

将React Router与开关一起使用,并且在更改路由时无法让页面呈现不同的组件
EN

Stack Overflow用户
提问于 2019-04-27 02:48:01
回答 1查看 232关注 0票数 0

我创建了一个React应用程序,它最终将根据API调用动态分配路由。现在我有了硬编码的组件,我只是尝试切换页面视图,以根据导航选择来查看每个组件。我在切换视图之外设置了导航,以便它总是在页面上呈现,但当我尝试将WelcomePage设置为主路由时,它是唯一在页面上呈现的东西,即使我从导航中选择另一个组件页面,也不会发生任何变化。关于为什么会发生这种情况以及我可以做些什么来修复它,有什么建议/想法吗?

下面的代码

Main App Component

代码语言:javascript
复制
import React from 'react'
import { Route, Redirect, Switch } from 'react-router-dom'
import ApplicationPage from './pages/ApplicationPage'
import FrameworkPage from './pages/FrameworkPage'
import WelcomePage from './pages/WelcomePage'
import Nav from './components/Nav'

const App = () => (
  <>
    <Route path={['/app/:appId', '/']} component={Nav} />
    <Switch>
    <Route path={['/app/:appId', '/']} component={WelcomePage} />
    <Route path={['/app', '/Framework']} component={FrameworkPage} />
      <Route
        path={['/app/:appId/setting/:settingKey', '/app/:appId', '/app']}
        component={ApplicationPage}
      />
      <Redirect to="/app/foo" />

    </Switch>

  </>
)

export default App

Nav Component

代码语言:javascript
复制
import React from 'react'
import styled from 'styled-components'
import { useAppState } from '../store'

const Nav = ({ match, history }) => {
  const [appState] = useAppState()

  return (
    <StyledNav>
      <h1>Title of Page</h1>
      <select
        defaultValue={match.params.appId}
        onChange={({ target }) => history.replace(`/app/${target.value}`)}
      >
        <option>Choose App</option>
        {appState.apps.map(opt => (
          <option key={opt}>{opt}</option>
        ))}
      </select>
    </StyledNav>
  )
}

const StyledNav = styled.nav`
  padding: 20px 10px;
  background: black;
  color: white;

  h1 {
    margin: 0;
  }
`

export default React.memo(
  Nav,
  (prevProps, nextProps) =>
    prevProps.match.params.appId === nextProps.match.params.appId
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-27 02:58:33

因此,我认为由于您在交换机外部定义了导航路由并为其提供了路径,因此正在发生的事情。它最终将始终呈现在其他所有内容之上,因为您将路径作为一个要求,并且无论何时导航到其他地方,它仍然满足该路径。你能做的就是移除所有的导航路线,然后这样做。这将使导航器在任何情况下都显示在顶部,而不会中断您的导航。您似乎也没有导入BrowserRouter。

代码语言:javascript
复制
import React from 'react'
import { BrowserRouter, Route, Redirect, Switch } from 'react-router-dom'
import ApplicationPage from './pages/ApplicationPage'
import FrameworkPage from './pages/FrameworkPage'
import WelcomePage from './pages/WelcomePage'
import Nav from './components/Nav'

const App = () => (
  <BrowserRouter>
    <div>
       <Nav/>
       <Switch>
          <Route path={['/app/:appId', '/']} component={WelcomePage} />
          <Route path={['/app', '/Framework']} component={FrameworkPage} />
          <Route
        path={['/app/:appId/setting/:settingKey', '/app/:appId', '/app']}
        component={ApplicationPage}
      />
          <Redirect to="/app/foo" />

       </Switch>
    </div>
  <BrowserRouter/>
)

export default App
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55873407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档