Programming/React
React Login 예제
2swan
2023. 10. 14. 15:21
App.js
import './App.css';
import {BrowserRouter, Route, Routes} from "react-router-dom"
import Navigation from './Navigation';
import Home from './components/Home';
import Contact from './components/Contact';
import Topics from './components/Topics';
import Login from './components/Login';
import Topics1 from './components/Topics1';
import LoginResult from './components/LoginResult';
import Topic from './components/Topic';
function App() {
const contents = [
{id: 1 ,title: 'Java', desc: 'Java is 프로그램 언어'},
{id: 2 ,title: 'HTML', desc: 'HTML is 마크업 언어'},
{id: 3 ,title: 'SQL', desc: 'SQL is 데이터베이스 언어'}
]
return (
<BrowserRouter>
<div>
<h1>react router dom Example</h1>
</div>
<Navigation/>
<Routes>
<Route path='/' element={<Home/>}></Route>
<Route path='/contact' element={<Contact/>}></Route>
<Route path='/topics1' element={<Topics1 Contents={contents}/>}/>
<Route path='/topics' element={<Topics Contents={contents}/>}>
{/* 하위주소를 입력받을 때 해당 Route안에 Route를 포함시킨다
/topics/1, /topics/2, /topics/3 */}
<Route path=':id' element={<Topic Contents={contents}/>}></Route>
</Route>
<Route path='/login' element={<Login/>}>
{/* /login/result/id1/pw1, /login/result/id2/pw2, /login/result/id3/pw3 */}
<Route path='result/:id/:pw' element={<LoginResult/>}></Route>
</Route>
</Routes>
</BrowserRouter>
);
}
export default App;
Navigation.js
import { NavLink } from "react-router-dom";
/*
Link / NavLink ==> state 값 유지
*/
const Navigation = ()=>{
return(
<ul>
<li><NavLink to='/'>Home</NavLink></li>
<li><NavLink to='/contact'>Contact</NavLink></li>
<li><NavLink to='/topics1'>Topics1</NavLink></li>
<hr/>
<li><NavLink to='/topics'>Topics</NavLink></li>
<li><NavLink to='/login'>Login</NavLink></li>
</ul>
)
}
export default Navigation;
Contact.js
const Contact = ()=>{
return(
<div>
<h1>Contact</h1>
Contact 화면 입니다.
</div>
)
}
export default Contact;
Home.js
const Home = ()=>{
return(
<div>
<h2>Home</h2>
홈 화면 입니다.
</div>
)
}
export default Home;
Login.js
import { useState } from "react";
import { Link, Outlet } from "react-router-dom";
const Login = () =>{
const [user, setUser] = useState(
{
id: '',
pw: ''
}
)
return(
<div>
<h2>Login</h2>
아이디: <input type="text" onChange={(e)=>{
setUser({id: e.target.value, pw:user.pw})
}}></input><br/>
비밀번호: <input type="password" onChange={
(e)=>{
setUser({id: user.id, pw: e.target.value})
}}></input><br/>
<Link to={`/login/result/${user.id}/${user.pw}`}>로그인</Link>
<Outlet></Outlet>
</div>
)
}
export default Login;
LoginResult.js
import { useParams } from "react-router-dom";
const LoginResult = ()=>{
const {id, pw} = useParams();
console.log(`id: ${id},pw: ${pw}`)
return(
<div>
<h3>LoginResult</h3>
<p>아이디 : {id}</p>
<p>비밀번호 : {pw}</p>
</div>
)
}
export default LoginResult;
Topic.js
import { useParams } from "react-router-dom";
const Topic = ({Contents})=>{
const {id} = useParams();
let selected_topic = {
title: '죄송합니다.',
desc: '해당 주소는 찾을수 없는 페이지 (404)'
}
for(const topic of Contents){
if(topic.id === Number(id)){
selected_topic = topic;
break;
}
}
return(
<div>
<h3>{selected_topic.title}</h3>
{selected_topic.desc}
</div>
)
}
export default Topic;
Topics.js
import { NavLink, Outlet } from "react-router-dom";
const Topics = ({Contents})=>{
const list = []
for (let i=0; i<Contents.length; i++){
list.push(
<li key={Contents[i].id}>
<NavLink to={`/topics/${Contents[i].id}`}>{Contents[i].title}</NavLink>
</li>
)
}
return(
<div>
<h2>Topics</h2>
토픽 페이지 입니다.
<ul>
{list}
</ul>
{/* 하위컴포넌트가 보여지는 부분 */}
<Outlet></Outlet>
</div>
)
}
export default Topics;
Topic1.js
import React from "react";
const Topic1 =({id, title, desc})=>{
return(
<div>
<h2>Topic1</h2>
{id} , {title} , {desc}
</div>
)
}
export default Topic1;
Topic1s.js
import React from "react";
import Topic1 from "./Topic1";
const Topics1 = ({Contents})=>{
return(
<ul>
<h2>Topics</h2>
{
Contents.map((content)=>{
return(
// <li key={content.id}>
// id: {content.id} <br/>
// title: {content.title} <br/>
// desc: {content.desc} <br/><br/>
// </li>
<li key={content.id}>
<Topic1
id = {content.id}
title = {content.title}
desc = {content.desc}/>
</li>
)
})
}
</ul>
)
}
export default Topics1;