๐ก ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ props
// src/App.js
import React from "react";
function App() {
return <GrandFather />;
}
function GrandFather() {
return <Mother />;
}
function Mother() {
const name = 'ํ๋ถ์ธ';
return <Child motherName={name} />; // ๐ก"props๋ก name์ ์ ๋ฌํ๋ค."
}
function Child(props) {
console.log(props) // 'ํฅ๋ถ์ธ'
return <div>{props.motherName}</div>; // ๋ ๋๋ง
}
export default App;
์์ ์์ ์์๋ ๋จผ์ Mother์ด๋ผ๋ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ์ธ Child ์๊ฒ motherName={name}
์ ์จ์ motherName์ด๋ผ๋ ์ด๋ฆ์ผ๋ก props์จ์ name์ ์ ๋ฌ ํ์๋ค.
import React from "react";
function User(props) {
return <div>{props.children}</div>;
}
function App() {
return <User>์๋
ํ์ธ์</User>;
}
export default App;
๊ธฐ์กด์ props ๊ฐ์ ์ง์ ํด์ ๋ณด๋ด์ฃผ์ง ์์๋, ์์ ์ปดํฌ๋ํธ ์์ ๊ฐ์ ๋ฃ๊ณ ์์ ์ปดํฌ๋ํธ์์ {props.children}
ํ๋ฉด ๋ ๋๋ง์ด ๋๋ค. ์ด ๊ธฐ์ ์ ๋ ์ด์์ ๋ง๋ค ๋ ์ฉ์ดํ๋ค๊ณ ํ๋ค.
๐ก State๋ ์ปดํฌ๋ํธ ๋ด๋ถ์์ ๋ฐ๋ ์ ์๋ ๊ฐ์ ์๋ฏธํ๋ค.
์์ฑํ๋ ค๋ฉด useState()์ด๋ ํ
์ ์ฌ์ฉํด์ผ๋๋ค.
// src/App.js
import React, { useState } from "react";
function Child(props) {
return (
<div>
<button
onClick={() => {
props.setName("๋ฐํ ์"); // ๋๋์ด ๋ฐ์ setName์ ์คํํฉ๋๋ค.
}}
>
ํ ์๋ฒ์ง ์ด๋ฆ ๋ฐ๊พธ๊ธฐ
</button>
<div>{props.grandFatherName}</div>
</div>
);
}
function Mother(props) {
return (
<Child grandFatherName={props.grandFatherName} setName={props.setName} /> // ๋ฐ์์ ๋ค์ ์ฃผ๊ณ
);
}
function GrandFather() {
/* useState hook์ผ๋ก 'name' ์ด๋ผ๋ state ๊ฐ๊ณผ, setName์ด๋ผ๋ name์ ๋ณ๊ฒฝํ ์ ์๋ ๊ฐ์ ์ค์ ํด ์ค๋ค*/
// ๊ทธ ํ, ํ์ ์ปดํฌ๋ํธ์ state ๊ฐ๋ค์ props๋ก ๋ณด๋ด์ค๋ค.
const [name, setName] = useState("๊นํ ์");
return <Mother grandFatherName={name} setName={setName} />; // ์ฃผ๊ณ
}
function App() {
return <GrandFather />;
}
export default App;
์์ ์์ ๊ฐ์ด state๋ ํ์ฌ ์กด์ฌํ๋ state๊ฐ๊ณผ ๋ณ๊ฒฝํ ์ ์๋ setState ๊ฐ์ผ๋ก ์ง์ ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ state๊ฐ์ ๋ง ์์ ์์ฌ๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ข์ง๋ง, ์ ๋ํ๋ฉด ์๋๋ ๊ฒ์ด ์๋๋ฐ, ๊ทธ๊ฒ์ ๋ฐ๋ก ์๋ณธ์ ํผ์ํ์ง ์๋ ๊ฒ์ด๋ค. ๊ทธ ์ค์ ์์๋ฐ์ดํฐ๊ฐ ์๋ ๋ฐ์ดํฐ์ ๋ถ๋ณ์ฑ์ ์ง์ผ์ฃผ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค.
(์์ ๋ฐ์ดํฐ๋ ๋ถ๋ณ์ฑ์ด ์์ง๋ง, ๊ทธ ์ธ์ ๋ฐฐ์ด, ๊ฐ์ฒด, ํจ์๋ ๋ถ๋ณ์ฑ์ด ์์)
์ด๋ ํ์ํ ๊ฒ์ด ๋ฐ๋ก ๊น์ ๋ณต์ฌ.. spread operator
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค..!!
import React, { useState } from "react";
function App() {
const [dogs, setDogs] = useState(["๋งํฐ์ฆ"]);
function onClickHandler() {
// spread operator(์ ๊ฐ ์ฐ์ฐ์)๋ฅผ ์ด์ฉํด์ dogs๋ฅผ ๋ณต์ฌํฉ๋๋ค.
// ๊ทธ๋ฆฌ๊ณ ๋์ ํญ๋ชฉ์ ์ถ๊ฐํฉ๋๋ค.
setDogs([...dogs, "์๊ณ ๋ฅด์๋ธ๋ฅด์ข
"]);
}
console.log(dogs);
return (
<div>
<button onClick={onClickHandler}>๋ฒํผ</button>
</div>
);
}
export default App;
๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ๋ฒ ์ฐ๊ธฐ์๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๊ณ ํจ์จ๋ ๋ณ๋ก๋ผ์ ์ฐ๋ฆฌ๋ ๋ฐฐ์ด์ ํ๋ map
์ ํ์ฉ์ ํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ๋ฐ๋ณต์ํจ๋ค.
๐ก map ์ ๋ง ์ ์ฐ์ธ๋ค. foreach, filter์ ๋๋ถ์ด.. mdn์ ๋ฌ๋ฌ ์ธ์ฐ์..!
(https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
์์๋ ๋ค์๊ณผ ๊ฐ๋ค
import React from "react";
function User(props) {
const squareStyle = {
width: "100px",
height: "100px",
border: "1px solid green",
borderRadius: "10px",
display: "flex",
alignItems: "center",
justifyContent: "center",
};
return (
<div style={squareStyle}>
<div>{props.user.age}์ด - </div>
<div>{props.user.name}</div>
</div>
);
}
function App() {
const style = {
padding: "100px",
display: "flex",
gap: "12px",
};
const users = [
{ id: 1, age: 30, name: "์ก์ค๊ธฐ" },
{ id: 2, age: 24, name: "์ก๊ฐ" },
{ id: 3, age: 21, name: "๊น์ ์ " },
{ id: 4, age: 29, name: "๊ตฌ๊ตํ" },
];
return (
<div style={style}>
{users.map((user) => {
return <User user={user} key={user.id} />;
})}
</div>
);
}
export default App;
์์ ์์ ์์ map์ {users.map((user) => { return <User user={user} key={user.id} />; })}
์ด๋ ๊ฒ ์ฐ์๋๋ฐ, User๋ผ๋ ์ปดํฌ๋ํธ์ user์ ์ ๋ณด๋ฅผ ์ํํ๊ณ ๊ฐ๊ฐ์ ์ ๋ณด๋ฅผ ์ฃผ์
ํด์ค๋ค.
๐ก react์์๋ map์ ์ธ ๋ ๊ผญ 'key' ๋ฅผ ์จ์ค์ผํ๋ค. (์๊ทธ๋ผ ์๋ฌ๊ฐ ๋ ์ง๋ ๋ชฐ๋ผ์ฉ~)
key๊ฐ ํ์ํ ์ด์ ๋ react์์ ์ปดํฌ๋ํธ ๋ฐฐ์ด์ ๋ ๋๋งํ์ ๋ ๊ฐ๊ฐ์ ์์์์์ ๋ณํ๊ฐ ์๋์ง ์์๋ด๊ธฐ ์ํจ์ด๋ค. key๋ฅผ ๋ฃ์ด ์ด ๊ฐ์ผ๋ก ์ด๋ค ๋ณํ๊ฐ ์์๋์ง virtual dom์ด ๋น ๋ฅด๊ฒ ์์๋ผ ์ ์๋ค. => ket = react ์ต์ ํ
<div style={style}>
{users.map((user) => {
return <User user={user} key={user.id} />;
})}
</div>
jsx์์ ์ฌ์ฉ๋๋ css in js ๊ด๋ จ ๋ฆฌ์กํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ style component
๋ผ๊ณ ํ๋ค.
๋จผ์ VScode ๋ด์์ styled-components ํ๋ฌ๊ทธ์ธ์ ์ค์น
๊ทธ ํ npm i styled-components
ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํด์ฃผ๊ธฐ
import React from "react";
// styled-components์์ styled ๋ผ๋ ํค์๋๋ฅผ import ํฉ๋๋ค.
import styled from "styled-components";
// styledํค์๋๋ฅผ ์ฌ์ฉํด์ styled-components ๋ฐฉ์๋๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ญ๋๋ค.
const StBox = styled.div`
// ๊ทธ๋ฆฌ๊ณ ์ด ์์ ์คํ์ผ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์คํ์ผ ์ฝ๋๋ ์ฐ๋ฆฌ๊ฐ ์๊ณ ์๋ css์ ๋์ผํฉ๋๋ค.
width: 100px;
height: 100px;
border: 1px solid red;
margin: 20px;
`;
const App = () => {
// ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ๋ง๋ styled-components๋ฅผ JSX์์ html ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ฏ์ด ์ฌ์ฉํฉ๋๋ค.
return <StBox>๋ฐ์ค</StBox>;
};
export default App;
style-components๋ jsx ๋ด์์ ๋ณ์ ๋ด์ css ์ฉ์ด๋ฅผ ์๋ ๊ธฐ๋ฒ์ด๋ฉฐ, ํ์
์์๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ๊ธฐ๋ฒ์์์ ๊ฐ์ ์ style์ ์กฐ๊ฑด๋ถ (์ผํญ์ฐ์ฐ์, if, case ๋ฑ)์ ๋ฌ ์ ์๋ค๋ ๊ฒ์ด๋ค..!
const StContainer = styled.div`
display: flex;
`;
const StBox = styled.div`
width: 100px;
height: 100px;
border: 1px solid ${(props) => props.borderColor};
margin: 20px;
`;
const App = () => {
// ๋ฐ์ค์ ์์ ๋ฐฐ์ด์ ๋ด์ต๋๋ค.
const boxList = ["red", "green", "blue"];
// ์์ ๋ฃ์ผ๋ฉด, ์ด๋ฆ์ ๋ฐํํด์ฃผ๋ ํจ์๋ฅผ ๋ง๋ญ๋๋ค.
const getBoxName = (color) => {
switch (color) {
case "red":
return "๋นจ๊ฐ ๋ฐ์ค";
case "green":
return "์ด๋ก ๋ฐ์ค";
case "blue":
return "ํ๋ ๋ฐ์ค";
default:
return "๊ฒ์ ๋ฐ์ค";
}
};
return (
<StContainer>
{/* map์ ์ด์ฉํด์ StBox๋ฅผ ๋ฐ๋ณตํ์ฌ ํ๋ฉด์ ๊ทธ๋ฆฝ๋๋ค. */}
{boxList.map((box) => (
<StBox borderColor={box}>{getBoxName(box)}</StBox>
))}
</StContainer>
);
};