230523(ν)
π μ±μ₯μΌμ§ 4.0
μ±
ν볡ν μ΄κΈ°μ£Όμμ(μ¨μΈ λ€μ΄μ΄)
μ λ΄μ©μ μκ·Ήλ°μ μμνλ μλ°ν μ±μ₯κΈ°λ‘
μ΄μμλ κ½κ³Ό μ£½μ κ½μ μ΄λ»κ² ꡬλ³νλκ°?
μ±μ₯νκ³ μλ κ²μ΄ μ΄μ μλ κ²μ΄λ€.
μλͺ μ μ μΌν μ¦κ±°λ μ±μ₯μ΄λ€!
π³ (1.0)ν€μλ
μ΅λν κ°λ¨νκ² μ 리, μΆνμ 보면μ μ€μ€λ‘ μ€λͺ
π (2.0)κ²½ν μμ£Όλ‘
λ¨μ μ 보λ₯Ό μ λ¬νκΈ°λ³΄λ€ λ¬΄μμ λ°°μ κ³ μ΄λ»κ² ν΄κ²°νλμ§ μ§§κ³ κ°λ¨νκ² μμ±
βοΈ (3.0)μ ν΄μ§ ν νλ¦Ώμ λ§μΆ°μ
ν€μλ, κ²½ν λͺ¨λ μ’λ€. λ€λ§ λ§€μΌ μμ±νκΈ°λ‘ λ§μ λ¨Ήμλ§νΌ ν΅μ¬λ§ κ°κ²°νκ² μ 리ν μ μκ² ν νλ¦Ώμ μμ±
(3.1)230102λΆν° μμλλ νμ΅μ κ΄ν λ΄μ© μΆκ°
(3.2)230313λΆν° μ’λ κ²½ν, κ°μ μμ£Όμ λ΄μ©λ λ΄κΈ°!
πΎ (4.0)νμ΅ ν€μλμμ μ΅λν κ°λ¨ν μ 보 μ 곡, κ³ λ―Όμμ λ΄ κ²½νμ μμΈν μ μ!
π μ€λμ νμ΅ ν€μλ
λΆλͺ¨ μ»΄ν¬λνΈμμ fetchν λ°μ΄ν°λ₯Ό μμ μ»΄ν¬λνΈμκ² μ λ¬νκΈ°
λΆλͺ¨μ»΄ν¬λνΈμμ apiλ₯Ό ν΅ν΄ dataλ₯Ό λ°μμ€κ³ μ΄λ₯Ό μνλ‘ κ°λλ€. κ·Έλ¦¬κ³ μ΄ μνλ₯Ό μμμ»΄ν¬λνΈμκ² μ λ¬νμ¬ λ λλ§νλ €λλ°, λ¬Έμ κ° λ°μνλ€.
μλμ κ°μ μ½λμμ apiλ₯Ό ν΅ν΄ dataλ₯Ό λ°μμ€λ λ‘μ§μ λ λλ§ μμ
μ΄ μλλ―λ‘ sideEffectλ‘ λ³΄κ³ useEffectλ₯Ό ν΅ν΄ λ λλ§ νμ μ€νλλλ‘ νλ€.
κ·Έλ¬λ©΄ dataμλ null
μ΄ λ€μ΄κ°κΈ° λλ¬Έμ, λ§μ½ Child μ»΄ν¬λνΈμμ dataλ₯Ό κ°κ³ μ€ννλ μ΄λ€ λ‘μ§μ΄ μλ€λ©΄ (ex) data.userName
) μλ¬κ° λ°μνλ€.
const Parent = () => {
const [data, setData] = useState(null);
const fetchData = async (api: string) => {
try {
const res = await fetch(api);
const data = await res.json();
setIssueDetailData(data);
console.log(data);
} catch (error) {
console.log(error);
}
};
useEffect(() => {
fetchData(TEMP_ISSUE_API);
}, []);
return (
<div>
<Child data={data} />
</div>
)
}
μ΄λ₯Ό ν΄κ²°νκΈ° μν μμ£Ό κ°λ¨ν λ°©λ²μ μμ§ dataκ° μμ λλ Child μ»΄ν¬λνΈλ₯Ό λ λλ§νμ§ μλ κ²μ΄λ€. μλμ μ½λμ κ°μ΄ 쑰건문 νλλ§ μΆκ°νλ©΄ λλ€.
const Parent = () => {
const [data, setData] = useState(null);
const fetchData = async (api: string) => {
try {
const res = await fetch(api);
const data = await res.json();
setIssueDetailData(data);
console.log(data);
} catch (error) {
console.log(error);
}
};
useEffect(() => {
fetchData(TEMP_ISSUE_API);
}, []);
return (
<div>
{data && <Child data={data} />} // dataκ° μμ λλ Child μ»΄ν¬λνΈλ₯Ό λ λλ§νμ§ μλλ€.
</div>
)
}
μ λ§ λ³ κ±° μλ μ μμ§λ§, μ΄κ±΄ νλμ ν¨ν΄μΌλ‘ μκ°νκ³ κΈ°μ΅ν΄λλ κ² μ’μ κ² κ°λ€.
κ²°κ΅ λ¦¬μ‘νΈλ μλ°μ€ν¬λ¦½νΈ ν¨μμ λΆκ³Όνλ€.
μ¬λ¬ κ³³μμ μ¬μ©λ Tag
μ»΄ν¬λνΈ μ½λλ₯Ό μμ±νλ©΄μ λλ μκ°μ΄λ€. λκ° λ¦¬μ‘νΈ ν¨μ μ»΄ν¬λνΈνλ©΄ μ΄λ ΅κ² λκ»΄μ§κ³ 볡μ‘νκ² μκ°λμ§λ§, μκ°ν΄λ³΄λ©΄ κ·Έλ₯ λ¨μνκ²
νλμ ν¨μμΌ λΏμ΄λ€.
Tag μ»΄ν¬λνΈλ₯Ό μ§λ©΄μ μλμ κ°μ΄ μ½λλ₯Ό μμ±νμλ€.
const Tag = ({ tagType, writerName, isOpen }: TagProps) => {
return (
<>
{tagType === 'openClose' ? (
isOpen ? (
<div className="flex h-8 w-fit items-center justify-center gap-x-1 rounded-[50px] bg-blue px-4">
<AlertCircle stroke="#FEFEFE" />
<span className="text-sm text-gray-50">μ΄λ¦° μ΄μ</span>
</div>
) : (
<div className="flex h-8 w-fit items-center justify-center gap-x-1 rounded-[50px] bg-navy px-4">
<Archive stroke="#FEFEFE" />
<span className="text-sm text-gray-50">λ«ν μ΄μ</span>
</div>
)
) : (
<div className="flex h-8 w-fit items-center justify-center gap-x-1 rounded-[50px] border border-gray-300 bg-gray-100 px-4 text-gray-600">
{writerName}
</div>
)}
</>
);
};
export default IssueMainInfo;
λκ° λ± λ΄λ μ€λ³΅λλ μμκ° λ§κ³ μ§μ λΆν λλμ΄ λλ€. μ΄ λ, λ± κ·Έ μκ°μ΄ μ€μ³κ°λ€. κ²°κ΅μ ν¨μλΌλ κ²..! ν΄μ μΆνμ μ’λ κΉλν λ‘μ§μΌλ‘ κ°μ ν΄λ³Ό μμ μ΄λ€ :)
π μμ½ λ° ν루 κ°λ¨ νκ³
μ»΄ν¬λνΈλ₯Ό μ²μλΆν° μ€κ³νκ³ μ½λλ₯Ό μμ±ν΄ λμκ°λ μ‘°κΈμ κ°μ΄ μ‘νλ€. λκ° λ¦¬μ‘νΈμμ μ¬μ©νλ νλμ ν¨ν΄(?) νΉμ μ΄λ€ κ·Έ λͺ¨μ(?)μ μ κΈ°μ΅νκ³ μΊμΉν΄μ μ¬μ©νλ κ² μ’μ κ² κ°λ€. μ²μ 리μ‘νΈλ₯Ό λ°°μ°λ μ¬λμ΄ μκ°νκΈ°μ λ€μ μ΄λ €μ΄ λΆλΆλ€λ μκΈ° λλ¬Έμ΄λ€! κ·Έλλ νλ보면 μ¬λ―Έμκ³ μΎκ°μ΄ μλ€! κ·Έλ¬λ λ μ΄μ¬ν μ μ§νμ!
μ€λμ μν μ
- μ§μ§ μ μ μ°¨λ €μ μ΄μ¬ν νλ €κ³ ν μ
- μ€μ€λ‘ μ¬λΌν(?)μ μ§μ§ μκ³ μ΄μ¬ν λμ΄μ¬λ¦¬λ μ
μ€λμ μμ¬μ΄ μ
- μλ€..! μ§μ§ μλλ―~!
μ°Έκ³
- μμ