import React, { useState } from "react"
// array destructuring
const [user, setUser] = useState(null);
μΈμλ‘ λ°μ κ°μ΄ μνμ μ΄κΈ°κ°μ λλ€.
user
λΌλ λ³μμ μ΄κΈ°κ° nullμ μ μ₯νκ³setUser
ν¨μλ₯Ό ν΅ν΄user
λ³μμ λ΄κΈ΄ μνκ°μ λ³κ²½ν μ μμ΅λλ€.
리μ‘νΈμ νΉμ§ μ€ νλ, μνκ°μ΄ λ³κ²½λλ©΄ Virtual DOMμ΄ ν΄λΉ μνκ°μ΄ μ¬μ©λ λΆλΆλ§ λ€μ λ λλ§ν©λλ€.
κ·Έλ¬λsetUser
μ κ°μ μνκ° λ³κ²½ ν¨μκ° μλ μ¬μ©μκ° μμλ‘ μνκ°μ λ³κ²½νλ©΄ 리μ‘νΈλ λ³κ²½μ¬νμ μΈμνμ§ λͺ»νκ³ λ¦¬λ λλ§μ νμ§ μμ΅λλ€. λ°λΌμ μνκ°μ λ³κ²½ν λ λ°λμ μνκ° λ³κ²½ ν¨μ(setUser)λ₯Ό μ¬μ©ν©μλ€.
import { useState } from 'react';
type AuthUser = {
name: string
email: string
}
export const User = () => {
const [user, setUser] = useState<AuthUser>({} as AuthUser); // 1οΈβ£
return (
<div>
<div>User name is {user.name}</div>
<div>User email is {user.email}</div>
</div>
)
}
1λ² λΆλΆμ μ μΈνλ©΄ JS νκ²½μμμ useState μ°λ λ°©λ²κ³Ό λμΌν©λλ€.
1λ² λΌμΈμμ <> μμAuthUser
λΌλ Typeμ νΉμ ν΄μ€ κ²μ΄κ³ μΈμκ°μ μ΄κΈ° μνκ°μΈλ°{} as AuthUser
μμ as AuthUser λ Type Assertion μ΄λΌλ κ°λ μ λλ€. μ¦, μ΄κΈ°κ°μ λΉ κ°μ²΄μ΄μ§λ§ μ΄ λΉ κ°μ²΄μ νμ μAuthUser
λΌλ κ²μ κ°λ°μκ° μ§μ ν΄μ€ κ²μ λλ€.
Type Assertion μ κ°λ°μκ° νμ μ€ν¬λ¦½νΈ μ»΄νμΌλ¬λ³΄λ€ μ΄ μν(state)μ λν΄μ λ μ μκ³ μλ€, μ΄ μνμ νμ μ μ΄λ€ νΉμ ν νμ λ§ μ¬ μ μλ€ κ°μ μ΄λ° μν©μμλ§ μ¬μ©νλλ‘ ν©μλ€.
μ μμ μ½λμ μν©μ userκ°μ΄ νμ μ‘΄μ¬νλ μν©(νΉμ userκ°μ΄ nullμ΄ λ μ μλ μν©) μμ κ°λ₯ν μ½λμ λλ€.
useEffect
λ λͺ¨λ μ¬μ΄λ μ΄ννΈλ₯Ό λ΄λΉν©λλ€. μλ₯Όλ€λ©΄, μ΄λ²€νΈ 리μ€λλ₯Ό μΆκ°νκ±°λ, data fetchλ₯Ό νκ±°λ...componentDidUpdate
, componentDidMount
, componentWillUnmount
const [name, setName] = useState('Paul');
useEffect(() => {
document.title = `Hello ${name}'s world!`;
}, [name])
μ»΄ν¬λνΈκ° λ§μ΄νΈ λμμ λ λΈλΌμ°μ titleμ "Hello Paul's world!"λ‘ λ°κΏμ€λλ€. κ·Έλ¦¬κ³ name μνκ°μ΄ λ³κ²½λμ΄ μ»΄ν¬λνΈκ° μ λ°μ΄νΈ λμμ λλ νΈμΆλ©λλ€.
import React, {useEffect} from 'react'
useEffect(
(effect function)
return {
(cleanup function)
}
}, [dependencies]);
μ΄ννΈ ν¨μ νΈμΆ μμ μ μ»΄ν¬λνΈκ° μ²μ λ§μ΄νΈλ λ, μμ‘΄κ°μΌλ‘ μ£Όμ΄μ§ κ°μ΄ λ³κ²½λ λλΌκ³ λ§μλλ Έμ΅λλ€.
κ·Έλ λ€λ©΄ ν΄λ¦°μ ν¨μλ?
μ΄ννΈν¨μκ° νΈμΆλκΈ° μ , μ»΄ν¬λνΈκ° μΈλ§μ΄νΈ(unmount)λ λ νΈμΆλ©λλ€.
μ΄μ μ΄ννΈλ‘ μΈν κ²°κ³Όλ₯Ό μ 리ν΄μ£Όλ μν μ λλ€. λ§κ·Έλλ‘ cleanup!
κ·Έλ¦¬κ³ μμ‘΄κ°μ΄ λΉμ΄μλ€λ©΄ μ΅μ΄ λ§μ΄νΈν λλ§ μ΄ννΈν¨μλ₯Ό νΈμΆν©λλ€. λ μμ‘΄κ°μ΄ μμ μ‘΄μ¬νμ§ μλλ€λ©΄ μ»΄ν¬λνΈκ° λ λλ§λ λλ§λ€ μ΄ννΈλ₯Ό νΈμΆν©λλ€. (μ‘°μ¬ν΄μΌκ² μ£ ?)
import { useState, useEffect } from "react";
const Test = () => {
const [windowScrollY, setWindowScrollY] = useState<number>(window.scrollY);
const handleScroll = () => {
setWindowScrollY(window.scrollY);
};
useEffect(() => {
window.addEventListener("scroll", handleScroll);
console.log("effect");
return () => {
window.removeEventListener("resize", handleScroll);
console.log("clean up");
};
}, [windowScrollY]);
return <div style={{ height: '500vh' }}>{windowScrollY}</div>;
}
export default Test;
cleanup
ν¨μκ° λ¨Όμ νΈμΆλκ³ μ 리λ₯Ό νκ³ λμ effect
ν¨μκ° νΈμΆλλ κ²μ νμΈν μ μμ΅λλ€.