В этой серии руководств вы узнаете о response-router v4, который является стабильной версией, которая в настоящее время используется в большинстве проектов React.
Если вы не знаете, как реагировать, сначала прочтите Учебники по реагированию или
Вы можете проверить курсы с лучшими реакциями.
Оглавление
- Вступление
- Что такое реактивный роутер?
- Как установить реактивный роутер?
- Маршрутизация
- Добавить 404 страницы
- Что такое страница 404?
- Что такое переключатель
- Параметры URL
- Вложенные маршруты
- Программная навигация
Вступление
Что такое реактивный маршрутизатор?
Маршрутизатор React - это библиотека маршрутизации, построенная на основе react, которая используется для создания маршрутизации в приложениях React.
Реагирующий маршрутизатор статический или динамический?
- До реагирующего маршрутизатора v4 он статичен, после v4 он является динамическим.
В одностраничных приложениях есть только одна html-страница. Мы повторно используем одну и ту же html-страницу для визуализации различных компонентов на основе навигации.
Но в многостраничных приложениях вы получите совершенно новую страницу с сервера при навигации.
Если вы застряли где-то посередине, обратитесь к« репозиторию кода »
Начиная
Как установить реагирующий роутер?
мы используем приложение create-response-app для создания приложения.
npx create-react-app routing
cd routing
Чтобы установить реагирующий маршрутизатор, вам необходимо загрузить пакет response-router-dom, выполнив следующие команды.
npm install react-router-dom
npm start //to run dev server
Теперь откройте папку маршрутизации в вашем любимом редакторе кода.
Если вы перейдете к общедоступному / index.html, вы увидите один файл html, который выглядит следующим образом.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<link rel="manifest" href="%PUBLIC_URL%/manifest.json">
<link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
В настоящее время в нашем приложении есть только один компонент приложения.
Создадим еще два компонента.
users.js
import React from 'react'
class Users extends React.Component { render() { return <h1>Users</h1> } }
export default Users
contact.js
import React from 'react'
class Contact extends React.Component { render() { return <h1>Contact</h1> } }
export default Contact
app.js
import React from 'react' class App extends React.Component { render() { return ( <div> <h1>Home</h1> </div> ) } }
export default App
Теперь наше приложение состоит из трех компонентов: один - это приложение, а два других - это пользователи и контакт.
Маршрутизация
откройте файл index.js и импортируйте три компонента (приложение, пользователи, контакт)
index.js
import React from 'react' import ReactDOM from 'react-dom' import './index.css' import App from './App' import Users from './users' import Contact from './contact'
ReactDOM.render(<App />, document.getElementById('root'))
Маршрутизатор React предоставляет нам три компонента [Route, Link, BrowserRouter], которые помогают нам реализовать маршрутизацию.
index.js
import React from 'react' import ReactDOM from 'react-dom' import { Route, Link, BrowserRouter as Router } from 'react-router-dom' import './index.css' import App from './App' import Users from './users' import Contact from './contact'
ReactDOM.render(<App />, document.getElementById('root'))
Реализуем маршрутизацию.
В компоненте Route нам нужно передать два свойства
- path: значит, нам нужно указать путь.
- компонент: какой компонент должен видеть пользователь, когда он перейдет по этому пути.
import React from 'react' import ReactDOM from 'react-dom' import './index.css' import { Route, Link, BrowserRouter as Router } from 'react-router-dom' import App from './App' import Users from './users' import Contact from './contact'
const routing = ( <Router> <div> <Route path="/" component={App} /> <Route path="/users" component={Users} /> <Route path="/contact" component={Contact} /> </div> </Router> )
ReactDOM.render(routing, document.getElementById('root'))
Теперь, если вы введете вручную localhost: 3000 / users, вы увидите, что компонент «Пользователи» отображается.
Но, тем не менее, компонент Home также отображается на экране, это происходит из-за того, что наш домашний путь - '/', а путь пользователя - '/ users' слэш одинаков в обоих путях, поэтому оба компонента отображаются в Чтобы остановить это поведение, нам нужно использовать точную опору.
import React from 'react' import ReactDOM from 'react-dom' import './index.css' import { Route, Link, BrowserRouter as Router } from 'react-router-dom' import App from './App' import Users from './users' import Contact from './contact'
const routing = ( <Router> <div> <Route exact path="/" component={App} /> <Route path="/users" component={Users} /> <Route path="/contact" component={Contact} /> </div> </Router> )
ReactDOM.render(routing, document.getElementById('root'))
Теперь, если вы видите, что на экране отображается только пользовательский компонент.
Добавление навигации с помощью компонента "Ссылка"
index.js
import React from 'react' import ReactDOM from 'react-dom' import './index.css' import { Route, Link, BrowserRouter as Router } from 'react-router-dom' import App from './App' import Users from './users' import Contact from './contact'
const routing = ( <Router> <div> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/users">Users</Link> </li> <li> <Link to="/contact">Contact</Link> </li> </ul> <Route exact path="/" component={App} /> <Route path="/users" component={Users} /> <Route path="/contact" component={Contact} /> </div> </Router> )
ReactDOM.render(routing, document.getElementById('root'))
После добавления навигации вы увидите, что маршруты отображаются на экране. если вы нажмете на пользователей, вы увидите, что URL-адрес меняется, и отображается компонент «Пользователи».
Добавление 404 страницы
Что такое страница 404?
Страница 404 также называется не найденной страницей. Это означает, что когда пользователь переходит по неправильному пути, которого нет на веб-сайте, нам нужно показать не найденную страницу.
Как добавить страницу 404 в React?
нам нужно импортировать другой компонент под названием Switch, который предоставляется реагирующим маршрутизатором.
Что такое Switch?
Компонент Switch помогает нам отображать компоненты только тогда, когда путь совпадает, в противном случае он возвращается к ненайденному компоненту.
давайте создадим компонент Not found.
notfound.js
import React from 'react'
const Notfound = () => <h1>Not found</h1>
export default Notfound
index.js
import React from 'react' import ReactDOM from 'react-dom' import './index.css' import { Route, Link, BrowserRouter as Router, Switch } from 'react-router-dom' import App from './App' import Users from './users' import Contact from './contact' import Notfound from './notfound'
const routing = ( <Router> <div> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/users">Users</Link> </li> <li> <Link to="/contact">Contact</Link> </li> </ul> <Switch> <Route exact path="/" component={App} /> <Route path="/users" component={Users} /> <Route path="/contact" component={Contact} /> <Route component={Notfound} /> </Switch> </div> </Router> )
ReactDOM.render(routing, document.getElementById('root'))
Давайте проверим это сейчас, введя неверный путь вручную localhost: 3000 / posts.
Параметры URL
Параметры URL-адреса помогают нам отображать один и тот же компонент на основе его динамического URL-адреса, как в нашем компоненте «Пользователи», предполагающем, что это разные пользователи с идентификаторами 1,2,3.
<Route path="users/:id" component={Users} />
index.js
import React from 'react' import ReactDOM from 'react-dom' import './index.css' import { Route, Link, BrowserRouter as Router, Switch } from 'react-router-dom' import App from './App' import Users from './users' import Contact from './contact' import Notfound from './notfound'
const routing = ( <Router> <div> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/users">Users</Link> </li> <li> <Link to="/contact">Contact</Link> </li> </ul> <Switch> <Route exact path="/" component={App} /> <Route path="/users/:id" component={Users} /> <Route path="/contact" component={Contact} /> <Route component={Notfound} /> </Switch> </div> </Router> )
ReactDOM.render(routing, document.getElementById('root'))
Откройте файл users.js и добавьте console.log (this.props).
users.js
import React from 'react'
class Users extends React.Component { render() { console.log(this.props) return <h1>Users</h1> } }
export default Users
Теперь откройте свой браузер и вручную введите этот URL-адрес localhost: 3000 / users / 1, вы увидите объект в вашей консоли, который передается маршрутизатором реакции.
Вы видели объект params с идентификатором 1, который мы передали в url localhost: 3000 / users / 1.
Давайте отобразим этот идентификатор 1 на экране.
users.js
import React from 'react'
class Users extends React.Component { render() { const { params } = this.props.match return ( <div> <h1>Users</h1> <p>{params.id}</p> </div> ) } }
export default Users
Вы видели, что сейчас на экране рендерится 1?
Вложенные маршруты
Вложенная маршрутизация помогает нам отображать суб-маршруты, такие как users / 1, users / 2 и т. Д.
index.js
import React from 'react' import ReactDOM from 'react-dom' import './index.css' import { Route, Link, BrowserRouter as Router, Switch } from 'react-router-dom' import App from './App' import Users from './users' import Contact from './contact' import Notfound from './notfound'
const routing = ( <Router> <div> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/users">Users</Link> </li> <li> <Link to="/contact">Contact</Link> </li> </ul> <hr /> <Switch> <Route exact path="/" component={App} /> <Route exact path="/users" component={Users} /> <Route path="/contact" component={Contact} /> <Route component={Notfound} /> </Switch> </div> </Router> ) ReactDOM.render(routing, document.getElementById('root'))
Как реализовать вложенную маршрутизацию?
В файле users.js нам нужно импортировать компоненты реагирующего маршрутизатора, потому что нам нужно реализовать подмаршруты внутри компонента Users.
users.js
import React from 'react' import { Route, Link } from 'react-router-dom'
const User = ({ match }) => <p>{match.params.id}</p>
class Users extends React.Component { render() { const { url } = this.props.match return ( <div> <h1>Users</h1> <strong>select a user</strong> <ul> <li> <Link to="/users/1">User 1 </Link> </li> <li> <Link to="/users/2">User 2 </Link> </li> <li> <Link to="/users/3">User 3 </Link> </li> </ul> <Route path="/users/:id" component={User} /> </div> ) } }
export default Users
активные стили с помощью NavLink
NavLink
Он используется для стилизации активных маршрутов, чтобы пользователь знал, какую страницу он или она в данный момент просматривает на веб-сайте.
В чем разница между NavLink и Link?
Ссылка используется для навигации по различным маршрутам на сайте. Но NavLink используется для добавления атрибутов стиля к активным маршрутам.
В нашем приложении маршрутизации у нас есть три маршрута: [home, / users, / contact]. Давайте стилизуем их с помощью NavLink.
Нам нужно добавить новую опору с именем activeClassName к компоненту NavLink, чтобы он применял этот класс всякий раз, когда маршрут активен.
добавьте эти стили в файл index.css
index.css
body { margin: 0; padding: 2rem; font-family: sans-serif; } .active{ color:red; }
index.js
import React from 'react' import ReactDOM from 'react-dom' import './index.css' import { Route, NavLink, BrowserRouter as Router, Switch, } from 'react-router-dom' import App from './App' import Users from './users' import Contact from './contact' import Notfound from './notfound'
const routing = ( <Router> <div> <ul> <li> <NavLink exact activeClassName="active" to="/"> Home </NavLink> </li> <li> <NavLink activeClassName="active" to="/users"> Users </NavLink> </li> <li> <NavLink activeClassName="active" to="/contact"> Contact </NavLink> </li> </ul> <hr /> <Switch> <Route exact path="/" component={App} /> <Route path="/users" component={Users} /> <Route path="/contact" component={Contact} /> <Route component={Notfound} /> </Switch> </div> </Router> )
ReactDOM.render(routing, document.getElementById('root'))
Теперь вы можете видеть, что к активным маршрутам применен красный цвет.
Программная навигация
Что такое программная навигация?
Это означает, что нам нужно перенаправить пользователя, когда на этом маршруте происходит событие.
Например, когда пользователь успешно вошел в систему, он или она будет перенаправлен на домашнюю страницу.
Как программно перемещаться в реактивном маршрутизаторе?
Для программной навигации нам нужно воспользоваться помощью объекта истории, который передается маршрутизатором реакции.
Давайте добавим контактную форму в наш компонент "Контакты".
В объекте истории доступен метод push, с помощью которого мы перенаправляем пользователя на домашнюю страницу всякий раз, когда пользователь отправляет форму.
contact.js
import React from 'react'
class Contact extends React.Component { onSubmit = () => { this.props.history.push('/') }
render() { return ( <form> <input placeholder="name" type="name" /> <input placeholder="email" type="email" /> <button onClick={this.onSubmit}>Submit</button> </form> ) } }
export default Contact
изначально опубликовано на reactgo.com
Другие уроки
- Как получить данные из API в Redux с помощью Redux-thunk
- Учебник по функции React redux connect
- Как объединить редукторы в redux с помощью функции combReducer
Оформить заказ на мое расширение для Chrome Html Scan, чтобы мгновенно копировать текст или код одним щелчком мыши.
✉️ Подпишитесь на рассылку еженедельно Email Blast 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ Дорожная карта веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .