Автор оригинала: FreeCodeCamp Community Member.
Константин Таркус
Если вам произошло с помощью библиотеки Facebook Review.js некоторое время, вы можете заметить несколько заблуждений, плавающих в сообществе React. Одним из них является утверждение, которое реагирует только V от архитектуры MVC и должен быть смешан с кучей других библиотек, прежде чем он может быть использован в качестве рамки для разработки веб-приложений.
На практике вы редко видите разработчик реагирования с использованием контроллеров и моделей из MVC. Архитектура пользовательского интерфейса на основе компонентов стабильно захватывает в предельном сообществе и меньше и меньше людей используют модель MVC в настоящее время.
Другое неправильное представление в том, что библиотека React Router (RR) является официальным решением маршрутизации из Facebook. На самом деле большинство проектов на Facebook даже не используют его.
Говоря о маршрутизации, большие множественные проекты веб-приложений и использование случаев использования могут сделать довольно хорошо с крошечным пользованным маршрутизатором. Прежде чем классифицировать это понятие в качестве полной ереси, пожалуйста, позвольте мне показать вам, как реализовать полнофункциональный раствор маршрутизации с 50 линиями кода.
Навигация
Прежде всего, не нужно объединять маршрутизацию и навигацию по бокам клиента в том же компоненте, что и в RR. Таким образом, ваш маршрутизатор можно по-настоящему универсально – работать точно так же, с тем же API как в средах клиента, так и в сервере. Существует отличный модуль NPM под названием История Это может обрабатывать часть навигации (FYI, это своего рода обертка для HTML5 истории API и также используется внутри RR). Вы просто создаете файл history.js в вашем проекте, где вы инициализируете этот компонент (класс) и используете его как Singleton в вашем приложении:
import createHistory from 'history/lib/createBrowserHistory';import useQueries from 'history/lib/useQueries';
export default useQueries(createHistory)();
Отныне вы можете просто ссылаться на этот файл и вызовите историю. PUSH (‘/New-Page’) Всякий раз, когда вам нужно перенаправить пользователя в новое местоположение (URL) без обновления всей страницы. В главном файле приложения (код Bootstrap) вы можете подписаться на все изменения URL следующим образом:
import history from './history';
function render(location) { /* Render React app, read on */ }
render(history.getCurrentLocation()); // render the current URLhistory.listen(render); // render subsequent URLs
Компонент React со ссылками, работающими на стороне связи, может выглядеть следующим образом:
import React from 'react';import history from '../history';
class App extends React.Component {
transition = event => { event.preventDefault(); history.push({ pathname: event.currentTarget.pathname, search: event.currentTarget.search }); };
}
Хотя на практике вы можете захотеть извлечь этот «переходный» функциональность в автономный реактивный компонент. См. Ссылка Компонент в Реагирование статической котельной (RSB). Таким образом, вы можете написать на стороне клиента только ссылки, такие как это: <Ссылка> Нажмите .
Необходимо отобразить сообщение подтверждения перед тем, как пользователь покинет страницу? Просто зарегистрируйте History.listenbefore (..) Обработчик событий в методе компонента ComponentDIDMount (), как описано в модуле истории Документы Отказ Тот же подход может быть использован для анимации переходов между страницами ( Demo ).
Маршрутизация
Вы можете описать список маршрутов и каждого маршрута, в частности через объекты простых JavaScript, не нужно использовать JSX здесь. Например:
const routes = [ { path: '/', action: () =>}, { path: '/tasks', action: () => }, { path: '/tasks/:id', action: () => }];
Кстати, если кто-то знает, почему так много людей предпочитают использовать JSX для чего-то, не связанного с рендерингом пользовательского интерфейса, пожалуйста, оставьте комментарий.
Вы можете написать обработчики маршрута, используя синтаксис ES2015 + Async/a enax, нет необходимости использовать обратные вызовы, как это сделано в RR. Например:
{ path: '/tasks/:id(\\d+)', async action({ params }) { const resp = await fetch(`/api/tasks/${params.id}`); const data = await resp.json(); return data &&; }}
В большинстве случаев использования я знаком, нет необходимости в использовании вложенных маршрутов, как это сделано в RR. Использование вложенных маршрутов делает вещи более сложными, чем они должны быть и приводят к чрезмерно сложному сложному осуществлению маршрутизации Hariy, которое сложнее поддерживать. Насколько я знаю, даже на Facebook они не используют вложенные маршруты на клиенте, учитывая масштаб их приложений (по крайней мере, не во всех их проектах).
Вместо того, чтобы вставать маршруты, вы можете гнездиться комментариями React, например:
import React from 'react';import Layout from '../components/Layout';
class AboutPage extends React.Component { render() { return (); }} Welcome!
Here your can learn more about our product.
export default AboutPage;
Этот подход – это способ проще в реализации, чем вложенные маршруты, и в то же время более гибкие, интуитивно понятные и разблокируют больше случаев использования (обратите внимание, как вы можете пройти компонент сусальных курман в макет).
Сам маршрутизатор может быть записан как пара двух функций – CATTURI (), внутренняя (частная) функция, которая помогает сравнить параметризованную строку пути с фактическим URL; и разрешать () функцию, которая проходит список маршрутов, находит маршрут, который соответствует данному расположению, выполняет функцию обработчика маршрута и возвращает результат к абонеру. Вот как это может выглядеть (Router.js):
import toRegex from 'path-to-regexp';
function matchURI(path, uri) { const keys = []; const pattern = toRegex(path, keys); // TODO: Use caching const match = pattern.exec(uri); if (!match) return null; const params = Object.create(null); for (let i = 1; i < match.length; i++) { params[keys[i - 1].name] = match[i] !== undefined ? match[i] : undefined; } return params;}
async function resolve(routes, context) { for (const route of routes) { const uri = context.error ? '/error' : context.pathname; const params = matchURI(route.path, uri); if (!params) continue; const result = await route.action({ ...context, params }); if (result) return result; } const error = new Error('Not found'); error.status = 404; throw error;}
export default { resolve };
Проверьте документацию к Путь к регессу библиотека. Эта библиотека потрясающая! Например, вы можете использовать одну и ту же библиотеку для преобразования строк параметризованных путей в URL-адреса:
const toUrlPath = pathToRegexp.compile('/tasks/:id(\\d+)')toUrlPath({ id: 123 }) //=> "/user/123"toUrlPath({ id: 'abc' }) /=> error, doesn't match the \d+ constraint
Теперь вы можете обновить основной файл приложения (точка входа), чтобы использовать этот маршрутизатор:
import ReactDOM from 'react-dom';import history from './history';import router from './router';import routes from './routes';
const container = document.getElementById('root');
function renderComponent(component) { ReactDOM.render(component, container);}
function render(location) { router.resolve(routes, location) .then(renderComponent) .catch(error => router.resolve(routes, { ...location, error }) .then(renderComponent));}
render(history.getCurrentLocation()); // render the current URLhistory.listen(render); // render subsequent URLs
Вот и все! Вы также можете проверить мои проекты React Boaterplate, которые составляют этот подход маршрутизации:
Универсальный маршрутизатор – Простое решение для маршрутизации стиля промежуточного программного обеспечения Ract apart kit – Изоморфная веб-приложение Boeterplate (Node.js, graphql, ract) Реагирование статической котельной – Бесплатное веб-приложение (React, Redux, Firebase) ASP.NET Core Starter Kit – одностраничное приложение (ASP.NET CORE, C #, RECT)
Эти котельные довольно популярны и успешно используются во многих реальных проектах по всему миру. Определенно стоит проверить:)
Снимание : Вентилятор декларативных маршрутов? Найти декларативный аромат этого подхода маршрутизации и G t; H ERE <. Просмотрите комментарии к этой статье on & g t; Reddit <.
Следующий : Возможно, вам не понадобится React Router – часть 2 (скоро)