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 |
Tags
- styled-component
- 개발일기
- 고차함수
- 로컬상태
- css
- 전역상태
- 실행컨텍스트스택
- 실행컨텍스트 실행과정
- 실행컨텍스트 동작과정
- CLI
- 알고리즘
- 실행컨텍스트콜스택
- npm 에러
- 영어공부
- CORS
- 영어
- Block
- html
- 실행컨텍스트자바스크립트
- useRef역할
- 그래머인유즈
- 개발공부
- 실행컨텍스트 면접
- Mini Node Server
- 노마드코더
- .env
- 실행컨텍스트란
- state hook
- .current
- 객체
Archives
- Today
- Total
오늘도 삽질중
React State 예제 (State Lifting State Up Hooks 예제, Effect hook) 본문
🎟 Lifting State Up
import React, { useState } from "react";
import "./styles.css";
const currentUser = “박소영”;
function Twittler() {
const [tweets, setTweets] = useState([
{
id: 1,
writer: “parksoyoung”,
date: "2020-11-1”,
content: "안녕 리액트"
},
{
id: 2,
writer: “박소영”,
date: "2020-11-1”,
content: “리액트 너 좀 어렵다?”
},
]);
const addNewTweet = (newTweet) => {
setTweets([...tweets, newTweet]);
}; // 이 상태 변경 함수가 NewTweetForm에 의해 실행되어야 합니다.
return (
<div>
<div>작성자: {currentUser}</div>
<NewTweetForm onButtonClick={addNewTweet} />
<ul id="tweets">
{tweets.map((el) => (
<SingleTweet key={el.uuid} writer={el.writer} date={el.date}>
{el.content}
</SingleTweet>
))}
</ul>
</div>
);
}
function NewTweetForm({ onButtonClick }) {
const [newTweetContent, setNewTweetContent] = useState("");
const onTextChange = (e) => {
setNewTweetContent(e.target.value);
};
const onClickSubmit = () => {
let newTweet = {
uuid: Math.floor(Math.random() * 10000),
writer: currentUser,
date: new Date().toISOString().substring(0, 10),
content: newTweetContent
};
onButtonClick(newTweet);
// TDOO: 여기서 newTweet이 addNewTweet에 전달되어야 합니다.
};
return (
<div id="writing-area">
<textarea id="new-tweet-content" onChange={onTextChange}></textarea>
<button id="submit-new-tweet" onClick={onClickSubmit}>
새 글 쓰기
</button>
</div>
);
}
function SingleTweet({ writer, date, children }) {
return (
<li className="tweet">
<div className="writer">{writer}</div>
<div className="date">{date}</div>
<div>{children}</div>
</li>
);
}
export default Twittler;
🎟 Effect Hook -기본 useEffect & useState 연습
import { useEffect, useState } from "react";
export default function ParentComponent() {
const proverbs = [
"좌절감으로 배움을 늦추지 마라",
"Stay hungry, Stay foolish",
"Memento Mori",
"Carpe diem",
"배움에는 끝이 없다"
]
const [idx, setIdx] = useState(0)
const dd = () => {
setIdx(idx === proverbs.length-1 ? 0 : idx + 1)
}
return (
<div>
<button onClick ={dd}>명언제조</button>
<Proverb saying = {proverbs[idx]}/>
</div>
)
}
function Proverb ({saying}) {
useEffect(() => {
document.title = saying
})
return (
<div>
<h3>오늘의 명언</h3>
<div>{saying}</div>
</div>
)
}
🎟 Effect Hook - 조건부 실행
import { useEffect, useState } from "react";
import "./styles.css";
import { getProverbs } from "./storageUtil";
export default function App() {
const [proverbs, setProverbs] = useState([]);
const [filter, setFilter] = useState("");
const [count, setCount] = useState(0);
useEffect(() => {
console.log("언제 effect 함수가 불릴까요?");
const result = getProverbs(filter);
setProverbs(result);
}, [filter]);
const handleChange = (e) => {
setFilter(e.target.value);
};
const handleCounterClick = () => {
setCount(count + 1);
};
return (
<div className="App">
필터
<input type="text" value={filter} onChange={handleChange} />
<ul>
{proverbs.map((prvb, i) => (
<Proverb saying={prvb} key={i} />
))}
</ul>
<button onClick={handleCounterClick}>카운터 값: {count}</button>
</div>
);
}
function Proverb({ saying }) {
return <li>{saying}</li>;
}
Comments