๋ชฉ์ฐจ
Components๋?
์ปดํฌ๋ํธ๋ ์ฌ์ฌ์ฉํ ์ ์๋ ๋จ์๋ฅผ ๋งํ๋ค.
๋ ๊ณ ๋ก ์๋์ฐจ๋ฅผ ๋ง๋ค ๋, ๋ค์ํ ํฌ๊ธฐ์ ๋ธ๋ญ์ ์กฐ๋ฆฝํ์ฌ ๋ง๋ค ๋ฏ์ด
๊ณตํต๋๋ UI๋ฅผ ์กฐ๊ฐ๋ด๊ณ ๋ค์ํ ๊ณณ์์ ์กฐ๋ฆฝํ๋ฏ์ด ์ฑ์ ๋ง๋ค ์ ์๋๋ก ๋๋๋ ๊ฒ์ด ์ปดํฌ๋ํธ์ด๋ค!
//๋ฆฌ์กํธ ์ปดํฌ๋ํธ ์์
//ํด๋์คํ
class App extends React.Component {
render() {
return <h1>Hello world!</h1>
}
}
โถ <App /> ์ปดํฌ๋ํธ
//ํจ์ํ
function Head(){
return (
<div>
<h1>์ ๋ชฉ1</h1>
<h2>์ ๋ชฉ2</h2>
</div>
);
}
โถ <Head /> ์ปดํฌ๋ํธ
์ฐ๋ฆฌ๋ ์ด๋ฏธ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด๋ดค๋ค.
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ HTML์ ์ ์๋ ํ๊ทธ๊ฐ ์๋
<App />, <Head />์ ๊ฐ์ด ์ฌ์ฉ์ ์ ์ ํ๊ทธ๋ฅผ ๋ง๋๋ ๊ฒ์ด๋ผ ์๊ฐํด๋ ๋ ๊ฒ ๊ฐ๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ
React.Component๋ฅผ ์์๋ฐ์ ํด๋์ค๋ก ์ ์ํ๋ฉฐ render() ํจ์์ JSX๋ฅผ ๋ฐํํด์ผํ๋ค.
// /src/components/classComponent.js
import React from "react";
class Hello extends React.Component{
render() {
return (
<h1> ๋๋ ํด๋์คํ ์ปดํฌ๋ํธ! tree ๋ ์๋
ํ์ธ์! </h1>
);
}
}
export default Hello
// /src/App.js
import './App.css';
import Hello from "./components/classComponent";
function App() {
return (
<div className="App">
<Hello />
</div>
);
}
export default App;
ํจ์ํ ์ปดํฌ๋ํธ
function์ผ๋ก ์ ์ํ๊ณ JSX๋ฅผ ๋ฐ๋ก returnํ๋ฉด๋๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์์ ๊ฐ์ ๋์ด ๋์จ๊ฒ ํจ์ํ ์ปดํฌ๋ํธ์ด๋ค.
ํด๋์คํ๋ณด๋ค ์ฅ์ ์ด ๋ง์ ์์ฆ์ ์ฃผ๋ก ํจ์ํ์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค!
** ์ฃผ์. ์ปดํฌ๋ํธ๋ ํญ์ ๋๋ฌธ์๋ก ์์ํด์ผํ๋ค
๋ด ๊ฒฝ์ฐ์ ํจ์๋๊น ์๋ฌธ์๋ก ์์ํ๋๋ฐ, ๋ ๋๋ง์ด ์๋์๋ค.
๋ฆฌ์กํธ์์ ์ฌ์ฉํ๋ ๊ท์น ๋๋ฌธ์ ํจ์ํ ์ปดํฌ๋ํธ๋ ๋๋ฌธ์๋ก ์์ํด์ผํ๋ ์ฃผ์ํ์!
// /src/components/funcComponent.js
import React from "react";
function FuncHello() {
return (
<h1> ๋๋ ํจ์ํ ์ปดํฌ๋ํธ! flower ๋ ์๋
ํ์ธ์! </h1>
);
}
export default FuncHello;
// /src/App.js
import './App.css';
import FuncHello from "./components/funcComponent";
function App() {
return (
<div className="App">
<FuncHello />
</div>
);
}
export default App;
Props๋?
์ปดํฌ๋ํธ์์ ์ฌ์ฉํ๋ ๋ณ์ ๊ฐ์ฒด์ด๋ค. ์ฝ๊ธฐ ์ ์ฉ์ด๋ผ ์์ ์ ๋ถ๊ฐํ๋ค!
props๋ฅผ ์์ ํ๊ณ ์ถ๋ค๋ฉด, state ๊ฐ๋ ์ ์ฌ์ฉํด์ผํ๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ์์ props ์ฌ์ฉํ๊ธฐ
this ํค์๋๋ฅผ ํตํด props ๊ฐ์ฒด์ ์ ๊ทผํด์ผํ๋ค.
// /src/components/classComponent.js
import React from "react";
class Hello extends React.Component{
render() {
return (
<h1> ๋๋ ํด๋์คํ ์ปดํฌ๋ํธ! {this.props.name} ๋ ์๋
ํ์ธ์! </h1>
);
}
}
export default Hello;
// /src/App.js
import './App.css';
import Hello from "./components/classComponent";
function App() {
return (
<div className="App">
<Hello name="tree" /> โญ
</div>
);
}
export default App;
ํจ์ํ ์ปดํฌ๋ํธ์์ props ์ฌ์ฉํ๊ธฐ
// /src/components/funcComponent.js
import React from "react";
// props ๊ทธ๋๋ก ์ฌ์ฉํ ๋ ์์ฑ์ ํ๊ณ ๋ค์ด๊ฐ์ผํ๋ค.
// function FuncHello(props) {
// return (
// <h1> ๋๋ ํจ์ํ ์ปดํฌ๋ํธ! {props.name} ๋ ์๋
ํ์ธ์! </h1>
// );
// }
//props๋ฅผ ๋ถํดํด์ ๊ฐ์ ธ์ฌ์๋ ์๋ค.
function FuncHello({ name }) {
return (
<h1> ๋๋ ํจ์ํ ์ปดํฌ๋ํธ! {name} ๋ ์๋
ํ์ธ์! </h1>
);
}
export default FuncHello;
// /src/App.js
import './App.css';
import FuncHello from "./components/funcComponent";
function App() {
return (
<div className="App">
<FuncHello name="flower" /> โญ
</div>
);
}
export default App;
Props ์ ๊ฐ์ด ์๋ค๋ฉด? Component.defaultProps
๋ง๋ค์ด์ง ์ปดํฌ๋ํธ์ defaultProps ์์ฑ์ ์ ์ํ๋ฉด๋๋ค.
ํด๋์คํ ์ปดํฌ๋ํธ
// /src/components/classComponent.js
import React from "react";
class Hello extends React.Component{
render() {
return (
<h1> ๋๋ ํด๋์คํ ์ปดํฌ๋ํธ! {this.props.name} ๋ ์๋
ํ์ธ์! </h1>
);
}
}
Hello.defaultProps = {
name: '์ต๋ช
'
}
export default Hello;
// /src/App.js
import './App.css';
import Hello from "./components/classComponent";
function App() {
return (
<div className="App">
<Hello />
</div>
);
}
export default App;
ํจ์ํ ์ปดํฌ๋ํธ
// /src/components/funcComponent.js
import React from "react";
function FuncHello({ name }) {
return (
<h1> ๋๋ ํจ์ํ ์ปดํฌ๋ํธ! {name} ๋ ์๋
ํ์ธ์! </h1>
);
}
FuncHello.defaultProps = {
name: '์ต๋ช
'
}
export default FuncHello;
// /src/App.js
import './App.css';
import FuncHello from "./components/funcComponent";
function App() {
return (
<div className="App">
<FuncHello />
</div>
);
}
export default App;
๋ถ๋ชจ ์ปดํฌ๋ํธ๊ฐ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด? props.children
<๋ถ๋ชจ ์ปดํฌ๋ํธ>
<์์ ์ปดํฌ๋ํธ />
<์์ ์ปดํฌ๋ํธ />
</๋ถ๋ชจ ์ปดํฌ๋ํธ>
์ด๋ ๊ฒ ๋ถ๋ชจ ์ปดํฌ๋ํธ ์์ ์์์ปดํฌ๋ํธ๊ฐ ์๋ค๋ฉด props.children ์์ฑ์ ์ด์ฉํด ๋ ๋๋งํด์ผํ๋ค.
ํ์คํ๋ ๋๊น์ค ๋ฉ๋ดํ์ ๋ง๋ค์ด๋ณด์ฅ!
ํ์คํ
- ๊น๋ฅด๋ณด๋๋ผ
- ํ ๋งํ ํ์คํ
๋๊น์ค
- ๋๊ฝ์น์ฆ๋๊น์ค
- ๋งค์ด๋๊น์ค
// /src/components/Category.js
import React from "react";
//์์ ์ปดํฌ๋ํธ
function Item({ name }) {
return (
<p> {name} </p>
);
}
//๋ถ๋ชจ ์ปดํฌ๋ํธ
function Category({ name, bgColor, children }){
const style = {
backgroundColor: bgColor,
padding: '5px',
margin: '10px 0px'
};
//์์ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ฃผ๋ children ์์ฑ์ ํน์ํ ์์ฑ์ด๋ค!
return (
<div style={style}>
<h3> { name } </h3>
{ children }
</div>
);
}
//์ฌ๋ฌ๊ฐ ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ณด๋ผ๋๋ { }๋ก ๊ฐ์ผ๋ค!
export { Category, Item };
// /src/App.js
import './App.css';
import { Category, Item } from "./components/Category";
function App() {
return (
<div className="App">
<Category name="ํ์คํ" bgColor="pink">
<Item name="๊น๋ฅด๋ณด๋๋ผ"></Item>
<Item name="ํ ๋งํ ํ์คํ"></Item>
</Category>
<Category name="๋๊น์ค" bgColor="yellow">
<Item name="๋๊ฝ์น์ฆ๋๊น์ค"></Item>
<Item name="๋งค์ด๋๊น์ค"></Item>
</Category>
</div>
);
}
export default App;
๋ฐฐ์ด์ ์ ๋ฌํ๋ ค๋ฉด ์ด๋ป๊ฒํ์ง?
์๋ฐ์คํฌ๋ฆฝํธ์ map() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์!
map ๋ฉ์๋๋ ๋ฐฐ์ด ์์๋ค์ ์ํํ๋ฉด์ ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ฑฐ๊ธฐ์ ๋์จ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์ ์๋ก์ด ๋ฐฐ์ด์ ๋ฐํํ๋ค.
๋ฐฐ์ด ์ํ ์ ์ปดํฌ๋ํธ์ key๊ฐ์ ๊ผญ ๋ง๋ค์ด์ฃผ์!
๋ฐฐ์ด์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋, key๊ฐ ์๋ค๋ฉด ์์ฑ๋ ์ปดํฌ๋ํธ๋ค์ ๋ชจ๋ ์ํํ๋ฉฐ ๋ฐ์ดํฐ๋ฅผ ๋ง์ถ๋๋ฐ ๊ต์ฅํ ๋นํจ์จ์ ์ด๋ค.
key๊ฐ์ด ์๋ค๋ฉด ํด๋น key ์์ฑ์ ๊ฐ์ง ์ปดํฌ๋ํธ์ ๋ฐ๋ก ์ ๊ทผํ์ฌ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ก ์ ๋ฐ์ดํธํ๊ธฐ ๋๋ฌธ์ ํจ์จ์ ์ด๋ค.
๋ฐ๋ผ์ key๊ฐ์ ๊ณ ์ ๊ฐ์ด์ด์ผํ๊ณ , key๋ก ์ฌ์ฉํ ๋งํ ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด ๋ฐฐ์ด์ index๋ฅผ key๊ฐ์ผ๋ก ์ก์์ฃผ์.
// /src/components/Category.js
import React from "react";
//์์ดํ
์ปดํฌ๋ํธ ์์ฑ
function Item({ name }) {
return (
<p> {name} </p>
);
}
//์์ดํ
์ด๋ฆ ๋ฐ์ดํฐ๋ฅผ ์ํํ๋ฉฐ ์์ดํ
์ปดํฌ๋ํธ ๋ฆฌ์คํธ๋ฅผ ๋ฐํํ๋ค.
function Items({ itemNames }){
let items = itemNames.map(function (itemName, index){
return (
<Item name={itemName} key={index}></Item>
);
});
return items;
}
//์นดํ
๊ณ ๋ฆฌ ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๋ค
function Category({ name, bgColor, children }){
const style = {
backgroundColor: bgColor,
padding: '5px',
margin: '10px 0px'
};
return (
<div style={style}>
<h3> { name } </h3>
{ children }
</div>
);
}
//์นดํ
๊ณ ๋ฆฌ props์ bgColor ๋ฐ์ดํฐ๊ฐ ์๋ค๋ฉด pink๋ก ๊ธฐ๋ณธ๊ฐ ์ค์
Category.defaultProps = {
bgColor: 'pink'
}
export { Category, Items };
// /src/App.js
import './App.css';
import { Category, Items } from "./components/Category.js";
const contentList = [
{
categoryName:"ํ์คํ",
ItemNames:["๊น๋ฅด๋ณด๋๋ผ", "ํ ๋งํ ํ์คํ", "๋ด๊ณจ๋ ํ์คํ"]
},
{
categoryName:"๋๊น์ค",
ItemNames:["๋๊ฝ์น์ฆ๋๊น์ค", "๋งค์ด๋๊น์ค"]
},
{
categoryName:"ํผ์",
ItemNames:["๊ณ ๊ตฌ๋งํผ์", "ํํ๋ก๋ํผ์", "ํฌํ
์ดํ ํผ์"]
}
];
function App() {
//contentList๋ฅผ ์ํํ๋ฉฐ ์นดํ
๊ณ ๋ฆฌ ์ปดํฌ๋ํธ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
let categoryList = contentList.map(function (menu, index){
return (
<Category name={menu.categoryName} key={index}>
<Items itemNames={menu.ItemNames}></Items>
</Category>
);
});
return (
<>
{ categoryList }
</>
);
}
export default App;
์ฐธ๊ณ
'๐ Front > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] Element. ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ค์ ๋ ๋๋งํ์ (0) | 2023.02.04 |
---|---|
[React] JSX(JavaScript XML) ๋ฌธ๋ฒ (0) | 2023.01.27 |
[React] ํ๋ก์ ํธ ์ ํ (0) | 2023.01.05 |