1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wengcd-react-start-kit-flux-demo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
how-to-implement-routing.md 4.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 15:51 af1ad34

Как реализовать маршрутизацию и навигацию

Шаг 1: Базовая маршрутизация

В своей простейшей форме маршрутизация выглядит как набор URL-адресов, где каждый URL сопоставляется с компонентом React:

// app.js
import React from 'react';
import Layout from './components/Layout';
import HomePage from './components/HomePage';
import AboutPage from './components/AboutPage';
import NotFoundPage from './components/NotFoundPage';
import ErrorPage from './components/ErrorPage';

const routes = {
  '/':      <Layout><HomePage /></Layout>,
  '/about': <Layout><AboutPage /></Layout>
};

const container = document.getElementById('app');

function render() {
  try {
    const path = window.location.hash.substr(1) || '/';
    const component = routes[path] || <NotFoundPage />;
    React.render(component, container);
  } catch (err) {
    React.render(<ErrorPage {...err} />, container);
  }
}

window.addEventListener('hashchange', () => render());
render();

Шаг 2: Асинхронные маршруты

Просто оберните компоненты React внутри ваших маршрутов в асинхронные функции:

import React from 'react';
import http from './core/http';
import Layout from './components/Layout';
import HomePage from './components/HomePage';
import AboutPage from './components/AboutPage';
import NotFoundPage from './components/NotFoundPage';
import ErrorPage from './components/ErrorPage';

const routes = {
  '/': async () => {
    const data = await http.get('/api/data/home');
    return <Layout><HomePage {...data} /></Layout>
  },
  '/about': async () => {
    const data = await http.get('/api/data/about');
    return <Layout><AboutPage {...data} /></Layout>;
  }
};

const container = document.getElementById('app');

async function render() {
  try {
    const path = window.language.location.hash.substr(1) || '/';
    const route = routes[path];
    const component = route ? await route() : <NotFoundPage />;
    React.render(component, container);
  } catch (err) {
    React.render(<ErrorPage {...err} />, container);
  }
}

window.addEventListener('hashchange', () => render());
render();

Шаг 3: Параметризованные маршруты

(1) Преобразуйте список маршрутов из хеш-таблицы в массив, таким образом порядок маршрутов будет сохранён. (2) Оберните эту коллекцию в класс Router, где вы можете поместить метод .match(url) async. (3) Используйте path-to-regexp, чтобы преобразовать строки пути Express-like в регулярные выражения, которые используются для сопоставления URL-путей с компонентами React.

import React from 'react';
import Router from 'react-routing/src/Router';
import http from './core/http';
import Layout from './components/Layout';
import ProductListing from './components/ProductListing';
import ProductInfo from './components/ProductInfo';
import NotFoundPage from './components/NotFoundPage';
import ErrorPage from './components/ErrorPage';

const router = new Router(on => {
  on('/products', async () => {
    const data = await http.get('/api/products');
    return <Layout><ProductListing {...data} /></Layout>
  });
  on('/products/:id', async (req) => {
    const data = await http.get(`/api/products/${req.params.id}`);
    return <Layout><ProductInfo {...data} /></Layout>;
  });
}]);

const container = document.getElementById('app');

async function render() {
  const state = { path: window.location.hash.substr(1) || '/' };
  await router.dispatch(state, component => {
    React.render(component, container);
  });
}

window.addEventListener('hashchange', () => render());
render();

Шаг 4. Обработка перенаправлений

Скоро появится. Оставайтесь с нами. tuned!

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wengcd-react-start-kit-flux-demo.git
git@api.gitlife.ru:oschina-mirror/wengcd-react-start-kit-flux-demo.git
oschina-mirror
wengcd-react-start-kit-flux-demo
wengcd-react-start-kit-flux-demo
master