Использование React Router с Switch и не может заставить страницу отображать различные компоненты при изменении маршрутов - PullRequest
0 голосов
/ 26 апреля 2019

Я создал приложение React, которое в конечном итоге будет динамически назначать маршруты на основе вызова API.Прямо сейчас у меня есть жестко закодированные компоненты, и я просто пытаюсь переключить вид страницы для просмотра каждого из них в зависимости от выбора навигации.Я установил свой Nav вне представления переключателя, чтобы он всегда отображался на странице, но когда я пытаюсь настроить WelcomePage на домашний маршрут, это единственное, что отображается на странице, и ничего не меняется даже при выборе другого компонента.страница из моей навигации.Любые предложения / идеи о том, почему это происходит и что я могу сделать, чтобы это исправить?

Код ниже

Main App Component

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

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
)

1 Ответ

1 голос
/ 26 апреля 2019

То, что я думаю, происходит потому, что вы определили маршрут Nav вне коммутатора и дали ему путь. Он всегда будет отображаться поверх всего остального, так как вы делаете путь обязательным и все равно удовлетворяете этот путь, когда переходите в другое место. Что вы можете сделать, это просто удалить маршрут все вместе для Nav и сделать это. Это заставит Nav появиться на вершине, несмотря ни на что, не прерывая вашу навигацию. Вы также, кажется, не импортировали BrowserRouter.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...