재사용이 가능한 개별적인 여러 조각으로 나누고, 각 조각을 개별적으로 살펴볼 수 있다.함수와 유사.“props”라고 하는 임의의 입력을 받은 후, 화면에 어떻게 표시되는지를 기술하는 React 엘리먼트를 반환.함수형 컴포넌트와 클래스형 컴포넌트, 두 가지 모두 기능상으로는 동일하지만
함수형 컴포넌트를 권장.
결론적으로 리액트 세계에서 말하는 컴포넌트(블럭)는 즉함수이다.
누군가 와서 “컴포넌트를 만들어 보세요" 라고 한다면 우리는html 처럼 생긴 jsx를return 하는 함수를 만들면 됨.
// props라는 입력을 받음
// 화면에 어떻게 표현되는지를 기술하는 React 엘리먼츠를 반환(return)
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
// 훨씬 쉬운 표현을 해보면 아래와 같죠.
function App () {
return <div>hello</div>
}
class Welcome extends React.Component {
render() {
return <h1>Hello, {this.props.name}</h1>;
}
}
밖에서는 내가 필요한 파일을 import 하거나, 또는 export default 라는 기능을 통해 내가 만든 컴포넌트를 밖으로 내보내는 코드가 있음안에서는 자바스크립트를 쓸 수 있는 부분이 있다. return 을 기준으로 아랫부분에서는 HTML (정확히 말하면 JSX.) 을 작성할 수 있다.
부모 컴포먼트, 품어지는 컴포넌트 = 자식 컴포넌트예제
// src/App.js
import React from "react";
function Child() {
return <div>나는 자식입니다.</div>;
}
function App() {
return <Child />;
}
export default App;
App.js 파일 안에서 Child라는 새로운 컴포넌트를 만들었다.
Child 컴포넌트를 App 컴포넌트에서 마치 HTML 태그를 쓰듯이 넣었다.
이렇게 한 컴포넌트 안에 다른 컴포넌트를 넣을 수 있다.
이렇게 코드를 작성하면, 화면에는 “나는 자식입니다” 라는 문장이 보여진다.
이 파일에서 내보내진 (export default) 컴포넌트는 App 컴포넌트 이기때문에 App 컴포넌트가 화면에 보여진다.
그리고 App 컴포넌트는 Child 컴포넌트를 자식으로 삼고 있다.
그래서 결국 자식 컴포넌트에 있는 “나는 자식입니다" 라는 문장이 보여지게 되는 것이다.
만들어진 컴포넌트는 마치 HTML 태그를 쓰듯이 사용하여 화면에 보여지게 할 수 있다. (Rendering)
그리고 이렇게 함수로 만들어진 컴포넌트를 html 태그 사용하듯이 코드를 작성하는 방식이 JSX
// src/App.js
import React from "react";
function Child() {
return <div>연결 성공</div>;
}
function Mother() {
return <Child />;
}
function GrandFather() {
return <Mother />;
}
function App() {
return <GrandFather />;
}
export default App;
JavaScript의 모든 기능이 포함되어 있으며,
React Element를 생성하기 위한 문법 (Element = 화면에 그려지는 HTML적 요소)
const element = <h1>Hello, world!</h1>;
아래 같은 HTML 태그는 .js 파일 안에서 쓸 수 없다.
<div>
<h1>안녕하세요!</h1>
<p>시작이 반이다!</p>
</div>
자바스크립트 안에서 html 태그같은 마크업을 넣어 뷰(UI) 작업을 편하게 할 수 있다.
const start_half = <div>
<h1>안녕하세요!</h1>
<p>시작이 반이다!</p>
</div>;
Q. JSX에서 쓰는 < div> ~~ < /div>는 DOM 요소인가?
A. 정확히는 React 요소
Q. 브라우저는 JS만 해석 가능한게 아닌가?
A. 맞다. 브라우저는 jsx 파일을 직접 해석할 수 없다. 따라서 babel을 이용하여 jsx를 js로 변환함
변환 전 - 우리가 보는 jsx 파일
const element = (
<h1 className="greeting">
Hello, world!
</h1>
);
변환 후 - 브라우저가 보는 js 파일
const element = React.createElement(
'h1',
{className: 'greeting'},
'Hello, world!'
);
import "./App.css";
function App() {
return (
<p>안녕하세요! 리액트 반입니다 :)</p> // return 아래에 p태그를 하나 추가
<div className="App">
<input type='text'/>
</div>
);
}
export default App;
=> 에러남
import "./App.css";
function App() {
return (
<div className="App">
<p>안녕하세요! 리액트 반입니다 :)</p>
<input type="text" />
</div>
);
}
export default App;
=> 에러 안남. 굿. 😎
function App() {
const cat_name = 'perl';
return (
<div>
hello {cat_name}!
</div>
);
}
📢 값을 가져올 때 뿐만 아니라 map, 삼항연산자 등 자바스크립트 문법을 JSX 안에 쓸 때도 {} 사용 가능
import React from 'react';
import logo from './logo.svg';
import './App.css';
function App() {
const number = 1;
return (
<div className="App">
<p>안녕하세요! 리액트 반입니다 :)</p>
{/* JSX 내에서 코드 주석은 이렇게 씀 */}
{/* 삼항 연산자를 사용 */}
<p>{number > 10 ? number+'은 10보다 크다': number+'은 10보다 작다'}</p>
</div>
);
}
export default App;
<div className="App">
📢 html 태그에 스타일을 직접 넣던 것처럼, css 문법 대신 json 형식으로 넣어주면 끝!
<p style="color: orange; font-size: 20px;">orange</p>
// 이렇게 쓰거나,
<p style={{color: 'orange', fontSize: '20px'}}>orange</p>
//혹은 스타일 객체를 변수로 만들고 쓸 수 있다.
function App() {
const styles = {
color: 'orange',
fontSize: '20px'
};
return (
<div className="App">
<p style={styles}>orange</p>
</div>
);
}
📢 중괄호를 두 번 쓰는 이유? 객체도 자바스크립트니까.
