마이클 사전 트에 의해

라우팅 라이브러리는 복잡한 단일 페이지 응용 프로그램의 핵심 구성 요소입니다. 당신이 반응 및 돌아 오는와 웹 응용 프로그램을 개발하는 경우,당신은 아마 사용,또는 적어도 라우터 반응 들었습니다. 그것은 반응에 대한 잘 알려진 라우팅 라이브러리,많은 사용 사례에 대한 훌륭한 솔루션입니다.

그러나 반응 라우터가 반응/돌아 오는 생태계에서 유일하게 실행 가능한 솔루션은 아닙니다. 사실,반응 및 돌아 오기를 위해 구축 된 라우팅 솔루션의 톤이있다,서로 다른 아피스,기능 및 목표와 각—그리고 목록은 성장하고있다. 말할 필요도없이 클라이언트 측 라우팅은 곧 사라지지 않으며 내일의 라우팅 라이브러리에 디자인을위한 많은 공간이 여전히 있습니다.

오늘,나는 돌아 오는 라우팅의 주제에 관심을 가지고 싶어. 나는 돌아 오는 첫 번째 라우팅에 대한 사례를 제시하고 만들 것입니다.이 패러다임은 라우팅 모델의 스타와 많은 돌아 오는 라우팅 솔루션 중 공통 스레드를 만드는 패러다임입니다. 리액트 및 기타 프런트엔드 프레임워크를 사용하여 실제 사용에 대한 옵션을 탐색하기 전에 100 줄의 코드 아래에 핵심 프레임워크와 무관한 핵심 프레임워크를 구성하는 방법을 보여드리겠습니다.

약간의 역사

브라우저에서 위치(주소 정보)와 세션 기록(현재 브라우저 탭에서 방문한 위치 스택)이 전역window개체에 저장됩니다. 그들은 다음을 통해 접근 할 수 있습니다:

  • window.location (위치)
  • window.history (2015 년 11 월 1 일

기록 탐색 방법은 다음과 같습니다.:

  • pushState(href) — 새 위치를 기록 스택에 푸시합니다
  • replaceState(href) — 스택의 현재 위치를 덮어씁니다
  • back() — 스택의 이전 위치로 이동합니다
  • forward() — 스택의 다음 위치로 이동합니다
  • go(index) — 어느 방향으로든 스택의 위치로 이동합니다.

역사와 위치는 함께 푸시스테이트 라우팅이라는 현대적인 클라이언트 측 라우팅 패러다임을 가능하게 합니다.

이제history과 같은 현대적인 래퍼 라이브러리를 언급하지 않고 역사와 위치를 언급하는 것은 거의 범죄입니다.

리액트레이닝/이력
세션 이력 관리 JavaScriptgithub.com

history은 브라우저 기록 및 위치와 인터페이스하는 동시에 다른 브라우저 구현 간의 불일치를 다루는 간단하면서도 강력한 인터페이스를 제공합니다. 그것은 많은 현대 라우팅 라이브러리에서 피어 또는 내부 종속성으로 사용되며,이 기사 전체에서 여러 참조를 만들 것입니다.

돌아 오는 및 푸시 스테이트 라우팅

우리 이야기의 두 번째 주인공은 돌아 오는 것입니다. 그것은 2017 년,그래서 나는 당신에게 소개를 아끼지 및 지점에 바로 얻을 것이다:

돌아 오는 응용 프로그램에서 일반 푸시 스테이트 라우팅을 사용하여,우리는 두 개의 도메인에 걸쳐 응용 프로그램 상태를 분할:브라우저 기록 및 돌아 오는 저장소.

다음은history을 인스턴스화하고 래핑하는 반응 라우터의 모습입니다.:

history → React Router ↘ view Redux ↗

이제 모든 데이터가 저장소에 상주해야하는 것은 아닙니다. 예를 들어 로컬 구성 요소 상태는 종종 단일 구성 요소와 관련된 데이터를 저장하기에 적합한 장소입니다.

하지만 위치 데이터는 사소한 것이 아닙니다. 응용 프로그램 상태의 역동적이고 중요한 부분인 저장소에 속한 데이터 종류입니다. 상점에 보관하면 시간 여행 디버깅과 같은 사치품과 상점에 연결된 구성 요소에서 쉽게 액세스 할 수 있습니다.

그럼 어떻게 매장 위치를 이동합니까?

브라우저가window에서 기록 및 위치 정보를 읽고 저장한다는 사실을 해결할 수는 없지만 위치 데이터의 복사본을 저장소에 보관하고 브라우저와 동기화 상태로 유지할 수 있습니다.

react-router-redux이 반응 라우터에 대해 무엇을합니까?

예,하지만 돌아 오는 개발자 도구의 시간 이동 기능을 사용하려면. 응용 프로그램은 여전히 반응 라우터에서 개최 위치 데이터에 따라 달라집니다:

history → React Router ↘ ↕ view Redux ↗

react-router-redux를 사용하여 리액트 라우터 대신 저장소에서 위치 데이터를 읽는 것은 권장하지 않습니다(잠재적으로 충돌하는 출처로 인해).

우리는 더 잘 할 수 있습니까?

우리는 대체 라우팅 모델을 구축 할 수 있습니다—우리가 읽고 위치를 돌아 오는 방법을 업데이트 할 수 있도록,돌아 오는 잘 재생 처음부터 구축 한—와store.getState()store.dispatch()?

우리는 절대적으로 할 수 있으며 돌아 오는 첫 번째 라우팅이라고합니다.

돌아 오는 첫 번째 라우팅

돌아 오는 첫 번째 라우팅은 라우팅 모델의 스타 돌아 오는 만드는 푸시 스테이트 라우팅에 변형입니다.

돌아 오는 첫 번째 라우팅 솔루션은 다음 기준을 충족합니다:

  • 위치는 돌아 오는 가게에서 개최됩니다.
  • 위치는 돌아 오는 작업을 파견하여 변경됩니다.
  • 애플리케이션은 저장소에서만 위치 데이터를 읽습니다.
  • 저장 및 브라우저 기록은 장면 뒤에서 동기화됩니다.

여기 그것이 어떻게 생겼는지에 대한 기본 아이디어가 있습니다:

history ↕ Redux → router → view

잠깐,위치 데이터 소스가 두 개 있지 않습니까?

예,하지만 우리는 브라우저 기록과 돌아 오는 저장소가 동기화 된 것을 신뢰할 수있는 경우,우리는 이제까지 저장소에서 위치 데이터를 읽을 우리의 응용 프로그램을 구축 할 수 있습니다. 그런 다음 응용 프로그램의 관점에서 볼 때 하나의 진실 소스 만 있습니다.

돌아 오는 첫 번째 라우팅을 어떻게 수행합니까?

우리는 클라이언트 측 라우팅 및 돌아 오는 데이터 라이프 사이클 모델의 기본 요소를 병합하여,개념적 모델을 만들어 시작할 수 있습니다.

클라이언트측 라우팅 모델 재방문

클라이언트 측 라우팅은 탐색에서 시작하여 렌더링으로 끝나는 다단계 프로세스입니다.라우팅 자체는 해당 프로세스의 한 단계 일뿐입니다! 의 세부 사항을 검토 할 수 있습니다:

  • 탐색-모든 위치의 변화로 시작합니다. 탐색에는 내부 및 외부의 두 가지 유형이 있습니다. 내부 탐색은 응용 프로그램 내에서 수행(예를 들어. 사용자가 브라우저의 탐색 모음과 상호 작용하거나 외부 사이트에서 응용 프로그램을 입력 할 때 외부 탐색이 발생합니다.
  • 탐색에 응답-위치가 변경되면 응용 프로그램이 새 위치를 라우터에 전달하여 응답합니다. 이전 라우팅 기술은이 작업을 수행하기 위해 폴링window.location에 의존했지만 요즘에는 편리한history.listen유틸리티가 있습니다.
  • 라우팅-다음으로 새 위치가 해당 페이지 내용과 일치합니다. 이 단계를 처리하는 코드를 라우터라고하며 일반적으로 경로 구성이라는 일치하는 경로 및 페이지의 입력 매개 변수를 사용합니다.
  • 렌더링-마지막으로 콘텐츠가 클라이언트에서 렌더링됩니다. 이 단계는 물론 반응과 같은 프런트 엔드 프레임 워크/라이브러리에 의해 처리 될 수 있습니다.

라우팅 라이브러리가 라우팅 모델의 모든 부분을 처리할 필요는 없습니다.

반응 라우터 및 뷰 라우터와 같은 일부 라이브러리는 범용 라우터와 같은 단일 측면(라우팅과 같은)에만 관심을 가지므로 다른 측면에서 유연성을 제공합니다:

라우팅 라이브러리는 다른 책임 범위를 가질 수 있습니다. (확대하려면 클릭)

돌아 오는 데이터 수명주기 모델 재 방문

돌아 오는 가능성이 소개를 필요로하지 않는 단방향 데이터 흐름/라이프 사이클 모델을 자랑-하지만 여기에 좋은 측정에 대한 간략한 개요입니다:

  • 작업-상태 변경은 반환 작업(type및 선택적 페이로드를 포함하는 일반 객체)을 디스패치하여 시작됩니다.
  • 미들웨어-동작은 스토어의 미들웨어 체인을 통과하며,여기서 동작은 가로채고 추가 동작이 실행될 수 있습니다. 미들웨어는 일반적으로 돌아 오는 응용 프로그램에서 부작용을 처리하는 데 사용됩니다.
  • 감속기-그러면 액션이 루트 감속기에 도달하여 저장소의 다음 상태를 이전 상태 및 수신 된 액션의 순수 함수로 계산합니다. 루트 감속기는 각 저장소의 상태 조각을 처리하는 개별 감속기로 구성 될 수 있습니다.
  • 새 상태-저장소는 감속기에 의해 반환 된 새 상태를 저장하고 구독자에게 변경 사항을 알립니다(반응에서connect를 통해).
  • 렌더링-마지막으로 저장소에 연결된 뷰가 새 상태에 따라 다시 렌더링될 수 있습니다.

돌아 오는 첫 번째 라우팅 모델 작성

클라이언트 측 라우팅 및 돌아 오는 데이터 수명주기 모델의 단방향 특성은 우리가 돌아 오는 첫 번째 라우팅에 대해 배치 기준을 충족하는 병합 된 모델에 잘 빌려.

이 모델에서는 라우터가 스토어에 등록되고 탐색은 돌아 오는 작업을 통해 수행되며 브라우저 기록에 대한 업데이트는 사용자 정의 미들웨어에 의해 처리됩니다. 이 모델의 세부 사항을 살펴 보겠습니다:내부 탐색—히스토리 탐색 방법을 미러링하는 5 가지 내비게이션 작업 중 하나를 디스패치하여 내부 탐색이 이루어집니다.

  • 미들웨어를 통한 브라우저 기록 업데이트-미들웨어는 탐색 동작을 가로채고 브라우저 기록 업데이트의 부작용을 처리하는 데 사용됩니다. 새 위치가 반드시 또는 쉽게 먼저 브라우저 기록을 참조하지 않고 알려져 있지 않기 때문에(예를 들어. go동작의 경우,탐색 동작이 감속기에 도달하는 것을 방지한다.
  • 탐색에 응답—실행 흐름은 새 위치를 포함하는 두 번째 작업을 디스패치하여(미들웨어와 외부 탐색 모두에서)탐색에 응답하는history리스너로 계속됩니다.
  • 위치 감속기-리스너가 전달한 동작이 위치 감속기에 도달하여 저장소에 위치를 추가합니다. 위치 감속기는 또한 위치 상태의 모양을 결정합니다.
  • 연결된 라우팅-저장소에 연결된 라우터는 저장소의 위치 변경을 통지할 때 새 페이지 내용을 반응적으로 결정할 수 있습니다.
  • 렌더링-마지막으로 새 콘텐츠로 페이지를 다시 렌더링할 수 있습니다.
  • 이 돌아 오는 첫 번째 라우팅을 수행 할 수있는 유일한 방법은 아닙니다-일부 변형은 미들웨어에 저장 증강 및/또는 추가 논리의 사용을 특징으로-하지만 기지를 모두 커버하는 간단한 모델입니다.

    기본 구현

    우리가 방금 살펴본 모델에 따라 코어 액션,미들웨어,리스너 및 감속기를 구현합시다.

    history패키지를 내부 종속성으로 사용하고 솔루션을 점진적으로 빌드합니다. 오히려 최종 결과와 함께 수행하려는 경우,당신은 여기를 볼 수 있습니다.

    작업

    먼저 히스토리 탐색 방법을 미러링하는 5 가지 탐색 작업을 정의합니다:

    // constants.jsexport const PUSH = 'ROUTER/PUSH';export const REPLACE = 'ROUTER/REPLACE';export const GO = 'ROUTER/GO';export const GO_BACK = 'ROUTER/GO_BACK';export const GO_FORWARD = 'ROUTER/GO_FORWARD';
    // actions.jsexport const push = (href) => ({ type: PUSH, payload: href,});
    export const replace = (href) => ({ type: REPLACE, payload: href,});
    export const go = (index) => ({ type: GO, payload: index,});
    export const goBack = () => ({ type: GO_BACK,});
    export const goForward = () => ({ type: GO_FORWARD,});

    미들웨어

    다음으로 미들웨어를 정의해 보겠습니다. 탐색 작업을 가로 채고 해당history탐색 방법을 호출 한 다음 액션이 감속기에 도달하는 것을 중지하지만 다른 모든 액션은 그대로 두어야합니다:

    // middleware.jsexport const routerMiddleware = (history) => () => (next) => (action) => { switch (action.type) { case PUSH: history.push(action.payload); break; case REPLACE: history.replace(action.payload); break; case GO: history.go(action.payload); break; case GO_BACK: history.goBack(); break; case GO_FORWARD: history.goForward(); break; default: return next(action); }};

    이전에 돌아 오는 미들웨어의 내부를 작성하거나 검사 할 기회가 없다면,이 소개를 확인하십시오.

    히스토리 리스너

    다음으로,새 위치 정보가 포함된 새 액션을 디스패치하여 탐색에 응답하는history리스너가 필요합니다.

    먼저 새 작업 유형과 작성자를 추가하겠습니다. 이 위치의 흥미로운 부분은pathname,searchhash입니다.:

    // constants.jsexport const LOCATION_CHANGE = 'ROUTER/LOCATION_CHANGE';
    // actions.jsexport const locationChange = ({ pathname, search, hash }) => ({ type: LOCATION_CHANGE, payload: { pathname, search, hash, },});

    그런 다음 리스너 함수를 작성합시다:

    // listener.jsexport function startListener(history, store) { history.listen((location) => { store.dispatch(locationChange({ pathname: location.pathname, search: location.search, hash: location.hash, })); });}

    우리는 하나의 작은 추가를 만들 것입니다—초기locationChange파견,(역사 리스너에 의해 포착되지 않는)응용 프로그램에 초기 항목을 설명합니다):

    // listener.jsexport function startListener(history, store) { store.dispatch(locationChange({ pathname: history.location.pathname, search: history.location.search, hash: history.location.hash, }));
     history.listen((location) => { store.dispatch(locationChange({ pathname: location.pathname, search: location.search, hash: location.hash, })); });}

    감속기

    다음으로 위치 감속기를 정의합시다. 우리는 간단한 상태 모양을 사용하고 감속기에서 최소한의 작업을 수행 할 것입니다:

    // reducer.jsconst initialState = { pathname: '/', search: '', hash: '',};
    export const routerReducer = (state = initialState, action) => { switch (action.type) { case LOCATION_CHANGE: return { ...state, ...action.payload, }; default: return state; }};

    응용 프로그램 코드

    :

    // index.jsimport { combineReducers, applyMiddleware, createStore } from 'redux'import { createBrowserHistory } from 'history'import { routerReducer } from './reducer'import { routerMiddleware } from './middleware'import { startListener } from './listener'import { push } from './actions'

    // Create the history objectconst history = createBrowserHistory()
    // Build the root reducerconst rootReducer = combineReducers({ // ...otherReducers, router: routerReducer,}) // Build the middlewareconst middleware = routerMiddleware(history)
    // Create the storeconst store = createStore(rootReducer, {}, applyMiddleware(middleware))
    // Start the history listenerstartListener(history, store)
    // Now you can read location data from the store!let currentLocation = store.getState().router.pathname
    // You can also subscribe to changes in the location!let unsubscribe = store.subscribe(() => { let previousLocation = currentLocation currentLocation = store.getState().router.pathname
     if (previousLocation !== currentLocation) { // You can render your application reactively here! }})
    // And you can dispatch navigation actions from anywhere!store.dispatch(push('/about'))

    그리고 그것이 전부입니다! 우리는 돌아 오는 첫 번째 라우팅에 대한 모든 기준을 충족했습니다:

    • 위치는 돌아 오는 가게에서 개최됩니다. 3458>
    • 위치는 돌아 오는 작업을 파견하여 변경됩니다. 응용 프로그램은 저장소에서만 위치 데이터를 읽습니다. 3458>
    • 저장 및 브라우저 기록은 장면 뒤에서 동기화됩니다. ✔

    여기에서 모든 파일을 함께 볼 수 있습니다—프로젝트로 가져 오거나 자체 구현을 개발하는 출발점으로 사용하십시오.이 패키지에는npm install와 같은 방식으로 사용할 수 있습니다.이 경우 라우팅에서 라우팅을 수행하는 데 필요한 최소 프레임 워크에 구애받지 않는 기본 루팅이 필요합니다.깃허브이것은 수학적으로 정확한 유형 계층구조인,강력한 타입을 정의합니다.

    대기-실제 라우팅 구성 요소는 어떻습니까?

    redux-first-routing은 라우팅 모델의 탐색 측면에만 관련이 있음을 알 수 있습니다:

    우리의 라우팅 모델의 다른 측면에서 탐색 측면을 분리함으로써,우리는 약간의 유연성을 얻었다-redux-first-routing라우터 불가지론 및 프레임 워크 불가지론 모두이다.

    따라서 범용 라우터와 같은 라이브러리와 페어링하여 모든 프런트 엔드 프레임 워크에 대한 완전한 돌아 오는 첫 번째 라우팅 솔루션을 만들 수 있습니다:

    돌아 오는 첫 번째 라우팅+범용 라우터를 시작하려면 여기를 클릭하십시오.

    또는,당신은 선택의 프레임 워크에 대한 독단적 인 바인딩을 구축 할 수 있습니다—그리고 우리가이 문서의 다음 및 마지막 섹션에서 반응을 위해 무엇을 할거야.

    반응 사용

    반응에서 선언적 탐색 및 라우팅을 위해 저장소에 연결된 구성 요소를 어떻게 구축 할 수 있는지 살펴 보겠습니다.

    선언적 탐색

    탐색을 위해,우리는 라우터와 다른 라우팅 솔루션을 반응 반응에서와 유사한 저장소에 연결된<Lin케이/>구성 요소를 사용할 수 있습니다.

    단순히 앵커 요소</>의 기본 동작을 재정의하고 클릭 할 때hes 푸시 동작을 디스패치합니다.:

    // Link.jsimport React from 'react';import { connect } from 'react-redux';import { push as pushAction, replace as replaceAction } from './actions';
    const Link = (props) => { const { to, replace, children, dispatch, ...other } = props;
     const handleClick = (event) => { // Ignore any click other than a left click if ((event.button && event.button !== 0) || event.metaKey || event.altKey || event.ctrlKey || event.shiftKey || event.defaultPrevented === true) { return; } // Prevent the default behaviour (page reload, etc.) event.preventDefault();
     // Dispatch the appropriate navigation action if (replace) { dispatch(replaceAction(to)); } else { dispatch(pushAction(to)); } };

     return ( <a href={to} onClick={handleClick} {...other}> {children} </a>);};
    export default connect()(Link);

    여기에서 더 완전한 구현을 찾을 수 있습니다.

    선언적 라우팅

    탐색 구성 요소에는 많은 부분이 없지만 라우팅 구성 요소를 디자인하는 수많은 방법이 있으므로 라우팅 솔루션에서 가장 흥미로운 부분입니다.

    어쨌든 라우터란 무엇입니까?

    일반적으로 라우터를 두 개의 입력과 하나의 출력이있는 함수 또는 블랙 박스로 볼 수 있습니다.:

    route configuration ↘ matched content current location ↗

    라우팅과 후속 렌더링은 별도의 단계에서 발생할 수 있지만,리액트는 이를 선언적 라우팅에 쉽고 직관적으로 묶어줍니다. 이를 달성하기 위한 두 가지 전략을 살펴보자.이 구성 요소 중 하나인”모 놀리 식”은”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”모 놀리 식”과”:

    • 소품을 통해 경로 구성 개체를 수락
    • 돌아 오는 저장소에서 위치 데이터를 읽습니다
    • 위치가 변경 될 때마다 새 콘텐츠를 계산합니다
    • 적절하게 콘텐츠를 렌더링/다시 렌더링합니다.

    경로 구성은 일치하는 모든 경로 및 페이지(중앙 집중식 경로 구성)를 포함하는 일반 자바스크립트 객체일 수 있다.

    이 방법은 다음과 같습니다:

    const routes = 
    React.render( <Provider store={store}> <Router routes={routes}> </Provider>, document.getElementById('app'))

    아주 간단 하죠? 단일 경로 구성 개체와 단일 라우터 구성 요소 만 있습니다.

    이 전략이 당신에게 호소력이 있다면redux-json-router라이브러리에서 내보다 완벽한 구현을 확인하십시오. redux-first-routing을 래핑하고 지금까지 검토 한 전략을 사용하여 선언적 탐색 및 라우팅을위한 반응 바인딩을 제공합니다.라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅은 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅에서 라우터의 첫 번째 라우팅으로 라우팅됩니다.applications.github.com

    전략 2: 구성 가능한<Rout이자형/>구성 요소

    모 놀리 식 구성 요소는 반응에서 선언적 라우팅을 달성하는 간단한 방법 일 수 있지만 확실히 유일한 방법은 아닙니다.

    반응의 구성 가능한 특성은 또 다른 흥미로운 가능성을 허용한다. 물론 대표적인 예는 반응 라우터의<Rout전자/>입니다.:

    React.render( <BrowserRouter> <Route path='/' component={Home}/> <Route path='/about component={About}/> ... </BrowserRouter>

    다른 라우팅 라이브러리도이 아이디어를 탐구합니다. 이 패키지에는 디버깅 심볼이 들어 있습니다.

    <BrowserRoute에서 제공 한 위치 데이터에 의존하는 대신 아르 자형/>, the &l티;경로/>구성 요소 씨ould si:

    React.render( <Provider store={store}> <Route path='/' component={Home}/> <Route path='/about component={About}/> ... </Provider>

    그게 당신이 건물이나 사용에 관심이 뭔가 있다면,나 코멘트에 알려! 다른 경로 구성 전략에 대한 자세한 내용은,이 소개를 체크 아웃 라우터의 웹 사이트를 반응.

    결론

    이 탐색이 클라이언트 측 라우팅에 대한 지식을 심화시키는 데 도움이되었으며 돌아 오는 방법을 달성하는 것이 얼마나 간단한 지 보여 주었기를 바랍니다.

    당신이 완전한 돌아 오는 라우팅 솔루션을 찾고 있다면,당신은 추가 정보에 나열된 호환 라우터와 함께redux-first-routing패키지를 사용할 수 있습니다. 그리고 맞춤형 솔루션을 개발할 필요가 있다면,이 게시물이 그렇게하기위한 좋은 출발점을 제공하기를 바랍니다.

    당신이 반응 및 돌아 오는에서 클라이언트 측 라우팅에 대한 자세한 내용을 보려면,다음 기사를 체크 아웃-그들은 내가 여기에서 다루는 주제를 더 잘 이해하는 데 도움이 수단이었다:

    • 타일러 톰슨
    • 당신은 콘스탄틴 타르 쿠스에 의해 반응 라우터가 필요하지 않을 수도 있습니다
    • 심지어 라우팅 라이브러리가 필요합니까? 넬슨
    • react-router-redux문제에 수많은 유익한 토론.

    클라이언트 측 라우팅은 끝없는 디자인 가능성을 가진 공간이며,여러분 중 일부는 내가 여기서 공유 한 것과 비슷한 아이디어를 가지고 놀았다고 확신합니다. 당신이 대화를 계속하려는 경우,나는 의견이나 트위터를 통해 당신과 함께 연결 드리겠습니다. 읽어 주셔서 감사합니다!

    편집 22/06/17: 또한redux-first-router,강력한 라우팅 기능을 달성하기 위해 지능형 동작 유형을 사용하는 별도의 프로젝트에이 문서를 확인하십시오.

    답글 남기기

    이메일 주소는 공개되지 않습니다.