2021. 10. 9. 08:00ใFront-End ์์ ์ค/Vue.js
๐ ์ํ์ฝ๋ฉ - React Router
๐ React Router Dom ์ค์น
๐ก ์ฐธ๊ณ :
https://reactrouter.com/web/guides/quick-start
Guide ํญ์์ Quick Start ํด๋ฆญ
๋ช ๋ น์ด : ํด๋น ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ์์ $ npm install react-router-dom
์ฌ๊ธฐ์ Router๋ ์ด์ฉ์๊ฐ URL๋ก ์ด๋ค ์ฃผ์๋ฅผ ์น๊ณ ๋ค์ด์์ ๋์ ํด๋น URI์ ๋ง๋ ํ์ด์ง๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ์ด๋ค.
๐ Router
import {BrowserRouter} from 'react-router-dom';
Router๋ ๋ชจ๋ Router Componet์ Interface์ด๋ค.
Router์๋ ๊ธฐ๋ณธ์ ์ธ ๋ผ์ฐํ ๊ด๋ จ ์์ฑ๋ง ์ ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์๋ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- <BrowserRouter>
- <HashRouter>
- <MemoryRouter>
- <NativeRouter>
- <StaticRouter>
Router์๋ history ๊ฐ์ฒด๋ฅผ ์ด์ฉํด ๋ค์ด๊ฒ์ดํ ์ ํ๋ค.
์ฌ๊ธฐ์ BrowserRouter๋ React Router Component์ ์ต์์ Component๋ฅผ ์ด์ฃผ๋ Wrapper Component
path="/"
path="/"
path="/topics"
์์ ๊ฐ์ด ๋ URI์ ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
<Route exact path="/one">
<About />
</Route>
์์ ๊ฐ์ด exact๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ๊ฒ ์ผ์น์์ผ ์ค๋ค.
๐ Switch
Switch Component๋ก ์ฌ์ฉ์ ์ ์ Coponent๋ค์ ๊ฐ์ธ์ฃผ๋ฉด exact๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ์ ํํ URI Matching์ ๊ธฐ๋ํ ์ ์๋ค.
Switch๋ก Route Component๋ฅผ ๊ฐ์ธ๊ฒ ๋๋ฉด ๋ฆฌ์ํธ ๋ผ์ฐํฐ ๋์ path์ ์ผ์นํ๋ ์ฒซ๋ฒ์งธ Component๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๋๋จธ์ง Component๋ ๋ฌด์ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์์ ์จ๋ ผ ๋ง์ ๊ฑฐ์ง๋ง์ผ๊น? ์ต์์ URI๋ฅผ ์ง์ ํ [ "/" ] Component๋ฅผ ์ตํ๋จ์ผ๋ก ์ฎ๊ธฐ๊ฑฐ๋, ์ต์์ URI์๋ง exact๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค.
<Route path="/"> Not Found </Route>
์์ ๊ฐ์ด exact๋ฅผ ๊ธฐ์ ํ์ง ์์ ์ต์์ URI๋ก Not Found๋ฅผ ์ค์ ํด ๋๋ฉด ์ฌ์ฉ์๊ฐ ์๋ URI๋ฅผ ์ ๋ ฅํ์ ๋, ์์ ์ฝ๋์ ๊ธฐ์ฌ๋ ๋ด์ฉ์ด ๋ณด์ด๊ฒ ๋๋ค.
๐ LINK
import {BrowserRouter, Route, Switch, Link} from 'react-router-dom';
<ul>
<li>
<a href="/">Home</a>
<a href="/topics">Topics</a>
<a href="/contact">Contact</a>
</li>
</ul>
์์ a Tag๋ก ์ฝ๋ฉ์ ํ๊ฒ ๋๋ฉด ์ฐ๋ฆฌ๋ ์ฑ๊ธ ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ์๋๋ฐ, ์๋ก๊ณ ์นจ์ด a Tag๋ฅผ ๋๋ฅผ๋๋ง๋ค ์๋๋๊ฒ ๋๋ค.
<ul> <li> <Link to="/">Home</Link> <Link to="/topics">Topics</Link> <Link to="/contact">Contact</Link> </li> </ul>
ํ์ง๋ง, ์ด๋ฅผ Link Tag๋ก ๊ณ ์น๊ฒ ๋๋ฉด ์๋ก๊ณ ์นจ์ ๋ฐฉ์งํ ์ ์๋ค.
๐ Hash Router
import {HashRouter, Route, Switch, Link} from 'react-router-dom';
ReactDOM.render( // BrowserRouter๋ก App์ ๊ฐ์ธ App Component์์ BrwoserRouter๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
<HashRouter>
<App />
</HashRouter>,
document.getElementById('root') );
๐ BrowserRouter ์ HashRouter
HashRouter๋ URL ์ฐฝ(์ฃผ์์ฐฝ)์ URI๋ถ๋ถ์ ํด์ฌ(#)์ด ๋ถ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ๊ฒ์ ์์ง์ด ์ฝ์ ์ ์๋ค.
URL Hash๋ฅผ ์ฌ์ฉํ๋ฉด HashRouter๋ ์ง์๋๋ ๋ธ๋ผ์ฐ์ ๋ ์น ์๋ฒ์ ์ ํ์ด ์๋ค.
ํ์ง๋ง, ์์์ ์ธ๊ธํ ๊ฒ์ฒ๋ผ example.com/#/messages/messages์ ๊ฐ์ด ์ฃผ์์ Hash๊ฐ ๋ถ๊ฒ ๋๋ค. HashRouter๋ URL Hash๋ฅผ ์๋ฒ์์ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ Server Side Rendering์ผ๋ก ์ค์ ์ Backupํ ์ ์๋ค. ๋ํ, Hash History๋ฅผ ์ง์ํ์ง ์๋๋ค.
BrowserRouter๋ Link Component๋ก to ์์ฑ์ ์ด๋ํ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ค.
Route Component Path ์์ฑ์ Link์ to ์์ฑ์ผ๋ก Component Mapping Path๋ฅผ ๊ธฐ์ ํ๋ค.
์๋ก๊ณ ์นจ ์ ๊ฒฝ๋ก๋ฅผ ๋ชป ์ฐพ์ Error๊ฐ ๋๋ฉฐ, ๋๋ถ๋ถ์ ๋ ๊ฑฐ์ ๋ธ๋ผ์ฐ์ (IE 9 ์ดํ)์์ ์ฌ์ฉํ ์ ์๋ค.
๋ํ, BrowserRouter๋ History API๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฌ์ค ๋ง์ React ์ฝ๋์์ Routing ํ๋ Logic์ ์ดํด๋ณด๋ฉด BrowserRotuer๊ฐ ์๋์ ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋๋ค. ์๋ํ๋ฉด ์์ ์๋ ์ฌ๋๋ค์ด URL ์์น ๋ณ๊ฒฝ ์ javaScript๋ฅผ ์ฌ์ฉํ ์ ์์๊ธฐ ๋๋ฌธ์ HashRouter๋ฅผ ์ฌ์ฉํ์ผ๋, ์ต๊ทผ์๋ BrowserRotuer๊ฐ ์ด ๋ถํธํจ์ ํด์ํด์ฃผ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ, HashRouter๋ History Location์ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ถํธํจ์ด ๋ง๊ธฐ ๋๋ฌธ์ด๋ค. BrowserRotuer๋ History Location์ ์ง์ํ๋ฉฐ, ๋ค์ํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ฌ ๋ฉ์ง ์น์ ๋ง๋ค ์ ์๋ค.
๐ Nav Link
Link์ ์ ์ฌํ์ง๋ง, ์ข ๋ ๋ถ๊ฐ ๊ธฐ๋ฅ์ด ๋ ์กด์ฌ
import {HashRouter, Route, Switch, NavLink} from 'react-router-dom';
<ul>
<li>
<NavLink to="/">Home</NavLink>
<NavLink to="/topics">Topics</NavLink>
<NavLink to="/contact">Contact</NavLink>
</li>
</ul>
ํด๋น Link๋ฅผ ํด๋ฆญํ๋ฉด Browser์์ Rander๋ฅผ ํ ๋, class๊ฐ ์๊ธฐ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น Link๋ฅผ ํด๋ฆญํ์ ๋, ํด๋น class๊ฐ active๊ฐ ๋๊ฒ ํ๋ ค๋ฉด NavLink ๋ค์ exact๋ฅผ ๋ถํ์ฃผ๋ฉด ๋๋ค.
<ul>
<li>
<NavLink exact to="/">Home</NavLink>
<NavLink exact to="/topics">Topics</NavLink>
<NavLink exact to="/contact">Contact</NavLink>
</li>
</ul>
์ด๋ ๊ฒ ์ค์ ํด ๋๋ฉด ์ด์ฉ์๊ฐ ์์ ์ด ์์นํ ์์น๋ฅผ ์ง๊ด์ ์ผ๋ก ์ดํดํ ์ ์๊ฒ Navigation์ ํ์๋ฅผ ํด์ค ์ ์๋ค.
ํด๋น js์ css์๋ค๊ฐ active Class CSS๋ฅผ ๋ง๋ค์ด์ฃผ๋ฉด ๋๋ค.
index.css
.active{
background-color: blueviolet;
text-decoration: none;
}
๐ Nested Routing
์ด๋ฒ์๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ดํด๋ณด์
useParams๋ ํ๋์ Route์ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๊ธฐ ์ํ ํ์๋ฅผ ํด์ฃผ๋ฉด(์๋ ์ฝ๋์์ :/topic_id ๋ถ๋ถ)
์:)
<Route path="/topics:/topic_id">
<Topic></Topic>
</Route>
์ ์๋ฆฌ์ ๋ค์ด์ค๋ ๊ฐ๋ค์ ์๋ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ ๋๋๋ฐ, ํด๋น ๊ฐ์ useParams()๋ก ๋ฐ์ ์ ์๊ณ , ๊ทธ ๊ฐ์ ๋ฐ๋ผ์ ๋์ ์ผ๋ก ๋์ํ๋ ํ์ด์ง๋ฅผ ๋ง๋ค ์ ์๋ค.
'Front-End ์์ ์ค > Vue.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - Vue Router (0) | 2022.03.07 |
---|---|
[Vue.js] ๊ธฐ์ด ๊ฐ๋ ์ ๋ฆฌ - ๊ธฐ๋ณธ ํ๊ฒฝ ๊ตฌ์ฑ (0) | 2022.03.07 |
[Reacte] Array์ shouldComponentUpdate() (0) | 2021.10.04 |
[Reacte] Component Event ๋ง๋ค๊ธฐ (0) | 2021.10.02 |
[Reacte] Event setState ํจ์ (0) | 2021.10.02 |