컴포넌트에 데이터를 전달하는 프로퍼티
- 프로퍼티 기초 알아보기
import React from 'react'; import PropTypes from 'prop-types'; class PropsComponent extends React.Component { render() { return <div className="message-container">{this.props.name}</div>; } } // 자료형을 선언하는 예제 PropsComponent.propTypes = { name: PropTypes.string, }; export default PropsComponent;
import './App.css'; import { Component } from 'react'; import PropsComponent from './03/PropsComponent'; class App extends Component{ render(){ return( <PropsComponent name="두잇 리액트"/> ) } } export default App;

- 다양한 프로퍼티 사용하기
import React, { Component } from 'react'; import PropTypes from 'prop-types'; class ChildComponent extends Component { render() { const { boolValue, numValue, arrayValue, objValue, nodeValue, funcValue } = this.props; return ( <div> <span>불리언 값 : {boolValue}</span> <span>숫자값 : {numValue}</span> <span>배열값 : {arrayValue}</span> <span>객체값 : {String(objValue)}</span> <span>노드값 : {nodeValue}</span> <span>함수값 : {String(funcValue)}</span> </div> ); } } ChildComponent.propTypes = { boolValue: PropTypes.bool, numValue: propTypes.number, arrayValue: PropTypes.arrayOf(PropTypes.number), objValue: PropTypes.object, nodeValue: PropTypes.node, funcValue: PropTypes.func, }; export default ChildComponent;
import './App.css'; import { Component } from 'react'; import ChildComponent from './03/ChildComponent'; class App extends Component{ render(){ return( <ChildComponent boolValue={true} numValue={1} arrayValue={[1,2,3]} objValue={{ name : '제목', age : 30}} nodeValue={<h1>노드</h1>} funcValue={()=> { console.log('메시지'); }} /> ) } } export default App;

결과값은 같지만 개발자간의 실수를 줄이기 위해 변수에 객체를 담아 전달하는 아랫 방식을 선호한다.
import './App.css'; import { Component } from 'react'; import ChildComponent from './03/ChildComponent'; class App extends Component{ render(){ const array=[1,2,3]; const obj = {name : '제목', age:30}; const node = <h1>노드</h1>; const func = () => { console.log('메시지'); }; return( <ChildComponent boolValue={true} numValue={1} arrayValue={array} objValue={obj} nodeValue={node} funcValue={func} /> ) } } export default App;
- 불리언 프로퍼티 사용하기
=> 실무에서 자주 사용하므로 알아두기
import React, { Component } from 'react'; class BooleanComponent extends Component { render() { const message = this.props.bored ? '놀러가자' : '하던 일 열심히 마무리하기'; return <div className="message-container">{message}</div>; } } export default BooleanComponent;
import { Component } from 'react'; import BooleanComponent from './03/BooleanComponent'; class App extends Component { render() { return ( <div> <div> <b>지루할 때 :</b> <BooleanComponent bored /> </div> <div> <b>즐거울 때 :</b> <BooleanComponent /> </div> </div> ); } } export default App;

- 객체형 / 필수 프로퍼티 사용하기
import React from 'react'; import PropTypes from 'prop-types'; class ChildComponent2 extends React.Component { render() { const { objValue, requiredStringValue } = this.props; return ( <div> <div>객체값: {String(Object.entries(objValue))}</div> <div>필수값: {requiredStringValue}</div> </div> ); } } ChildComponent2.propTypes = { // 객체형 프로퍼티 objValue: PropTypes.shape({ name: PropTypes.string, age: PropTypes.number, }), // 필수 프로퍼티 requiredStringValue: PropTypes.string.isRequired, }; export default ChildComponent2;
import { Component } from 'react'; import BooleanComponent from './03/BooleanComponent'; import ChildComponent2 from './03/ChildComponent2'; class App extends Component { render() { return ( <div> <ChildComponent2 objValue={{ age: '20살' }} /> </div> ); } } export default App;

age에 number가 아닌 String을 대입한 에러1과, 필수 프로퍼티로 지정한 RequiredStringVaule에 값이 전달되지 않아서 에러가 나게 됐다.
import { Component } from 'react'; import BooleanComponent from './03/BooleanComponent'; import ChildComponent2 from './03/ChildComponent2'; class App extends Component { render() { return ( <div> <ChildComponent2 objValue={{ age: 20 }} requiredStringValue="문자" /> </div> ); } } export default App;

수정해주니까 에러 사라짐~
컴포넌트 상태 관리하기
1. state로 상태관리하기.
import React from "react"; class StateExample extends React.Component { constructor(props) { super(props); // 상태 정의 this.state = { loading: true, formData: "no data", }; // 이후 콜백 함수를 다룰때 bind를 선언하는 부분에 대해 다룹니다 this.handleData = this.handleData.bind(this); // 생성 후 4초 후에 handleData를 호출합니다. setTimeout(this.handleData, 4000); } handleData() { const data = "new data"; const { formData } = this.state; // 상태 변경 this.setState({ loading: false, formData: data + formData, }); // this.state.loading 은 현재 true 입니다. // 이후 호출될 출력함수에서의 this.state.loading은 false입니다. } // 다음과 같이 setState함수를 사용할 수 있습니다. // handleData(data) { // this.setState(function(prevState) { // const newState = { // loading : false, // formData: data + prevState.formData, // }; // return newState; // }); // } render() { return ( <div> {/* 상태 데이터는 this.state로 접근 가능합니다. */} <span>로딩중: {String(this.state.loading)}</span> <span>결과: {this.state.formData}</span> </div> ); } } export default StateExample;


state를 사용할 떄 주의점
: 생성자에서 반드시 초기화 해야 한다.
: state값을 변경할 떄는 setState()함수(상태관리함수)를 반드시 사용해야함
: setState()함수는 비동기로 처리되며, setState() 코드 이후로 연결된 함수들의 실행이 완료된 시점에
화면 동기화 과정을 거친다.
2. 클래스 인스턴스 변수와 forceUpdate()함수로 State관리하기
import React from "react"; class ForceUpdateExample extends React.Component { constructor(props) { super(props); //state 정의 this.loading = true; this.formData = "no data"; //이후 콜백 함수를 다룰 때 bind를 선언하는 부분에 대해 다룹니다 this.handleData = this.handleData.bind(this); // 4초후 호출 setTimeout(this.handleData, 4000); } handleData() { const data = "new data, "; //state 변경 this.loading = false; this.formData = data + this.formData; // 컴포넌트 내장 함수 forceUpdate()를 호출하여 강제로 화면을 새로고침 한다. this.forceUpdate; } render() { return ( <div> {/* 상태 데이터는 this.state로 접근 가능합니다. */} <span>로딩중: {String(this.state.loading)}</span> <span>결과: {this.state.formData}</span> </div> ); } } export default ForceUpdateExample; C;
위에 것과 결과는 같지만 리액트 성능에 제약이 있으므로, 매번 새롭게 화면을 출력해야 되는 경우가 아니라면
가급적 사용하지 않기를 권한다고 한다
'front-end > react' 카테고리의 다른 글
[리액트] create-react-app (0) | 2021.03.15 |
---|---|
[리액트] 웹팩 webpack (0) | 2021.03.15 |
[리액트] 바벨 babel (0) | 2021.03.14 |
[리액트] 기본 렌더링 (0) | 2021.03.14 |
[리액트] Target container is not a DOM element. 에러 (0) | 2021.03.14 |
[리액트] 개발환경 설치하기 (0) | 2021.03.12 |
[리액트] 기본 (0) | 2021.03.12 |