Components
✅ 컴포넌트를 선언하는 방식은 두 가지가 있다
1️⃣ 함수 컴포넌트 2️⃣ 클래스형 컴포넌트
✅ 컴포넌트는 여러 개일 수 있다
함수 컴포넌트
function Wlecome(props) {
return <h1> Hello, {props.name} </h1>
}
클래스형 컴포넌트 - render 함수가 반드시 있어야 함
class Welcome extends React.Component {
render () {
return <h1> Hello, {this.props.name} </h1>;
}
}
그렇다면 이제 첫 컴포넌트 생성해봅시다!
1️⃣ 파일 만들기 2️⃣ 코드 작성하기 3️⃣ 모듈 내보내기 및 불러오기
src 디렉토리에 MyComponent.js 파일 생성하기
component 폴더 생성 👉 MyComponent.js 파일 생성
파일에 코드 작성하기
const MyComponent = () => {
return <div> 나의 새롭고 멋진 컴포넌트 </div>;
};
export default MyComponent;
모듈 내보내기 및 불러오기
✅ 모듈 내보내기 ( export )
export default MyComponent;
✅ 모듈 불러오기 ( import )
기존에 App 컴포넌트에 있던 코드를 모두 지우고 작성해보자
< App.js 파일 >
import MyComponent from './MyComponent';
const App = () => {
return <MyComponent />;
};
export default App;
Props (⭐⭐⭐) - 읽기 전용
상위 컴포넌트에서 하위 컴포넌트로 전달하는 매개변수이다
하위 컴포넌트에서 사용할 때는 { }를 이용해서 값을 받을 수 있다
상위 컴포넌트에서는 컴포넌트의 속성값을 동일 이름으로 지정한다
JSX 내부에서 props 렌더링
< MyComponent.js 파일 >
const MyComponent = props => {
return <div> 안녕하세요, 제 이름은 {props.name}입니다. </div>;
};
export default MyComponent;
컴포넌트를 사용할 때 props 값 지정하기
< App.js 파일 >
import MyComponent from './MyComponent';
const App = () => {
return <MyComponent name="React" />;
};
export default App;
결과 : 안녕하세요, 제 이름은 React 입니다.
props 기본값 설정 : defaultProps
const App = () => {
return <MyComponent 지정하지 않음 />;
};
name 값을 지정하지 않았을 때 보여 줄 기본값을 설정하는 것이 defaultProps이다
< MyComponent.js >
const MyComponent = props => {
return <div> 안녕하세요, 제 이름은 {props.name}입니다. </div>'
};
MyComponent.defaultProps = {
name : '홍길동'
};
export default MyComponent;
결과 : 안녕하세요, 제 이름은 홍길동입니다.
태그 사이의 내용을 보여주는 children ( JS의 innerHTML라고 생각하면 됨! )
< App.js >
import MyComponent from './MyComponent';
const App = () => {
return <MyComponent>리액트</MyComponent>;
};
export default App;
< MyComponent.js >
const MyComponent = props => {
return (
<div>
안녕하세요, 제 이름은 {props.name}입니다. <br />
children 값은 {props.children}
입니다.
</div>
);
};
MyComponent.defaultProps = {
name: '홍길동'
};
export default MyComponent;
결과 : 안녕하세요, 제 이름은 홍길동입니다.
children 값은 리액트입니다
비구조화 할당 문법을 통해 props 내부 값 추출하기
< MyComponent.js >
const MyComponent = props => {
const { name, children } = props;
return (
<div>
안녕하세요, 제 이름은 {name}입니다. <br />
children 값은 {children}
입니다.
</div>
);
};
MyComponent.defaultProps = {
name: '홍길동'
};
export default MyComponent;
위처럼 객체에서 값을 추출하는 문법을 비구조화 할당이라고 한다(구조 분해 문법)
const MyComponent = props => {
const { name, children } = props; // destructuring
}
코드를 다시 수정해보면
< MyComponent.js >
const MyComponent = ({ name, children }) => {
return (
<div>
안녕하세요, 제 이름은 {name}입니다. <br />
children 값은 {children}
입니다.
</div>
);
};
MyComponent.defaultProps = {
name: '홍길동'
};
export default MyComponent;
매개변수 부분에 비구조화 할당 문법을 사용하는 것이 더 효율적!
const MyComponent = ( { name, children } ) => { }
propTypes를 통한 props 검증
컴포넌트의 필수 props를 지정하거나 props의 타입을 지정할 때는 propTypes를 사용한다
(defaultProp을 설정하는 것과 비슷)
< MyComponent.js >
import PropTypes from 'prop-types';
const MyComponent = ({ name, children }) => {
return (
<div>
안녕하세요, 제 이름은 {name}입니다. <br />
children 값은 {children}
입니다.
</div>
);
};
MyComponent.defaultProps = {
name: '홍길동'
};
MyComponent.propTypes = {
name: PropTypes.string
};
export default MyComponent;
MyComponent.propTypes = { name: PropTypes.string };
name값은 무조건 문자열 형태로 전달해야 된다는 것을 의미한다!
👩💻 만약에 name값에 문자열을 넣지 않고 숫자를 넣는다면 어떻게 될까?
< App.js >
import MyComponent from './MyComponent';
const App = () => {
return < MyComponent name = {3} > 리액트 </MyComponent>;
};
export default App;
컴포넌트에 설정한 props가 propTypes에서 지정한 형태와 일치하지 않는다면 값은 나타나지만, 콘솔창에 경고메시지를 출력한다
isRequired를 사용하여 필수 propTypes 설정
propTypes를 지정하지 않았을 때, 경고 메시지를 띄워 주는 작업을 하려면 propTypes를 지정할 때 뒤에 isRequired를 붙여주면 된다
< MyComponent.js >
import PropTypes from 'prop-types';
const MyComponent = ({ name, children }) => {
return (
<div>
안녕하세요, 제 이름은 {name}입니다. <br />
children 값은 {children}
입니다.
<br />
제가 좋아하는 숫자는 {favoriteNumber}입니다.
</div>
);
};
MyComponent.defaultProps = {
name: '홍길동'
};
MyComponent.propTypes = {
name: PropTypes.string,
favoriteNumber: PropTypes.number.isRequired
};
export default MyComponent;
favoriteNumber 값을 number(숫자)를 필수로 하게끔 설정
MyComponent.propTypes = {
name: PropTypes.string,
favoriteNumber: PropTypes.number.isRequired
};
하지만 이렇게 되면 아직 favoriteNumber값을 설정하지 않았기 때문에 경고 메시지가 출력될 것이기에MyComponent에 favoriteNumber값을 제대로 전달해야 한다
< App.js >
import MyComponent from './MyComponent';
const App = () => {
return (
<MyComponent name="React" favoriteNumber = {1}>
리액트
</MyComponent>
);
};
export default App;
클래스형 컴포넌트에서 props 사용하기
클래스형 컴포넌트에서 props를 사용할 때는 render 함수에서 this.props를 조회하면 된다
< MyComponent.js >
import { Component } from 'react';
import PropTypes from 'prop-types';
class MyComponent extends Component {
render() {
const { name, favoriteNumber, children } = this.prop; // 비구조화 할당
return (
<div>
안녕하세요, 제 이름은 {name}입니다. <br />
children 값은 {children}
입니다.
<br />
제가 좋아하는 숫자는 {favoriteNumber}입니다.
</div>
);
}
}
MyComponent.defaultProps = {
name: '홍길동'
};
MyComponent.propTypes = {
name: PropTypes.string,
favoriteNumber: PropTypes.number.isRequired
};
export default MyComponent;
✅ 클래스형 컴포넌트에서 defaultProps와 propTypes를 설정할 때 class 내부에서 지정하는 방법도 있다
< MyComponent.js >
import { Component } from 'react';
import PropTypes from 'prop-types';
class MyComponent extends Component {
static defaultProps = {
name: '홍길동'
};
static propTypes = {
name: PropTypes.string,
favoriteNumber: PropTypes.number.isRequired
};
render( ){
const { name, favoriteNumber, children } = this.props; // 비구조화 할당
return (...);
}
}
export default MyComponent;
👩💻그런데 왜 props는 const로 변수를 지정하는 걸까?
const { name, favoriteNumber, children } = this.prop;
👉 props는 자식에서 값이 바뀌면 안 되기 때문에 const로 변수 지정하는 것이 좋다!
'React' 카테고리의 다른 글
[React] 라우터 (useNavigate, Navigate, Link 등) (1) | 2023.01.20 |
---|---|
[React] Hook(훅) - useState, useEffect, useRef, useReducer (0) | 2023.01.18 |
[React] state와 이벤트 핸들링 (0) | 2023.01.16 |
[React] JSX 문법 알고 싶으면 이리온 : ) (0) | 2023.01.15 |
[React] 리액트 다운로드하고 실행시키기 (0) | 2023.01.15 |