본문 바로가기
React

230113 React 컴포넌트(Components), Props

App.js가 여러개면 안되니까 이전까지 한 것 이름 바꿈.

 

컴포넌트(Components)

화면의 부분부분을 재활용해서 사용하기 위해, 자식 요소로 만듦
App에서 자식을 만들고, 그 자식에서 또다시 부분부분을 컴포넌트로.
->전체화면을 리렌더링하는걸 피하기 위해 변경하고 싶은 부분을 하나하나 자식컴포넌트로 만들고,
 그 부분에서 재활용할 부분을 자식요소로.
 
컴포넌트는 만들 때 앞글자를 대문자로 만드는 것이 규칙


컴포넌트는 함수형, 클래스형 2가지이다.

함수형

MyComponent

/*
페이지 87p
컴포넌트 선언방법은 크게 2가지(함수형, 클래스)
컴포넌트는 여러개일 수 있습니다.

모듈 내보내기 export default
모듈 가져오기 import ~~from 경로

p.96 (프롭스)
1. 상위 컴포넌트에서 하위 컴포넌트로 전달하는 매개변수
2. 객체형태로 전달되기 때문에 {}로 값을 받습니다.
3. props는 읽기 전용입니다. (값을 부모에서 바꿔서 전달합니다.)
*/

import { Fragment } from "react";
import PropTypes from 'prop-types';//프롭스 타입검증

const MyComponent = (/* props */{ name, age, email, addr}) => {
    // console.log(props);/* index.js의 <React.StrictMode>때문에 두번 뜨는 것 */
    //1st
    // const a = props.name;
    // const b=props.age;
    // const c=props.email;

    //2nd
    // const { name, age, email } = props;
    return (
        <Fragment>
            <div>나의 첫번째 컴포넌트</div>
            <div>props값: {name}</div>
            <div>props값: {age}</div>
            <div>props값: {email}</div>
            <div>props값: {addr}</div>{/* 넘어오지 않지만 기본값을 주었기에 사용가능 */}
        </Fragment>
    )
}

 

 

MyComponent2

import { Fragment } from "react";
import '.././App.css'

const MyComponent2 =()=>{

    return(
        <Fragment>
        <h3>나의 두번째 컴포넌트</h3>
            <div className="App">
                <strong style={{fontStyle:'italic', color:'#777', marginLeft:100}}>컴포넌트는 여러개가 가능</strong>
                <p style={{color:'aqua', backgroundColor:'teal'}}>분할사용을 통해 필요하면 복사, 또는 각주처리가 가능</p>
            </div>
            <input type="text" placeholder="혼자쓰는태그는 닫아주기"/>
        </Fragment>
    )

}

export default MyComponent2;


클래스형


모듈내보내기-외부에서 사용할 모듈 이름을 지정함 : export default 이름
모듈불러오기-부모컴포넌트에서 사용 : import 이름 from 경로;

이러면
이름을 태그처럼 사용할 수 있다.
ex)<컴포넌트이름/>

 

MyComponent3

import { Component } from "react";

class MyComponent3 extends Component{

    //클래스형 컴포넌트가 제공해주는 render함수 안에서 return문을 작성
    render(){
        return(
            <div>나의 클래스형 컴포넌트</div>
        )
    }
}

export default MyComponent3;

★★★props

상위 컴포넌트에서 하위 컴포넌트로 전달하는 매개변수
하위 컴포넌트에서 사용할 때는 {}를 이용해서 값을 받을 수 있다.
상위 컴포넌트에서는 컴포넌트의 속성값을 동일이름으로 지정한다.
+)자식에서 부모로 올리는 건 굉장히 까다롭다.

//상위
const App = () => {
    return ( 
     <Fragment>
         <MyComponent name={"홍길동"} age={2} email={"aa@naver.com"}/>
     </Fragment>
    )
}

//하위
const MyComponent = ( {name, age, addr, email} ) => {
   return (
        <div>
            나의 첫번째 컴포넌트<br/>
            프로퍼티1:{name}<br/>
            프로퍼티2:{age}<br/>
            기본값 프로퍼티3:{addr}<br/>
        </div>
   )


구조분해할당으로 props를 받는 것.

상위 컴포넌트에서 하위 컴포넌트로 전달하는 매개변수
객체형태로 전달되기 때문에 {}로 값을 받음
props는 읽기 전용임. (값을 부모에서 바꿔서 전달해야 한다.)


props의 기본값 설정하기(주의-대소문자 정확하게 구분함)
컴포넌트명.defaultProps={}
export하는 함수 바깥에서 만든다. 
지금은 좋아져서 괜찮은데 옛날엔 props값이 하나라도 넘어오지 않으면 에러가 발생했다. 때문에 기본값을 주는 것.


props의 타입검증(주의-대소문자 정확하게 구분함)
컴포넌트명.propTypes={변수명:PropsTypes.타입이름}
정확하게 이러이러한 타입으로 지정하라고 강요할 수 있다.
.isRequired는 반드시 전달

따르지 않으면 콘솔창에서 경고를 보여줌


자동완성이 안됨. import PropTypes from 'prop-types';를 넣어줘야 함.
사용가능한 속성은 React 공식홈페이지에서 확인

타입검증은 넣지 않더라도 문제는 되지 않음. 개발자 입장에서 좋다.

 

MyComponent

/* props의 기본값 지정하기. 컴포넌트명.defaultProps={} */
MyComponent.defaultProps={
    name:"이름없음",
    age:0,
   /*  email:"지정안됨", */
    addr : "서울시" //addr은 전달되지 않지만 기본값 지정 가능
}

/* props의 타입검증 컴포넌트명.propTypes={}*/
MyComponent.propTypes={
    name:PropTypes.string,
    age:PropTypes.number,
    email:PropTypes.string.isRequired//문자열 타입, 반드시 전달
}

export default MyComponent;

 

 

 

 


App.js

import { Fragment } from "react";
import MyComponent from "./component/MyComponent";
import MyComponent2 from "./component/MyComponent2";
import MyComponent3 from "./component/MyComponent3";


const App = () => {

    return (
        <Fragment>
            <h3>나의 App.JS</h3>
            {/*<MyComponent/>*/}
            {/* props */}
            <MyComponent name={"홍길동"} age={20} email={"aaa@naver.com"}/>
            <MyComponent2/>
            <MyComponent3/>
        </Fragment>
    )

}

export default App; //내보내기

'React' 카테고리의 다른 글

230116 React State class형  (0) 2023.01.16
230116 React State  (0) 2023.01.16
230116 React 컴포넌트 합성  (0) 2023.01.16
230113 React JSX  (0) 2023.01.13
230113 React 개념과 설치  (1) 2023.01.13