BrowserRouter와 history.push()가 있는 라우터
나는 그 차이를 이해하려고 애쓰고 있다.BrowserRouter
그리고.Router
의react-router-dom
(v5) 패키지와 아래 예제의 차이점.
문서에는 다음과 같이 기재되어 있습니다.
BrowserRouter A는 HTML5 이력 API(pushState, replaceState 및 popstate 이벤트)를 사용하여 UI를 URL과 동기화 상태로 유지합니다.
출처 : https://reacttraining.com/react-router/web/api/BrowserRouter
라우터 모든 라우터 컴포넌트의 공통 로우 레벨인터페이스일반적으로 앱은 다음 중 하나의 고급 라우터를 사용합니다.BrowserRouter, HashRouter, MemoryRouter, NativeRouter, StaticRouter
출처 : https://reacttraining.com/react-router/web/api/Router
HTML5 브라우저 앱에 Browser Router를 사용해야 한다고 알고 있으며, 지금까지 이 작업을 해오고 있습니다.
history.timeout(...)의 예:
제가 지금 하고 있는 건history.push('/myNewRoute')
펑크 내:
import history as './history';
...
export function someAsyncAction(input) {
return dispatch => {
fetch(`${API_URL}/someUrl`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({ input }),
}).then(() => {
history.push('/myNewRoute');
}).catch((err) => {
dispatch(setError(err));
})
};
};
history
는 다음 모듈로 정의됩니다.
import { createBrowserHistory } from 'history';
export default createBrowserHistory();
그리고 그리고history
라우터에도 전달됩니다.
import { BrowserRouter as Router } from 'react-router-dom';
import history as './history';
...
const App = () => (
<Router history={history}>
...
</Router>
);
문제: history.push()
는 브라우저 바의 URL을 갱신하지만 루트 뒤에 있는 컴포넌트는 렌더링하지 않습니다.
Import 하는 경우Router
대신BrowserRouter
동작:
// Does not work:
import { BrowserRouter as Router } from 'react-router-dom';
// Does work:
import { Router } from 'react-router-dom';
BrowserRouter
는 이력을 자동으로 처리하므로 이력 소품을 무시합니다.리액트 컴포넌트 이외의 이력에 액세스 할 필요가 있는 경우는,Router
괜찮을 거야
useHistory 훅을 통해 이력에 액세스할 수 있습니다.let history = useHistory();
행하다history.push()
브라우저 라우터의 경우.
HTML5 History API 문서를 보면 history API가 자동으로 사용자의 상태를 유지하는 것 같습니다. 처음에 1페이지에 있고 1페이지에 페이지 아웃룩 A가 있다고 가정합니다. 페이지 1 아웃룩을 B로 변경하는 작업을 수행했습니다. 이제 2페이지로 이동하면 브라우저의 뒤로 버튼을 클릭하면 1페이지로 바로 돌아갑니다. History API는 Outlook B를 렌더링하는 것을 알 수 있도록 사용자의 상태를 미리 인식하기 때문에 이를 사용하는 것이 장점입니다. 100% 확신할 수는 없지만 이 기능은 포함되어 있지 않을 것입니다.이 경우 1페이지로 돌아가면 아웃룩 A가 표시됩니다.그건 사실이 아니야.나는 그 차이를 잘 모르겠다.
저도 같은 문제가 있어요.
BrowserRouter
그리고.useHistory()
이치노 ★★★★★★★★★★★★★★★★★.createBrowserHistory()
이치노그러나 당신의 케이스와 같은 레플렉스가에는 페이지가 움직이지 않았습니다.
게다가 내 소스는 BrowserRouter를 사용하여 개발되었기 때문에 Router 컴포넌트로 대체하고 싶지 않습니다.
하지 못한 , 두이 다 것을 if
★★★★★★★★★★★★★★★★★」==
것 ..)을 사용하다
이를 해결하기 위해 useHistory()에 의해 취득된 이력 오브젝트의 참조를 글로벌 유틸리티 코드에 저장하여 redux-saga 코드로 사용합니다.그러면 잘 되는 거죠.
이게 최선이라고 생각하지는 않지만, 아직 가장 좋고 공식적인 방법을 찾을 수 없었습니다.
언급URL : https://stackoverflow.com/questions/56707885/browserrouter-vs-router-with-history-push
'programing' 카테고리의 다른 글
배열을 useEffect 종속성 목록으로 전달하는 중 (0) | 2023.04.01 |
---|---|
vIM에서 JSON 들여쓰기를 수정하는 방법 (0) | 2023.04.01 |
d3.contract 축의 날짜 처리 (0) | 2023.03.27 |
Zend Framework가 AJAX 응답을 전송할 때 보기/레이아웃을 렌더링하지 않도록 하려면 어떻게 해야 합니까? (0) | 2023.03.27 |
setState in reactjs가 Sync가 아닌 비동기인 이유는 무엇입니까? (0) | 2023.03.27 |