Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- Kernighan의 C언어 프로그래밍
- 페이징
- iterator
- ㅒ
- 선형대수
- 친절한SQL튜닝
- 스프링부트핵심가이드
- 서버설정
- network configuration
- 네트워크 설정
- 처음 만나는 AI수학 with Python
- 처음 만나는 AI 수학 with Python
- 알파회계
- 티스토리 쿠키 삭제
- resttemplate
- 코드로배우는스프링웹프로젝트
- 자료구조와 함께 배우는 알고리즘 입문
- 이터레이터
- 데비안
- /etc/network/interfaces
- 스프링 시큐리티
- 자료구조와함께배우는알고리즘입문
- GIT
- 구멍가게코딩단
- 목록처리
- baeldung
- 리눅스
- 자바편
- 코드로배우는스프링부트웹프로젝트
- d
Archives
- Today
- Total
bright jazz music
생활코딩: React-Router-DOM 실습 본문
1. react-router-dom 설치
$npm install react-router-dom
2. index.js 작성(내가 수정한 버전. var를 const 또는 let으로 변경)
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter, Route, Routes, HashRouter, Link, NavLink, useParams } from 'react-router-dom';
function Home() {
return (
<div>
<h2>Home</h2>
Home...
</div>
);
}
// 원래는 ajax나 axios로 가져왔을 배열
const contents = [
{id:1, title:'HTML', description: 'HTML is...'},
{id:2, title:'JS', description: 'JS is...'},
{id:3, title:'React', description: 'React is...'},
]
function Topic(){
const params = useParams();
const topic_id = params.topic_id;
let selected_topic={
title:'sorry',
description:'Not Found'
};
for(let i=0; i<contents.length; i++){
if(contents[i].id === Number(topic_id)) {
selected_topic = contents[i];
break;
}
}
console.log('#useParams', params)
return (
<div>
<h3>{selected_topic.title}</h3>
{selected_topic.description}
</div>
);
}
function Topics() {
const lis =[];
for(let i=0; i< contents.length; i++){
lis.push(
<li key={contents[i].id}><NavLink to={"/topics/" + contents[i].id}>
{contents[i].title}
</NavLink>
</li>
)
}
return (
<div>
<h2>Topics</h2>
<ul>
{lis}
</ul>
<Routes>
<Route path="/:topic_id" element={<Topic />}></Route>
{/* topic_id가 <Topic>으로 전달된다. <Topic>에서는 이를 useParams()를 사용해서 받는다. */}
</Routes>
</div>
);
}
function Contact() {
return (
<div>
<h2>Contact</h2>
Contact...
</div>
)
}
function App() {
return(
<div>
<h1>Hello React Router DOM</h1>
<ul>
{/* <li><a href="/">Home</a></li>
<li><a href="/topics">Topics</a></li>
<li><a href="/contact">Contact</a></li>
*/}
{/* <li><Link to="/">Home</Link></li>
<li><Link to="/topics">Topics</Link></li>
<li><Link to="/contact">Contact</Link></li> */}
{/* NavLink를 사용하면 해당 태그에 class="active" 라는 속성이 생긴다.
이를 사용하여 사용자가 현재 자신이 어떤 페이지에 위치하는지를 직관적으로 알 수 있게 네비게이션에 위치를 표시해 줄 수 있다.
index.css 참고 */}
<li><NavLink to="/">Home</NavLink></li>
<li><NavLink to="/topics">Topics</NavLink></li>
<li><NavLink to="/contact">Contact</NavLink></li>
</ul>
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/topics/*" element={<Topics />}></Route>
<Route path="/contact" element={<Contact />}></Route>
<Route path="/*" element={'Not Found'}></Route>
</Routes>
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<HashRouter><App /></HashRouter>);
/**
http://localhost:3000/#/topics 처럼 표시된다.
#가 붙어있으면 뒤의 내용은 북마크라는 뜻이다. 웹서버는 # 문자 뒷부분의 주소는 무시한다.
하지만 자바스크립트를 이용해 #의 뒷부분의 내용을 알 수 있기 때문에 react-router-dom은 URL을 읽어서 적절한 컴포넌트로 라우팅해 줄 수 있다.
웹서버 설정에 따라 어떤 패스로 들어오든 루트 페이지에 있는 HTML파일을 서비스 할 수 있다면 BrowserRouter를 사용하고,
그렇지 않다면 HashRouter를 사용하면 된다.
*/
// ReactDOM.createRoot(document.getElementById('root')).render(<BrowserRouter><App /></BrowserRouter>);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
3. index.css 작성
.active{
background-color: tomato;
text-decoration: none;
}
4. index.js (책에 나와 있는 버전)
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import reportWebVitals from './reportWebVitals';
import { BrowserRouter, Route, Routes, HashRouter, Link, NavLink, useParams } from 'react-router-dom';
function Home() {
return (
<div>
<h2>Home</h2>
Home...
</div>
);
}
// 원래는 ajax나 axios로 가져왔을 배열
var contents = [
{id:1, title:'HTML', description: 'HTML is...'},
{id:2, title:'JS', description: 'JS is...'},
{id:3, title:'React', description: 'React is...'},
]
function Topic(){
var params = useParams();
var topic_id = params.topic_id;
var selected_topic={
title:'sorry',
description:'Not Found'
};
for(var i=0; i<contents.length; i++){
if(contents[i].id === Number(topic_id)) {
selected_topic = contents[i];
break;
}
}
console.log('#useParams', params)
return (
<div>
<h3>{selected_topic.title}</h3>
{selected_topic.description}
</div>
);
}
function Topics() {
var lis =[];
for(var i=0; i< contents.length; i++){
lis.push(
<li key={contents[i].id}><NavLink to={"/topics/" + contents[i].id}>
{contents[i].title}
</NavLink>
</li>
)
}
return (
<div>
<h2>Topics</h2>
<ul>
{lis}
</ul>
<Routes>
<Route path="/:topic_id" element={<Topic />}></Route>
{/* topic_id가 <Topic>으로 전달된다. <Topic>에서는 이를 useParams()를 사용해서 받는다. */}
</Routes>
</div>
);
}
function Contact() {
return (
<div>
<h2>Contact</h2>
Contact...
</div>
)
}
function App() {
return(
<div>
<h1>Hello React Router DOM</h1>
<ul>
{/* <li><a href="/">Home</a></li>
<li><a href="/topics">Topics</a></li>
<li><a href="/contact">Contact</a></li>
*/}
{/* <li><Link to="/">Home</Link></li>
<li><Link to="/topics">Topics</Link></li>
<li><Link to="/contact">Contact</Link></li> */}
{/* NavLink를 사용하면 해당 태그에 class="active" 라는 속성이 생긴다.
이를 사용하여 사용자가 현재 자신이 어떤 페이지에 위치하는지를 직관적으로 알 수 있게 네비게이션에 위치를 표시해 줄 수 있다.
index.css 참고 */}
<li><NavLink to="/">Home</NavLink></li>
<li><NavLink to="/topics">Topics</NavLink></li>
<li><NavLink to="/contact">Contact</NavLink></li>
</ul>
<Routes>
<Route path="/" element={<Home />}></Route>
<Route path="/topics/*" element={<Topics />}></Route>
<Route path="/contact" element={<Contact />}></Route>
<Route path="/*" element={'Not Found'}></Route>
</Routes>
</div>
);
}
ReactDOM.createRoot(document.getElementById('root')).render(<HashRouter><App /></HashRouter>);
/**
http://localhost:3000/#/topics 처럼 표시된다.
#가 붙어있으면 뒤의 내용은 북마크라는 뜻이다. 웹서버는 # 문자 뒷부분의 주소는 무시한다.
하지만 자바스크립트를 이용해 #의 뒷부분의 내용을 알 수 있기 때문에 react-router-dom은 URL을 읽어서 적절한 컴포넌트로 라우팅해 줄 수 있다.
웹서버 설정에 따라 어떤 패스로 들어오든 루트 페이지에 있는 HTML파일을 서비스 할 수 있다면 BrowserRouter를 사용하고,
그렇지 않다면 HashRouter를 사용하면 된다.
*/
// ReactDOM.createRoot(document.getElementById('root')).render(<BrowserRouter><App /></BrowserRouter>);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
'Framework > ReactJs' 카테고리의 다른 글
생활코딩: context API (0) | 2023.05.16 |
---|---|
생활코딩: styled-components (0) | 2023.05.16 |
생활코딩: 리액트 프로그래밍 CRUD 기본 (0) | 2023.05.14 |
리액트 앱과 백엔드 서버 연동 테스트4 (+ docker) (0) | 2023.04.09 |
리액트 앱과 백엔드 서버 연동 테스트3 (+ Nginx) (0) | 2023.04.09 |
Comments