type
과props
를 가지는 React의 객체
React.createElement(type, props, ...children)
를 이용하여 만들어진 객체// createElement를 이용해서 React Element 만들기
React.createElement(
'div',
{ className: 'name' },
'React'
)
// createElement를 이용해서 만들어진 React Element 객체
{
type: 'div',
props: {
className: 'name',
children: 'React'
}
}
개념상으로는 자바스크립트 함수와 같으며, 매개변수(Props)를 받아들여, React Element 를 리턴한다.
Component를 만드는 두 가지 방법
// 함수기반
function FCHello() {
return (
<div>
<h1>Hello Functional Component!</h1>
</div>
);
}
// class 기반
class CCHello extends React.Component {
render() {
return (
<div>
<h1>Hello Class Component!</h1>
</div>
);
}
}
const App: React.FC = () => { }
로 컴포넌트를 선언(함수표현식)function()
키워드를 사용해서 선언(함수선언식)// 호이스팅 예시
foo() // 작동
foo2() // 에러
function foo(){
console.log("foo")
}
var foo2 = function(){
console.log("foo2")
}
화살표형 함수를 통해 컴포넌트 만드는 방법(함수표현식방식)
children
이 들어가있다.children
이 옵셔널 형태로 들어가있다보니 컴포넌트의 props 의 타입이 명백하지 않다.children
이 필요한 컴포넌트가 있고 있으면 안되는 컴포넌트들이 있을 것defaultProps
가 제대로 동작하지 않는다// Props 타입 지정
type GreetingProps = {
name: string;
children: React.ReactNode;
};
// defaultProps 동작하지 않음
Greetings.defaultProps = {
mark: "!",
};
// 비구조할당 과정으로 defaultProps 를 해주어야함
const Greetings: React.FC<GreetingsProps> = ({ name='홍길동', mark }) => (
<div>
Hello, {name} {mark}
</div>
);
children
이 옵셔널 형태로 들어가있다보니까 어찌 보면 컴포넌트의 props 의 타입이 명백하지 않다.import React from 'react';
type GreetingsProps = {
name: string;
mark: string;
};
const Greetings: React.FC<GreetingsProps> = ({ name, mark = '!' }) => (
<div>
Hello, {name} {mark}
</div>
);
export default Greetings;
구조 해석
GreetingsProps 인터페이스를 정의
GreetingsProps인터페이스, 즉 {name: string, mark: string}
타입을 제네릭 인자로 전달
클래스 구현부쪽의 매개변수로 받아 비구조할당하는 과정에서, 인자에 문자열 name과 mark 이 있다는 것을 보장할 수 있는데, 전달한 props가 모양을 알려 주었기 때문
함수선언식 방식으로 컴포넌트 만드는 방법
import React from 'react';
type GreetingsProps = {
name: string;
mark: string;
};
function Greetings({ name, mark }: GreetingsProps) {
return (
<div>
Hello, {name} {mark}
</div>
);
}
Greetings.defaultProps = {
mark: '!'
};
export default Greetings;
Props는 상위 컴포넌트가 하위 컴포넌트에게 넘겨주는 일종의 변수
Props 는 property의 줄임말
사용시 주의할 특징
class App extends React.Component {
render() {
return (
<>
<FCHello name="Function Component" />
<CCHello name="Class Component" />
</>
);
}
}
// 함수기반 컴포넌트
function FCHello(props) {
return (
<>
<h1>Hello {props.name}!</h1>
</>
);
}
// 클래스기반 컴포넌트
class CCHello extends React.Component {
render() {
return (
<>
<h1>Hello {this.props.name}!</h1>
</>
);
}
}
<h1>Hello {props.name}!</h1>
이렇게 접근하는게 길고 복잡하기 때문에 비구조할당 문법을 사용// 함수기반 컴포넌트
function FCHello({ name }) { // props > {name} 으로 변경
return (
<>
<h1>Hello { name }!</h1> {/* props.name 이 아닌 name으로 접근 */}
</>
);
}
defaultProps
라는 값을 설정import React from 'react';
function Hello({ name }) {
return <div>안녕하세요 {name}</div>
}
// defaultProps
Hello.defaultProps = {
name: '이름없음'
}
export default Hello;
props.children
을 조회사용해보기
App.js
import React from 'react';
import Hello from './Hello';
import Wrapper from './Wrapper';
function App() {
return (
<Wrapper>
<Hello name="react" color="red"/>
<Hello color="pink"/>
</Wrapper>
);
}
export default App;
Wrapper.js
import React from 'react';
function Wrapper({ children }) {
const style = {
border: '2px solid black',
padding: '16px',
};
return (
<div style={style}>
{children}
</div>
)
}
export default Wrapper;