๐ŸŽ  Front/React

[React] JSX(JavaScript XML) ๋ฌธ๋ฒ•

์—ฐ_์šฐ๋ฆฌ 2023. 1. 27. 21:46
๋ฐ˜์‘ํ˜•

๋ชฉ์ฐจ

     

     

     

    ์ˆœ์ˆ˜ HTML ํŒŒ์ผ์—์„œ React๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์ž

    ์ผ๋‹จ์€ ์ˆœ์ˆ˜ HTML์—์„œ React๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ์•„๋ณด์ž.

    <!DOCTYPE html>
    <html>
      <head>
        <meta charset="utf-8" />
    
        <title>Hello React!</title>
    
        <script src="https://unpkg.com/react@16/umd/react.development.js"></script>
        <script src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
        <script src="https://unpkg.com/babel-standalone@6.26.0/babel.js"></script>
      </head>
    
      <body>
        <div id="root"></div>
    
        <script type="text/babel">
    
          class App extends React.Component {
            render() {
              return <h1>Hello world!</h1>
            }
          }
          
          ReactDOM.render(<App />, document.getElementById('root'))
    
        </script>
      </body>
    </html>

     

     

     

     

    CDN์œผ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์€ ๋ฌด์Šจ์—ญํ• ์„ ํ•˜๊ณ ์žˆ๋Š”๊ฑธ๊นŒ?

     

    React  - ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค.
    Babel  - ๋ฆฌ์•กํŠธ๋Š” JSX๋ผ๋Š” ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด Babel์ด JSX๋ฅผ JS๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.
    - JSX๋Š” ๋‹ค์Œ์— ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์˜ˆ์ •. ์˜ˆ์ œ์—์„œ  return <h1>Hello world!</h1>  ๋ถ€๋ถ„์ด JSX๊ฐ€ ์‚ฌ์šฉ๋œ ๋ถ€๋ถ„์ด๋‹ค.
    React-DOM - ์ตœ์ข…์ ์œผ๋กœ Babel์„ ํ†ตํ•ด JS๋กœ ๋ณ€ํ™˜๋œ ์ฝ”๋“œ๋ฅผ HTML DOM์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.
     <App/>  ์ด๋Ÿฐ ํƒœ๊ทธ๋Š” HTML์— ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋Ÿฐ ํŠน์ดํ•œ ํƒœ๊ทธ๋“ค์„ HTML DOM์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ค€๋‹ค.

     

     

     

    Script ์„ค๋ช…

    render() : 

    DOM ๋…ธ๋“œ ๋ Œ๋”๋ง ์‹œ ํ•„์ˆ˜๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

    render๋Š” ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค. '' ๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ ๊ธˆ์ง€!!!

     

     

    element = ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ๋‚ด์šฉ (JSX)
    container = element๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ ์ž ํ•˜๋Š” DOM์˜ ์œ„์น˜
    
    ReactDOM.render(element, container);
    ReactDOM.render(element, container, callback);
    //callbackํ•จ์ˆ˜๋Š” ํ•„์ˆ˜ ์•„๋‹˜

    ReactDOM ๋ฉ”์„œ๋“œ๋กœ id๊ฐ€ 'root'์ธ ํƒœ๊ทธ์— <App/>์„ ํ™”๋ฉด์— ๋ Œ๋”๋งํ•ด์ค€๋‹ค.

     

     

     

     

    ์‹คํ–‰๊ฒฐ๊ณผ

    ์˜ค ^ใ…^

    id๊ฐ€ 'root'์ธ ํƒœ๊ทธ ํ•˜์œ„์— <h1>Hello world!</h1> ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

     

     

     

     

     

     

     

    JSX๋Š” ๋ญ์ง€? React Element๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๋ฌธ๋ฒ•

    const element = <h1 className="title"> hi {name}!! ๋ฐ˜๊ฐ€์›Œ </h1>;

    React์—์„œ๋Š” JSX๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, React์‚ฌ์šฉ์ž์˜ ํŽธ์˜๋ฅผ ์œ„ํ•ด Javascript๋ฅผ ํ™•์žฅํ•œ ๋ฌธ๋ฒ•์ด๋‹ค.

    * ๊ณต์‹์ ์ธ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์€ ์•„๋‹ˆ๋‹ˆ ์ฃผ์˜! *

     

    JSX๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Javascript์—์„œ HTML์„ ๋” ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

    JSX๋Š” ์‹คํ–‰๋˜๊ธฐ ์ „์— Babel์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๋ฐ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ˜•ํƒœ์˜ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

    (Babel : ๊ณผ๊ฑฐ๋ฒ„์ „ ๋ธŒ๋ผ์šฐ์ €์—์„œ ES6+๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Javascript ์ปดํŒŒ์ผ๋Ÿฌ)

     

     

     

    const element = React.createElement('h1', { className:'title' }, 'hi {name}!! ๋ฐ˜๊ฐ€์›Œ');

    ์œ„์˜ ์ฝ”๋“œ๋ฅผ JSX๋ฌธ๋ฒ• ์—†์ด ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ์—” React.createElement๋ฅผ ์ด์šฉํ•œ๋‹ค.

    ๋‹ค์‹œ๋งํ•ด, JSX๋Š” React Element๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค!

    https://green-labs.github.io/rescript-in-korean/ReScript-React/02-Main-Concepts/01-Elements-and-JSX

     

     

     

    ์•ž์œผ๋กœ JSX๋ฌธ๋ฒ•์„ ์•Œ์•„๋ณผ๊ฑด๋ฐ, ์ €๋ฒˆ์— ๋งŒ๋“ค์—ˆ๋˜ beginํ”„๋กœ์ ํŠธ ํด๋”๋กœ ๋Œ์•„์™€์„œ src/App.js๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด๋œ๋‹ค.

     

     

     

     

    JSX ๋ฌธ๋ฒ•1. ๋ฐ˜๋“œ์‹œ 1๊ฐ€์ง€ ์š”์†Œ๋กœ ๊ฐ์‹ธ์ ธ์•ผํ•œ๋‹ค.

    import logo from './logo.svg';
    import './App.css';
    
    //์ฃผ์„์„ ํ•ด์ œํ•˜๋ฉด ๋ฐ”๋กœ ์—๋Ÿฌ๋ฐœ์ƒํ•œ๋‹ค.
    //function createHeadFail(){
    //    return (
    //    	  <h1>์ œ๋ชฉ1</h1>
    //        <h2>์ œ๋ชฉ2</h2>
    //    );
    //}
    
    //์„ฑ๊ณต
    function createHead(){
        return (
        	<div>
            	<h1>์ œ๋ชฉ1</h1>
            	<h2>์ œ๋ชฉ2</h2>
            </div>
        );
    }
    
    function App() {
        return createHead();
    }
    export default App;

     

    ๋ฆฌ์•กํŠธ๋Š” ๊ฐ€์ƒDOM์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ๊ฐ€์ƒDOM์€ ์ปดํฌ๋„ŒํŠธ์˜ ๋ณ€ํ™”๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด

    ํ•˜๋‚˜์˜ DOM๊ตฌ์กฐ๋กœ ์ด๋ฃจ์–ด์ ธ์•ผํ•œ๋‹ค๋Š” ๊ทœ์น™์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค.

     

     

    ๊ทธ๋Ÿฐ๋ฐ...  ํ•˜๋‚˜์˜ DOM์œผ๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฑด ์•„์ฃผ ํฐ ๋‹จ์ ์„ ๊ฐ€์ง€๊ณ ์žˆ๋‹ค. ์•„๋ž˜ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž

    import logo from './logo.svg';
    import './App.css';
    
    function createTable() {
        return (
            <table>
                <tr>
                    {createColumns()}
                </tr>
            </table>
        );
    }
    
    function createColumns() {
        return (
            <div>
                <td>Hello</td>
                <td>World</td>
            </div>
        );
    }
    
    function App() {
        return createTable();
    }
    export default App;

     

     

    ์ค‘๊ฐ„์— ๋ถˆํ•„์š”ํ•œ <div>ํƒœ๊ทธ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฒ„๋ฆฐ๋‹ค..

    ์ด๋ ‡๊ฒŒ๋˜๋ฉด ์Šคํƒ€์ผ ์ ์šฉ๋„ ๋ณต์žกํ•ด์ง€๊ณ , ๊ตฌ์กฐ ์ž์ฒด๋„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋น„๋Œ€ํ•ด์ง„๋‹ค.

     

     

    ์ด๋Ÿด๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด Fragment์ด๋‹ค.

     

     

     

    JSX ๋ฌธ๋ฒ•1-1. Fragment๋ฅผ ์‚ฌ์šฉํ•˜์ž

    function createColumns() {
        return (
            <>
                <td>Hello</td>
                <td>World</td>
            </>
            //<React.Fragment>๋ฅผ ๋‹จ์ถ•ํ•œ ๊ฒƒ์ด๋‹ค.
        );
    }

     

    ๊น”๋”.

     

     

     

     

    JSX ๋ฌธ๋ฒ•2. JSX ๋‚ด๋ถ€์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๋ ค๋ฉด { }๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ๋‹จ, { }๋‚ด์—์„œ๋Š” if / for๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ๋•Œ๋ฌธ์— ์‚ผํ•ญ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

    function createHead(){
        const name = '์ฒ ์ˆ˜';
        return <h1> {name} </h1>;
    }
    
    function createHead(){
        const name = '์ฒ ์ˆ˜';
        return <h1> { name == '์ฒ ์ˆ˜' ? '์ฒ ์ˆ˜์•ผ ์•ˆ๋…•' : '์˜ํฌ์•ผ ์•ˆ๋…•' } </h1>;
    }
    
    function createHead(){
        const name = '์ฒ ์ˆ˜';
        return <h1> { name == '์ฒ ์ˆ˜' && '์ฒ ์ˆ˜์•ผ ์•ˆ๋…•' } </h1>;
        //์กฐ๊ฑด์ด true์ผ๋•Œ๋งŒ '์ฒ ์ˆ˜์•ผ ์•ˆ๋…•'์„ ๋…ธ์ถœํ•œ๋‹ค.
    }
    
    function createHead(){
        return <h1> { getName() } </h1>;
    }
    
    function getName(){
    	const name = '์ฒ ์ˆ˜';
        return name == '์ฒ ์ˆ˜' ? '์ฒ ์ˆ˜์•ผ ์•ˆ๋…•' : '์˜ํฌ์•ผ ์•ˆ๋…•';
    }

     

     

     

     

     

     

     

    JSX ๋ฌธ๋ฒ•3. JSX๋„ ํ‘œํ˜„์‹์ด๊ธฐ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

    function createHead(){
        const name = '์ฒ ์ˆ˜';
        let response = <h1> ์˜ํฌ์•ผ ์•ˆ๋…• </h1>;
    
        if(name == '์ฒ ์ˆ˜'){
        	response = <h1> ์ฒ ์ˆ˜์•ผ ์•ˆ๋…• </h1>;
        }
        
        return response;
    }

     

     

     

    JSX ๋ฌธ๋ฒ•4. JSX์— CSS ์ ์šฉ์€ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ  camelCase๋กœ ์†์„ฑ ์ ์šฉ

    function createHead(){
    	const style = {
        	backgroundColor: 'yellow',
            fontSize: '3em'
        }
    
        return <div style={style}> ์•ˆ๋…• </div>;
    }

     

     

     

    JSX ๋ฌธ๋ฒ•5. JSX์— Class ์ ์šฉ์€ className์— ์ž‘์„ฑํ•œ๋‹ค

    function createHead(){    
        return <div className="header"> ์•ˆ๋…• </div>;
    }

     

     

     

     

     

     

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