#reactjs #react-router #next.js #react-router-dom
#reactjs #реагировать-маршрутизатор #next.js #реагировать-маршрутизатор-dom
Вопрос:
Я создаю веб-сайт, и я хочу, чтобы пользователи были перенаправлены на определенную страницу, когда они открывают сайт. Страница, на которую они будут перенаправлены, зависит от того, вошли ли они уже в систему. Моя проблема в том, что маршрутизатор не работает (пользователь не перенаправляется ни на одну страницу), и все, что появляется, — это пустая страница. Я пытался избавиться от маршрутов, но, несмотря на это, я ничего не смог отобразить на индексной странице. Возможно, проблема даже не в маршрутизаторе, а в чем-то другом.
Я никогда не получаю никаких сообщений об ошибках. Вот те части кода, в которых, я думаю, может быть проблема.
_app.js:
import React from 'react'
import { BrowserRouter as Router, Route } from "react-router-dom"
import Novidades from './lancamento'
import SignUp from './signup'
import Croosa from './croosa'
import { AuthProvider } from '../utils/auth'
import PrivateRoute from '../utils/PrivateRoute'
const App = () => {
return(
<AuthProvider>
<Router>
<div>
<PrivateRoute exact path='/lancamento' component={Lancamento} />
<Route exact path='/croosa' component={Croosa}/>
<Route exact path='/signup' component={SignUp} />
</div>
</Router>
</AuthProvider>
)
}
export default App
index.js:
import React from 'react'
import App from './_app'
export default function Home() {
return(
<App/>
)
}
И тот PrivateRoute.js , который решает, на какую страницу будет перенаправлен пользователь:
import React, { useContext } from "react";
import { Route, Redirect } from "react-router-dom";
import { AuthContext } from "./auth";
const PrivateRoute = ({ component: RouteComponent, ...rest }) => {
const {currentUser} = useContext(AuthContext);
return (
<Route
{...rest}
render={routeProps =>
!!currentUser ? (
<RouteComponent {...routeProps} />
) : (
<Redirect to={"/signup"} />
)
}
/>
)
}
export default PrivateRoute
Я был бы признателен, если бы кто-нибудь указал на мои ошибки.
Ответ №1:
Next.js использует структуру маршрутизации на основе файловой системы.
У вас неправильное представление о том, как _app.js
работает файл. Это родительский компонент, который отвечает за визуализацию других компонентов, экспортируемых с других страниц.
Например: если мой _app.js
файл выглядит следующим образом:
export default function App({ Component, pageProps }) {
return (
<div>
<p>This was injected by _app.js</p>
<Component {...pageProps} />
<div>
);
}
и мой pages/index.js
файл выглядит так:
export default function Hello(){
return <h1>Hello World!</h1>
}
При такой настройке, если я посещу localhost:3000/
, то будет отображено следующее
<div>
<p>This was injected by _app.js</p>
<h1>Hello World!</h1>
</div>
Вместо этого вы сделали то, что в вашем _app.js
случае вы проигнорировали Component
переданное свойство, и поэтому на каждой странице, которую вы посещаете, будет отображаться одно и то же содержимое. То есть:
<AuthProvider>
<Router>
<div>
<PrivateRoute exact path="/lancamento" component={Lancamento} />
<Route exact path="/croosa" component={Croosa} />
<Route exact path="/signup" component={SignUp} />
</div>
</Router>
</AuthProvider>
Причина, по которой ваша индексная страница пуста, заключается в том, что вы не настроили маршрут для /
и поэтому ни один компонент не будет отображаться маршрутизатором react на этой странице. Несмотря на это, я предлагаю вам прекратить использование react router и начать использовать встроенную систему маршрутизации с next.js
Комментарии:
1. Спасибо! Я внес изменения, которые вы предложили, и все сработало отлично. Я посмотрю, буду ли я продолжать использовать маршруты в этом проекте. Если я так решу, на этот раз я обязательно использую next / router.