6-7. React Lifecycle 제어하기 (useEffect)
2022. 7. 5. 16:51ㆍReact/한입 크기로 잘라 먹는 리액트(React.js)
LifeCycle이란?
depency를 잘 사용하면, 업데이트 한 것들을 잘 활용할 수 있다.
UseEffect사용방법
mount, update 사용
App.js
import { useRef, useState } from "react";
import "./App.css";
import DiaryEditor from "./DiaryEditor";
import DiaryList from "./DiaryList";
import Lifecycle from "./Lifecycle";
const App = () => {
// 전역적으로 Data 관리할 state
const [data, setData] = useState([]);
const dataId = useRef(0);
const onCreate = (author, content, emotion) => {
const created_date = new Date().getTime();
const newItem = {
author,
content,
emotion,
created_date,
id: dataId.current,
};
dataId.current += 1;
setData([newItem, ...data]); // 새로운 일기를 제일 위로 보내기 위해서
};
const onRemove = (targetId) => {
console.log(`${targetId}가 삭제되었습니다.`);
// filter 기능을 통해 그 부분만 빼고 출력 된다.
const newDiaryList = data.filter((it) => it.id !== targetId);
setData(newDiaryList);
};
const onEdit = (targetId, newContent) => {
setData(
data.map((it) =>
it.id === targetId ? { ...it, content: newContent } : it
)
);
};
return (
<div className="App">
<Lifecycle />
<DiaryEditor onCreate={onCreate} />
<DiaryList onEdit={onEdit} onRemove={onRemove} diaryList={data} />
</div>
);
};
export default App;
Lifecycle.js
import React, { useEffect, useState } from "react";
const Lifecycle = () => {
const [count, setCount] = useState(0);
const [text, setText] = useState("");
useEffect(() => {
console.log("Mount!");
}, []); //dependency array는 빈 배열로
// component가 update되는 순간
// state 변경, 부모에게서 받는 props가 바뀌거나, 부모 component가 rerendering 자기자신도 rerendering됨
// rerendering되는 것은 component가 update된다는 말
// state를 변경하는 순간을 useEffect로 제어, dependent array를 전달하지 않으면 된다.
// component를 update하는 순간을 사용하려면, useEffect를 사용하면 된다.
useEffect(() => {
console.log("Update!");
});
// useEffect의 dependency array에 count를 전달하면
// dependency값이 변화하면, 그 순간 callback함수가 수행이 된다.
useEffect(() => {
console.log(`count is update : ${count}`);
if (count > 5) {
alert("count가 5를 넘었습니다. 따라서 1로 초기화합니다.");
setCount(1);
}
}, [count]);
useEffect(() => {
console.log(`text is update : ${text}`);
}, [text]);
return (
<div style={{ padding: 20 }}>
<div>
{count}
<button onClick={() => setCount(count + 1)}>+</button>
</div>
<div>
<input value={text} onChange={(e) => setText(e.target.value)} />
</div>
</div>
);
};
export default Lifecycle;
Unmount기능
Lifecycle.js
import React, { useEffect, useState } from "react";
const UnmountTest = () => {
// component가 unmount되는 순간 제어
useEffect(() => {
console.log("Mount!");
return () => {
// Unmount 시점에 실행되게 됨
console.log("Unmount!");
};
}, []);
return <div>Unmount Testing Component</div>;
};
const Lifecycle = () => {
const [isVisible, setIsVisible] = useState(false);
const toggle = () => setIsVisible(!isVisible);
return (
<div style={{ padding: 20 }}>
<button onClick={toggle}>ON/OFF</button>
{/* isVisible이 true일때만 UnmountTest가 반환될 수 있도록(단락회로평가)
단락 회로 평가
단락 회로 평가 논리 연산자 (&& , ||) 를 사용하여 연산을 진행 할 때 좌측 식의 값에 따라 우측 식의 실행 여부를 판단하는 동작 */}
{isVisible && <UnmountTest />}
</div>
);
};
export default Lifecycle;
단락회로 평가 출처
https://espania.tistory.com/332
[javascript] 단락 회로 평가 개념 및 활용 예제
단락 회로 평가 논리 연산자 (&& , ||) 를 사용하여 연산을 진행 할 때 좌측 식의 값에 따라 우측 식의 실행 여부를 판단하는 동작을 단락 회로 평가라고 한다. 예제 getName = (param) => { if(!param){ return
espania.tistory.com
'React > 한입 크기로 잘라 먹는 리액트(React.js)' 카테고리의 다른 글
6-9. React Developer Tools (RDT) (0) | 2022.07.06 |
---|---|
6-8. React에서 API 호출하기 (useEffect X fetch) (0) | 2022.07.05 |
6-6. 리스트 데이터 수정하기 (UPDATE) (0) | 2022.07.05 |
6-5. 리스트 데이터 삭제하기 (DELETE) (0) | 2022.07.05 |
6-4. 리스트 데이터 추가하기 (CREATE) (0) | 2022.07.04 |