티스토리 뷰
prop과 state의 차이점
prop은 component를 사용하는 외부자를 위한 데이터
state는 component를 만드는 내부자를 위한 데이터
App.js
import logo from './logo.svg';
import './App.css';
function Header(props){//컴포넌트 생성(대문자로 시작)
return <header>
<h1><a href="/" onClick={(event)=>{ //event객체를 첫번째 파라미터로
event.preventDefault(); //<a>태그 의 기본동작 방지-> reload 되지 않게
props.onChangeMode(); // alert 호출
}}>{props.title}</a></h1>
</header>
}
function Nav(props){
const lis =[]
for(let i=0; i<props.topics.length; i++){ //topics의 개수만큼 반복
let t = props.topics[i];
lis.push(<li key={t.id}>
<a id={t.id} href={'/read/'+t.id} onClick={(event)=>{ //id값을 부여해주기
event.preventDefault();
props.onChangeMode(event.target.id); //event를 동작시킨 태그의 id
}}>{t.title}</a></li>) //lis에 하나씩 넣기, 동적으로 바뀔대상이 있으면 중괄호 사용
//<li>태그가 구별되도록 key값을 고유값으로 설정
}
return <nav>
<ol>
{lis}
</ol>
</nav>
}
function Article(props){//props를 사용시 함수 외부에서 입력값으로 사용가능
return <article>
<h2>{props.title}</h2>
{props.body}
</article>
}
function App() {
const mode ='WELCOME'; //mode의 값에 따라 본문 변화
const topics = [//topics를 배열 설정
{id:1, title:'html', body:'html is ...'},
{id:2, title:'css', body:'css is ...'},
{id:3, title:'javascript', body:'javascript is ...'},
]
let content = null;
if(mode === 'WELCOME'){ //mode의 따라 결정
content = <Article title="Welcome" body="Hello, WEB"></Article>
}else if(mode === 'READ'){
<Article title="Read" body="Hello, WEB"></Article>
}
return (
<div>
<Header title="WEB" onChangeMode={()=>{ // onChangeMode prop값으로 함수 호출, function() == ()=>
mode = 'WELCOME';
}}></Header>
<Nav topics={topics} onChangeMode={(id)=>{ //id값을 입력받는 함수 호출
mode ='READ';
}}></Nav>
{content}
</div>
);
}
export default App;
클릭 시 모드의 변화에 따라 본문이 바뀔 거라 생각했지만 그렇지 않다.
why?
mode의 값은 바뀌었지만 App()함수는 다시 실행하지 않기 때문에 return 값에는 변화 없음
따라서 state 사용
useState는 배열을 return한다
0번째 원소는 상태의 값을 읽을 때 사용
1번째 원소는 상태의 값을 변경할 때 사용하는 함수
import logo from './logo.svg';
import './App.css';
import {useState} from 'react'; //state 사용
function Header(props){//컴포넌트 생성(대문자로 시작)
return <header>
<h1><a href="/" onClick={(event)=>{ //event객체를 첫번째 파라미터로
event.preventDefault(); //<a>태그 의 기본동작 방지-> reload 되지 않게
props.onChangeMode(); // alert 호출
}}>{props.title}</a></h1>
</header>
}
function Nav(props){
const lis =[]
for(let i=0; i<props.topics.length; i++){ //topics의 개수만큼 반복
let t = props.topics[i];
lis.push(<li key={t.id}>
<a id={t.id} href={'/read/'+t.id} onClick={(event)=>{ //id값을 부여해주기
event.preventDefault();
props.onChangeMode(event.target.id); //event를 동작시킨 태그의 id
}}>{t.title}</a></li>) //lis에 하나씩 넣기, 동적으로 바뀔대상이 있으면 중괄호 사용
//<li>태그가 구별되도록 key값을 고유값으로 설정
}
return <nav>
<ol>
{lis}
</ol>
</nav>
}
function Article(props){//props를 사용시 함수 외부에서 입력값으로 사용가능
return <article>
<h2>{props.title}</h2>
{props.body}
</article>
}
function App() {
//const _mode = useState('WELCOME'); //mode의 값에 따라 본문 변화
//const mode = _mode[0]; //상태의 값 읽기 가능
//const setMode = _mode[1]; //mode의 값을 바꿀 수 있음
const [mode, setMode] = useState('WELCOME');
console.log('mode', mode);
const topics = [//topics를 배열 설정
{id:1, title:'html', body:'html is ...'},
{id:2, title:'css', body:'css is ...'},
{id:3, title:'javascript', body:'javascript is ...'},
]
let content = null;
if(mode === 'WELCOME'){ //mode의 따라 결정
content = <Article title="Welcome" body="Hello, WEB"></Article>
}else if(mode === 'READ'){
content = <Article title="Read" body="Hello, WEB"></Article>
}
return (
<div>
<Header title="WEB" onChangeMode={()=>{ // onChangeMode prop값으로 함수 호출, function() == ()=>
setMode('WELCOME'); //값을 바꿀 때는 setMode
}}></Header>
<Nav topics={topics} onChangeMode={(id)=>{ //id값을 입력받는 함수 호출
setMode('READ'); //값을 바꿀 때는 setMode
}}></Nav>
{content}
</div>
);
}
export default App;
코드 실행 시
mode에 따라서 제목 내용 변경
import logo from './logo.svg';
import './App.css';
import {useState} from 'react'; //state 사용
function Header(props){//컴포넌트 생성(대문자로 시작)
return <header>
<h1><a href="/" onClick={(event)=>{ //event객체를 첫번째 파라미터로
event.preventDefault(); //<a>태그 의 기본동작 방지-> reload 되지 않게
props.onChangeMode(); // alert 호출
}}>{props.title}</a></h1>
</header>
}
function Nav(props){
const lis =[]
for(let i=0; i<props.topics.length; i++){ //topics의 개수만큼 반복
let t = props.topics[i];
lis.push(<li key={t.id}>
<a id={t.id} href={'/read/'+t.id} onClick={(event)=>{ //id값을 부여해주기
event.preventDefault();
props.onChangeMode(Number(event.target.id)); //event를 동작시킨 태그의 id
//문자가 된 데이터를 숫자로 변환
}}>{t.title}</a></li>) //lis에 하나씩 넣기, 동적으로 바뀔대상이 있으면 중괄호 사용
//<li>태그가 구별되도록 key값을 고유값으로 설정
}
return <nav>
<ol>
{lis}
</ol>
</nav>
}
function Article(props){//props를 사용시 함수 외부에서 입력값으로 사용가능
return <article>
<h2>{props.title}</h2>
{props.body}
</article>
}
function App() {
//const _mode = useState('WELCOME'); //mode의 값에 따라 본문 변화
//const mode = _mode[0]; //상태의 값 읽기 가능
//const setMode = _mode[1]; //mode의 값을 바꿀 수 있음
const [mode, setMode] = useState('WELCOME');
const [id, setId] = useState(null);
const topics = [//topics를 배열 설정
{id:1, title:'html', body:'html is ...'},
{id:2, title:'css', body:'css is ...'},
{id:3, title:'javascript', body:'javascript is ...'},
]
let content = null;
if(mode === 'WELCOME'){ //mode의 따라 결정
content = <Article title="Welcome" body="Hello, WEB"></Article>
}else if(mode === 'READ'){
let title, body = null;
for(let i=0; i<topics.length; i++){ //topics.id와 id state가 일치하면 title,body 값 설정
console.log(topics[i].id, id);
if(topics[i].id === id){
title = topics[i].title;
body = topics[i].body;
}
}
content = <Article title={title} body={body}></Article>
}
return (
<div>
<Header title="WEB" onChangeMode={()=>{ // onChangeMode prop값으로 함수 호출, function() == ()=>
setMode('WELCOME'); //값을 바꿀 때는 setMode
}}></Header>
<Nav topics={topics} onChangeMode={(_id)=>{ //id값을 입력받는 함수 호출
setMode('READ'); //값을 바꿀 때는 setMode
setId(_id); //_id값이 바뀌면 컴포넌트가 새로 실행되며 새로운 id값 지정 해줌
}}></Nav>
{content}
</div>
);
}
export default App;
코드 실행 시
본문 내용도 변경
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- BFS
- seb
- SEB 43기
- dfs
- 프리프로젝트
- SEB43기
- 인적성
- 프론트엔드
- 다이나믹 프로그래밍
- 코드스테이츠
- useContext
- 브루드포스
- SEB43
- 프로그래머스
- 개인 프로젝트
- React quill
- dictionary
- til
- 그리디 알고리즘
- 백준
- 코테
- 기술면접
- 회고
- 프로젝트
- 스택오버플로우
- 감정 일기장
- Redux
- SEB 43
- Python
- 감정일기장
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함