일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 쉬운설명
- CSS
- event
- scss
- Vue.js
- 리액트
- v-html
- Vue
- Wecode
- 댓글달기
- ES6
- Vue transition
- 자료구조
- State
- input
- mapGetters
- MySQL
- react
- sass
- webpack
- nodejs
- express
- JavaScript
- App.vue
- vuex
- TypeScript
- jsx
- HOC
- storybook
- 자바스크립트
- Today
- Total
익명의 개발노트
browser history API 본문
1. spa를 구현하기 위한 2가지 기능
1) js에서 브라우저로 페이지 전환 요청을 보내는데, 서버로 요청을 보내지 않아야 함.
2) 브라우저의 뒤로가기 버튼 처럼 사용자의 페이지 전환 요청을 js에서 처리할 수 있다. 이때도 서버로 요청을 보내지 않아야 한다.
이런 기능을 만족하는 api는 pushState, replaceState, popstate이벤트이다.
우선 브라우저 히스토리에는 state값을 저장 할 수 있는 stack이 존재한다.
import React, { Component } from 'react';
// import Box from './box4/Box4';
// import './App.css';
class App extends Component {
componentDidMount(){
window.onpopstate = event => {
console.log(`location: ${document.location}, state:${event.state}`);
};
}
render() {
return (
<div className="App">
<button onClick={()=>window.history.replaceState('v1','','/page1')}>page1</button>
<button onClick={()=>window.history.pushState('v2','','/page2')}>page2</button>
</div>
);
}
}
export default App;
위 내용입력 후 실행시켜보고 버튼을 클릭해보면 주소값이 바뀌는 것을 알 수 있다. 이때 서버요청도 안되고 화면도 깜빡이지 않는다.
그리고 브라우저 뒤로가기 버튼을 클릭할때 로그를 보면, stack에 쌓인 값이 null이 될때까지 돌아간다.
pushState는 stack에 값을 저장하고, replaceState는 저장하지 않는다.
우리가 일반적으로 사용하는 react-router-dom 라이브러리의 내부는 위와 같은 구조로 이루어져 있다.
2. react-router-dom
<BrowserRouter> : react-router-dom 라이브러리를 사용하기 위해서는 이 태그로 항상 감싸야한다.
<Link to="/"> : 이 태그는 버튼으로 클릭시 이동하는 주소값을 넣는다.
<Route> : 실제로 주소값에 따라 바뀌는 화면을 보여준다.
<Route exact path ="/" component={Home} />에서 exact는 path값하고 정확하게 일치해야 이동가능하다.
<Route path="/photo" component={Home}/>
<Route path="/photo" component={Photo}/>
주소값이 일치할 경우 컴포넌트 두개 전부 랜더링 한다.
import React, { Component } from 'react';
import {BrowserRouter, Route, Link} from 'react-router-dom';
import Rooms from './Rooms';
class App extends Component {
render() {
return (
<BrowserRouter>
<div style={{ padding : 20, border : '5px solid gray'}}>
<Link to='/'>home</Link>
<br/>
<Link to='/photo'>photo</Link>
<br/>
<Link to='/rooms'>방소개</Link>
<br/>
<Route exact path="/" component={Home}/>
<Route exact path="/photo" component={Photo}/>
<Route exact path="/rooms" component={Rooms}/>
</div>
</BrowserRouter>
);
}
}
function Home({match}){
console.log(match);
return <h2>이곳은 홈페이지 입니다.</h2>
}
function Photo({match}){
return <h2>이곳은 사진을 감상하세요.</h2>
}
export default App;
'코딩일기 > TIL' 카테고리의 다른 글
[react] context API사용하기. (0) | 2019.10.06 |
---|---|
[vue] event-bus (0) | 2019.10.01 |
[react] css 작성방법 결정 (0) | 2019.09.30 |
[vue] image import error처리, 멀티 버튼 이벤트 처리 (0) | 2019.09.25 |
promise chain (0) | 2019.09.19 |