Front-End/React

React] Component & JSX

์™•๊ฐ€๐Ÿ‘ 2023. 6. 4. 19:39
728x90
๋ฐ˜์‘ํ˜•

Component

ํ™”๋ฉด ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•  ๋•Œ, ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ํ•œ ๋ฒˆ์— ๊ทธ๋ฆฌ๊ฒŒ ๋˜๋ฉด, ํ•˜๋‚˜์˜ ์†Œ์ŠคํŒŒ์ผ์— ๋งŽ์€ ์–‘์˜ ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด UI๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์†Œ์Šค๋ฅผ ์—ฌ๋Ÿฌ ์กฐ๊ฐ์œผ๋กœ ๋‚˜๋ˆ ์„œ ์ž‘์„ฑํ•˜์—ฌ ๊ฐ€์ ธ๋‹ค ์“ฐ๊ฒŒ ๋˜๋Š”๋ฐ ์ด๋ฅผ Component(์ปดํฌ๋„ŒํŠธ)๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

Component๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฒ”์œ„๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ, ๋ฒ„ํŠผํ•˜๋‚˜๊นŒ์ง€๋„ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž์˜ ๋Šฅ๋ ฅ์ด๋ผ๊ณ  ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆˆ ์—ฌ๋Ÿฌ ๊ฐœ์˜ Component๋ฅผ ๋ชจ์•„ ํ•œ ๊ฐœ์˜ ํŽ˜์ด์ง€๋กœ ๋งŒ๋“ค๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

React์—์„œ ์ œ๊ณตํ•˜๋Š” Component ๋ฐฉ์‹์ดClass Component์™€ Function Component 2๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์ง€๋งŒ,

์ฃผ๋กœ Function Component๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, Class Component๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์•„๋งˆ ๊ธฐ๊ฐ„์ด ์ข€ ๋œ ์ฝ”๋“œ์ด์ง€ ์•Š์„๊นŒ ์ƒ๊ฐ ๋“ญ๋‹ˆ๋‹ค.

 

์ฃผ์˜์‚ฌํ•ญ

  • ํ•จ์ˆ˜์˜ ์ด๋ฆ„์€ ๋Œ€๋ฌธ์ž๋กœ ์‹œ์ž‘
  • ์†์„ฑ๋ช…์€ camelCase๋ฅผ ์‚ฌ์šฉ
  • JS์—์„œ ์‚ฌ์šฉ๋˜๋Š” this๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

 

 


 

 

์˜ˆ

๊ฐ„๋‹จํ•˜๊ฒŒ 2๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์„œ 1๊ฐœ์˜ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด๋ดค์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅํ™”๋ฉด

import Title from "../component/title";
import Content from "../component/content";

function HelloWorld() {
  return (
    <>
      <Title language="kor"></Title>
      <Content></Content>
    </>
  );
}

export default HelloWorld;
// title.jsx

function Title(props) {
  const hello = "์•ˆ๋…•ํ•˜์„ธ์š”";

  return (
    <h2>
      {props.language}: {hello}
    </h2>
  );
}

export default Title;
// content.jsx

function Content() {
  return <p>๋ฐ˜๊ฐ‘์Šต๋‹ˆ๋‹ค. Front-End Developer ์™•๊ฐ€ ์ž…๋‹ˆ๋‹ค.</p>;
}

export default Content;

 

 


 

 

JSX

React์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฌธ๋ฒ•์œผ๋กœ HTML์ฒ˜๋Ÿผ ์ƒ๊ฒผ์œผ๋‚˜ JS์ž…๋‹ˆ๋‹ค.

Component์—์„œ XMLํ˜•ํƒœ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด babel์ด JSX → JS๋กœ ๋ณ€ํ™˜ํ•ด ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

babel์€ JS์˜ ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
React์—์„œ ์‚ฌ์šฉ๋˜๋Š” JSX๋ฌธ๋ฒ•์„ JS๋ฌธ๋ฒ•์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๊ฒŒ ๋˜๋ฉฐ,
CRA(create-react-app)๋กœ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ, babel, webpack ๋“ฑ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ™์ด ์„ค์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

 

 


 

 

์˜ˆ

๋‹ค์Œ ์ฝ”๋“œ๋Š” CRA(create-react-app)๋กœ ์ƒ์„ฑ๋œ App.js ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.

์•„๋ž˜์™€ ๊ฐ™์ด HTML๊ณผ ๊ฐ™์ด ํƒœ๊ทธ ํ˜•์‹์œผ๋กœ ์ƒ๊ฒผ์œผ๋ฉฐ, return์—๋Š” ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

 

์—๋Ÿฌ ๋ฐ ๊ฐœ์„ 

// return์— divํƒœ๊ทธ๋ฅผ 2๊ฐœ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ ๋ฐœ์ƒ
function App() {
  return (
    <div className="App">
      ํ…Œ์ŠคํŠธ
    </div>
    <div>
      ํ…Œ์ŠคํŠธ
    </div>
  );
}
// ์•„๋ž˜์™€ ๊ฐ™์ด divํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ Fragmentํƒœ๊ทธ(๋นˆํƒœ๊ทธ)๋ฅผ ์ถ”๊ฐ€
return (
  <div>
    <div className="App">
      ํ…Œ์ŠคํŠธ
    </div>
    <div>
      ํ…Œ์ŠคํŠธ
    </div>
  </div>
);
// ๋˜๋Š”
return (
  <Fragment> {/* <> JSX์•ˆ์—์„œ์˜ ์ฃผ์„์ฒ˜๋ฆฌ */}
    <div className="App">
      ํ…Œ์ŠคํŠธ
    </div>
    <div>
      ํ…Œ์ŠคํŠธ
    </div>
  </Fragment> // </>
);

 

 


 

 

๋ณ€์ˆ˜์‚ฌ์šฉํ•˜๊ธฐ

JSX์—์„œ return ํ•ด์ค„ ๋•Œ, ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ์—๋Š” {๋ณ€์ˆ˜} ์ค‘๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

(`hello`๋ผ๋Š” ๋ณ€์ˆ˜ ์‚ฌ์šฉ)

import logo from './logo.svg';
import './App.css';

function App() {
  const hello = "์•ˆ๋…•ํ•˜์„ธ์š”.";
  return (
    <div className="App">
      <p>
        Edit <code>src/App.js</code> and save to reload.
        {hello}
      </p>
    </div>
  );
}

export default App;

 

 


 

 

์กฐ๊ฑด๋ฌธ

return๋ฌธ ์•ˆ์—์„œ๋Š” if๋ฌธ์ด ์•„๋‹Œ ์‚ผํ•ญ์—ฐ์‚ฐ์ž ๋˜๋Š” ๋ณดํ˜ธ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

return (
  <div>
    <img src="์ฃผ์†Œ" className={condition ? 'imageHighlight' : 'image'} />
    {condition && <button onClick={onClickButton}>ํด๋ฆญ</button>}
  </div>
);

 

 


 

 

CSS

ํƒœ๊ทธ์— css์ž…๋ ฅ์€ class๊ฐ€ ์•„๋‹Œ className์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (class๋Š” JS ์•ฝ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋จ)

className์— cssํŒŒ์ผ์— ์„ ์–ธ๋œ name์„ ์ ์šฉ์‹œ์ผœ๋„ ๋˜๊ณ , (labelํƒœ๊ทธ์˜ ๊ฒฝ์šฐ for ๋Œ€์‹  htmlFor ์‚ฌ์šฉ)

style์„ ๋ณ€์ˆ˜์— ๋‹ด๊ฑฐ๋‚˜ inline์Šคํƒ€์ผ๋กœ ์ง์ ‘ ๋„ฃ์–ด์ค˜๋„ ๋˜๋‚˜,

CSSํŒŒ์ผ์—์„œ ์ฒ˜๋Ÿผ ์Šคํƒ€์ผ ์ด๋ฆ„์— -(ํ•˜์ดํฐ)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์นด๋ฉœํ‘œ๊ธฐ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ

(`appHeaderStyle`๋ผ๋Š” ๋ณ€์ˆ˜ ์‚ฌ์šฉ)

import logo from './logo.svg';
import './App.css';

function App() {
  const appHeaderStyle = {
    backgroundColor: "#282c34",
    minHeight: '100vh',
    display: 'flex',
    flexDirection: 'column',
    alignItems: 'center',
    justifyContent: 'center',
    fontSize: 'calc(10px + 2vmin)',
    color: 'white',
  }
  
  return (
    <div className="App">
      <header className="App-header" style={appHeaderStyle}>
        <img src={logo} className="App-logo" alt="logo"
             style={{
               height: '40vmin',
               pointerEvents: 'none'
        }}/>
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

 

 

728x90

'Front-End > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React] Hook  (0) 2023.06.20
React] Hook : useState  (1) 2023.06.06
React] Hook : props  (1) 2023.06.06
React] Import & export  (0) 2023.06.06
React] React ๋ž€...?  (0) 2023.06.04