При создании одностраничного приложения маршрутизация является неотъемлемой частью опыта. При разработке приложения вам нужен хороший и понятный способ контролировать маршруты.
Изменения происходят, и изменение маршрута должно происходить в одном месте кода, а затем использоваться повсюду. Если это не сделано должным образом, внесение изменений в маршрут может повлиять на время разработки и доверие разработчиков.
Сначала вы должны найти свои маршруты
Хороший способ начать — решить, какие страницы будут иметь ваше одностраничное приложение, а затем создать константу для каждой из них. Затем решите, есть ли какие-либо действия на этих страницах, и создайте константу для каждого из них. Если вы создаете простое приложение со списком продуктов, у вас могут быть следующие маршруты/страницы:
/ /auth/login /auth/register /auth/forgot-password /products /products/create /products/:id /products/:id/update /products/:id/delete
Из маршрутов выше видно, что есть две основные страницы (auth и products) и шесть уникальных действий на этих страницах (login, зарегистрироваться, забыли пароль, создать, обновить и удалить).
Определение ваших маршрутов
Теперь, когда вы знаете страницы и действия для ваших маршрутов, вы можете определить их, сначала создав константу для каждой страницы и действия:
/routes.js
const AUTH = 'auth'; const PRODUCTS = 'products': const ROOT = '/'; const CREATE = 'create'; const DELETE = 'delete'; const FORGOT_PASSWORD = 'forgot-password'; const LOGIN = 'login'; const REGISTER = 'register'; const UPDATE = 'update';
Вторая часть вашего определения маршрута — это добавление способа соединения вышеперечисленных частей вместе. Вы можете создать этот удобный маленький метод join
, чтобы соединить части вместе:
/routes.js
const join = (...parts) => `${ROOT}${parts.join('/')}`;
Этот удобный маленький метод добавит все переменные, которые вы ему передадите, и разделит их косой чертой (/).
Теперь, когда все элементы на месте, вы можете определить метод для каждого маршрута. Некоторые из этих методов будут иметь значения по умолчанию, определенные для простоты использования, которые вы увидите чуть позже в этой истории.
/routes.js
export const forgotPassword = () => join(AUTH, FORGOT_PASSWORD); export const login = () => join(AUTH, LOGIN); export const register = () => join(AUTH, REGISTER); export const products = () => join(PRODUCTS); export const productsCreate = () => join(PRODUCTS, CREATE); export const productsDelete = (productId = ':productId') => join(PRODUCTS, productId, DELETE); export const productsRead = (productId = ':productId') => join(PRODUCTS, productId); export const productsUpdate = (productId = ':productId') => join(PRODUCTS, productId, UPDATE);
Использование
Все ваши маршруты определены, теперь пришло время их использовать. В следующих примерах react-router
будет использоваться в качестве основной библиотеки маршрутизации, но вы можете использовать ее с любой библиотекой маршрутизации по вашему выбору.
Во-первых, вам нужно определить маршрутизатор:
/router.jsx
import { Route, Switch } from ‘react-router’; // import components here import { forgotPassword, login, register, products, productsCreate, productsDelete, productsRead, productsUpdate, } from 'routes'; export default () => ( <Switch> <Route component={Forgot} exact path={forgotPassword()} /> <Route component={Login} exact path={login()} /> <Route component={Register} exact path={register()} /> <Route component={Products} exact path={products()} /> <Route component={Create} exact path={productsCreate()} /> <Route component={Delete} exact path={productsDelete()} /> <Route component={Product} exact path={productsRead()} /> <Route component={Update} exact path={productsUpdate()} /> </Switch> );
В маршрутах для productsDelete
, productsRead
и productsUpdate
идентификатор запрашиваемого продукта будет автоматически заменен на :productId
, чтобы ваш маршрутизатор знал, что нужно передать параметр.
Теперь вы можете создавать ссылки на свои компоненты, используя те же маршруты, которые определены в вашем файле routes.js
. В приведенном ниже примере создается простая страница со списком некоторых продуктов.
/products.jsx
import PropTypes from 'prop-types'; import React from 'react'; import { Link } from 'react-router-dom'; import { productsDelete, productsRead, productsUpdate, } from 'routes'; const Products = ({ products }) => ( <div> {products.map(product => ( <div> <Link to={productsRead(product.id)}>{product.name}</Link> <br /> <Link to={productsDelete(product.id)}>Delete</Link> <br /> <Link to={productsUpdate(product.id)}>Update</Link> </div> ))} </div> ); Products.propTypes = { products: PropTypes.arrayOf(PropTypes.shape({ id: PropTypes.number.isRequired, name: PropTypes.string.isRequired, })).isRequired, }; export default Products;
В заключении
При таком способе определения маршрутов вы можете изменять имена маршрутов и быть уверенными, что изменение в одном местоположении будет должным образом каскадно распространяться по всему вашему приложению, и вам не нужно запускать поиск и замену, надеясь, что вы нашли все местоположения. где изменение должно произойти.