๐ŸŽ  Front/React

[React] Component, Props๋ž€? ํด๋ž˜์Šคํ˜•/ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ, ์ปดํฌ๋„ŒํŠธ์— ๋ณ€์ˆ˜ ์ „๋‹ฌํ•˜๊ธฐ

์—ฐ_์šฐ๋ฆฌ 2023. 2. 4. 16:32
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

     

    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;

     

     

     

     

    ์ฐธ๊ณ 

    https://react.vlpt.us/basic/11-render-array.html

    ๋ฐ˜์‘ํ˜•
    • ๋„ค์ด๋ฒ„ ๋ธ”๋Ÿฌ๊ทธ ๊ณต์œ ํ•˜๊ธฐ
    • ํŽ˜์ด์Šค๋ถ ๊ณต์œ ํ•˜๊ธฐ
    • ํŠธ์œ„ํ„ฐ ๊ณต์œ ํ•˜๊ธฐ
    • ๊ตฌ๊ธ€ ํ”Œ๋Ÿฌ์Šค ๊ณต์œ ํ•˜๊ธฐ
    • ์นด์นด์˜คํ†ก ๊ณต์œ ํ•˜๊ธฐ