Component, props, state

2019. 8. 8. 21:30React

1.Component

컴포넌트는 웹 사이트를 조각 낸 것으로 그 조각 하나하나가 각자 기능을 한다. 

 

유투브의 동영상 플레이어를 예로 든다면 전체를 감싸는 App, 동영상 플레이어 그리고 동영상을 재상하는 부분, 재생목록, 재생목록에서 보여주는 동영상과 그 동영상에 대한 설명이 모두 각각의 컴포넌트이다. 컴포넌트는 잘게 쪼갤수록 좋다. 잘게 쪼갤수록 재사용성이 높아지고 하나의 컴포넌트에서는 하나의 기능만을 함으로 에러를 잡기에도 좋다.

// 함수 컴포넌트

function welcome(props) {
	return <h1>Hello, world!</h1>;
}
//ES6 class 사용 컴포넌트 정의

class Welcome extends React.Component {
	render() {
		return <h1>Hello, {this.props.name}</h1>;
	}
}

2.Props

props는 부모 컴퍼넌트로 부터 물려받는 속성으로 이를 통해 부모 컨포넌트와 소통할 수 있다. 

(동영상 플레이어의 부모는 App이므로 App의 속성을 동영상 플레이어가 이어받는다.)

부모 컨포넌트에서 전달하는 props가 바뀌면 자동으로 업데이트 된다. 

// DOM 태그
const element = <div />;

//사용자 정의 컴포넌트
const element = <Welcome name="Sara" />;

React가 사용자 정의 컴포넌트로 작성한 엘리먼트를 발견하면 JSX 어트리뷰트를 해당 컴포넌트에 단일 객체로 전달한다.

이 객체를 “props”라고 합니다.

render(<Dog name = "siba" birth = {0721}, document.detelementByid("root")

Dog 컴포넌트를 부착하는 부분에서 추가적인 속성으로 name의 속성 값은 "siba"로 birth 의 속성 값은 0721로 주었다.

바로 이것이 props이다. 컴포넌트 내에서 this.props.속성이름 으로 접근이 가능하다.

(위의 Dog 컴포넌트에는 this.props.name this.props.birth 가 있다.)

 

props는 html처럼 기본이 문자열이기 때문에 문자열 외의 자료형을 전달하려면 { }안에 넣어야 한다.

 

defaultProps

 

Dog.defaultProps = {
	lang: "javascript",
};

render() {
	return (
		<div>
			<span> {this.props.lang}는 재밌어! </span>
		</div>
	);
}

defaultProps는 부모 컴포넌트에서 넘겨주는 속성이 없다면 자동으로 defaultProps사 적용되어 defaultProps의 값이 넘어간다.

즉 위의 예시에서는 {this.props.lang} 값에 Dog.defaultProps 에서 lang을 javascript로 만들었기 때문에 javascript가 넘어가서 

javascript는 재밌어! 라는 문장이 완성된다. 

 

propTypes

Basic.propTypes = {
  name: PropTypes.string.isRequired,
  birth: PropTypes.number.isRequired,
  lang: PropTypes.string,
};

PropsTypes 객체는 React의 props 자료형 검사법으로 prop-types 패키지를 따로 설치해야 쓸 수 있다.

PropsTypes에 정의해 두었으면 React가 해당 props가 PropsType의 자료형과 일치하는지를 검사한다.

즉 string으로 되어있는데 number가 들어오면 에러가 나게된다. 

isRequored는 필수라는 뜻으로 반드시 있어야할 속성에 붙여준다. isRequored가 없으면 선택적이라는 뜻이다.

(React 공식문서에서 다양한 PropsTypes를 확인할 수 있다.)

 

Children

const Parent = () => {
  return (
    <div id = "parent"> {this.props.children} </div>
  );
};
<Parent>
  <span>Hello</Hello>
</Parent>

span 태그는 this.props.children과 연결된다. 결과는 다음과 같다.

<div id = "parent"><span>Hello</spane></div>

3.State

class Dog extends React.component{
  construcotr(){
    this.state = {
      hidden: false
    };
  }
}

state는 컴포넌트가 만들어질 때 가장 먼저 설정 되는 것으로 constructor안에 적어준다. state는 해당 컴포넌트에만 적용되는 상태 이다.

props처럼 자동으로 업데이트 된다.

{!this.state.hidden && <span>{this.props.name}님 반갑습니다.</span>}

<button onClick = {() => this.setstate(() = > ({hidden:true}))}> 숨기기 </button>

 jsx 내에서는 if문을 사용할 수 없기에 && 이나 ||을 사용하여 render 여부를 결정할 수 있다.

위 코드는 this.hidden.state의 상태가 false라면 span 태그를 추가하라고 되어 있다.

버튼을 눌렸을 때 hidden state를 true로 만들수 있다. 

(html에서는 onclick이지만 여기에선 onClick이라고 쓴다 대소문자를 확실히 구분하자!!)

 

setState

state를 바꾸려면 setState를 사용해야만 한다.  

this.setState((이전 상태) => ({이름: 바꿀 값})); 

 

setState의 콜백 함수는 매개변수로 이정 상태를 제공한다. 

 

 

'React' 카테고리의 다른 글

JSX  (2) 2019.08.05