propeprty의 줄임말
모든 컴포넌트가 가지고 있는 내장 객체
속성. 부여받는다. 성별 이름. 부모님이 지어주신것. 맘대로 못바꿈
해당 컴포넌트가 가지고 있는 props를 보는 법 : this.props 조금 뒤에 더 설명
props는 부모에서 자식으로 전달해주는 속성이다
자식에서는 이걸 바꿀순 없고 읽을수만 있다
자바스크립트라면 어떤것이든 넘길수있따.(스트링,넘버,불리언,객체,함수 등)
import React from 'react';
import Child from './Child';
class Parent extends React.Component {
introduce = () => {
alert("hello");
}
render(){
return
<div>
<Child name="seonggoo" age={0} introduce={this.introduce} />
// introduce라는 이름으로 저 값을 넘기겠다.
<Child name="kang" age={1}/>;// 속성을 아무거나 넣을수있다.
</div>
// props는 전달할 수 있는 제한이 없다.(위처럼 함수도 넘길수 있다.
// string을 제외한 나머지 것들은 중괄호 안에 넣어줘야 자바스크립트로 인식됨.
// 바껴야 하는 부분들을 props로 전달하면서 같은 컴포넌트의 형식은 유지
}
}
export default Parent;
import React from 'react';
class Child extends React.Component {
render(){
console.log(this.props);// 부모에서 받은것을 활용하려면? -> 객체에 접근하듯이 활용
return
// 부모에서 함수를 만들어서 자식한테 넘겨줄 수 있다.
<div>
<h1 onClick={this.props.introduce}>
Hello {this.props.name} Age : {this.props.age}
</h1>;
</div>
}
}
export default Child;
props와 마찬가지로 얘도 객체
import React from 'react';
import Child from './Child';
class Parent extends React.Component {
render(){
return <Child />;
}
}
export default Parent;
this를 사용하는 순간 그 this를 감싸고 있는 컴포넌트(아래Child에선 Child가 this겠죠)
import React from 'react';
class Child extends React.Component {
constructor() {
super();
this.state = {
titleColor : "blue";
};
}
changeColor = () => {
// 컴포넌트 안에선 error function으로 만들어줘야 함수 안에서의 this가 자기 컴포넌트를 가리킨다.
// constructor 안의 키값과 겹치지만 가장 마지막것으로 덮어 씌워진다.
// render안에서 함수 실행코드 입력
this.setState({ // 항상 setState를 통해 값을 변경해줄수있다. 아래처럼하면 render함수가 실행 안됨
// 뜻 : "우리 지금 state바꿨고 더가 업데이트 해주면돼"라는 명령어
titleColor : "red";
})
this.state.titleColor = "red"; // 콘솔 찍었을때 값은 바뀌지만 render실행이 안돼서 색변경은 안이뤄짐
// 이 함수를 통해서 state를 바꾼다.
// 이미 React.Component가 만들어놓은 함수라 가져다가 쓰는것.
}
render(){
console.log("state >>>>" , this.state); // {titleColor : "red"}
return
<div> // 선언적인 코딩. 이렇게 선언해주면 내부적인 동작은 위에서 알아서 행해준다.
<h1 style={{ color : 'red' }}>hello world</h1>;
<button onClick={this.changeColor}>Change Color!</button>
</div>
// 만약 위의줄을 기존 방식데로 했다면, 버튼을 누르면, document.getElementById 해서 <h1>을 가져온 뒤 개 안의 스타일의 컬러값 바꾼다. 처럼 긴 과정을 거쳐야한다. 이모든 걸 생략하게 해줌.<-- 리액트 쓰는 이유
// 선언적으로 개발자가 어떻게 생겼는지 말만 해주면됨.어떻게 생겼는지 말해줄때 state와 props를 이용해서 말해줌.그러면 자동으로 리액트가 업데이트 화면처리를 해줌
// 자동으로 해주지만 이명령을 따로 해주긴 해줘야함-> setState를 통해서.
// color : this.state.titleColor로 표현 가능
// 이게 왜 생겼을까? -> 유지보수 위해. state안의 'red'만 다른 색깔로 변경해주면 나머지 것들에도 모두 적용되는 편리성
// 안에 있는 중괄호는 '얘는 객체야' 라는 뜻
// 밖에 있는 중괄호는 '얘는 자바스크립트야' 라는뜻
}
}
export default Child;
리액트가 화면을 그릴때 어떤함수를 호출하나?-> render 함수를 호출해서 화면그림
props는 부모에서 넘겨주는 애
state는 자기가 갖고있는거
constructor안에서 만들어줌
import React from 'react';
import './Child.css'; // css적용시키기 위한 import
class Child extends React.Component {
constructor() {
super();
this.state = {
// boolean의 변수명 짓는 법 : is뭐뭐냐? yes or no
isSwitchOn : false;
};
}
toggleSwitch = () => {
// 토글로 클릭때마다 꺼졌다 켜졌다. 리팩토링해보자면? 아래를 보세요
if(this.state.isSwitchOn){
this.setState({
isSwitchOn : false;
})
} else {
this.setState({
isSwitchOn : true;
})
}
// 위의 중복을 없애기 삼항연산자 사용
this.setState({
isSwitchOn : this.state.isSwitchOn ? "False" : "True" ;
// 위처럼 삼항연산자에 boolean? 무조건 잘못된 코드!!! 아래처럼 바꿔라!!
isSwitchOn : !this.state.isSwithOn;
})
this.setState({ // 토글 없이 계속 켜져있게함
isSwitchn : true;
})
}
render(){
console.log("state >>>>" , this.state);
const { isSwitchOn } = this.state; // 여러개가 있으면 아래처럼 적는다.
const { isSwitchOn, color, toggle } = this.state;
// const isSwitchOn = this.state.isSwitchOn; 을 간편하게 쓴것
// 구조분해할당을 render함수 안에서 해주는 이유?
// -> 함수바깥에서 함수 내의 값에 접근불가하다.
// switch가 켜져있으면 파란색
// switch가 꺼져있으면 빨간색
// 삼항연산자 이용
return {
<div>// this.props.isSwitchOn이 아니라 this.state.isSwitchOn
<h1 className={isSwitchOn ? SwitchOn : SwitchOff}>
Switch : {isSwitchOn ? "On" : "Off"}</h1>
// inline으로 스타일 넣으면 가독성 안좋다. 가장 우선순위가 높게 적용된다-> 스타일링은 css에서 하는게 좋다
<button onClick={this.toggleSwitch}>Toggle Switch!</button>
</div>
}
}
}
export default Child;
.SwitchOn {
color : red;
}
.Switchff {
color : blue;
}
this.state를 매번 적어줄 필요 없게된다.
객체를 표시할땐 중괄호로 하니까,
// this.state.isSwitchOn을 앞으로 isSwitchOn으로 작성 가능!
const { isSwitchOn } = this.state
// 중괄호 안에는 분해될 값
// 분해할 원본 객체를 적어준다.
import React from 'react';
import Child from './Child';
class Parent extends React.Component {
//constructor 안에서 component 의 상태(state)를 저장해 둘 수 있다.
constructor() {
super();
this.state = {
isSwitchOn : false;
};
}
// 부모의 state를 직접적으로 바꾸진 못하지만, 부모의 state를 바꾸는 함수를받아서 걔를 호출하면 됨
toggleSwitch = () => {
this.setState({
isSwitchOn : !this.state.isSwithOn;
})
}
render(){
return <Child isSwitchOn={this.state.isSwitchOn} toggleSwitch={this.toggleSwitch} />; // 자식한테 props로 넘겨준다는 뜻
// 부모의 state를 직접적으로 바꾸진 못하지만, 부모의 state를 바꾸는 함수를받아서 걔를 호출하면 됨
}
}
export default Parent;
import React from 'react';
import './Child.css';
class Child extends React.Component {
render(){
console.log("props>>> ", this.props);
// props ▶{isSwitchOn : false, toggleSwitch ; f}
// 자식한테 isSwitchOn이,toggleSwitch라는 것이 props로 넘어와서 사용할 수 있음
return {
<div>
<h1 className={this.props.isSwitchOn ? SwitchOn : SwitchOff}>
Switch : {this.props.isSwitchOn ? "On" : "Off"}
// 그전 코드는 state에 있는것을 가져온거고
// 지금은 props에 있는 값을 가져오는것
</h1>
<button onClick={this.props.toggleSwitch}>Toggle Switch!</button>
// 나 자신이 가지고 있는 토글 스위치가 아니고, 나의 부모로부터 전달받은 props안에 있는 토글스위치라는 함수를 실행시킴
// 이로써 자식에서 부모의 state를 바꿀수있게됨(직접적으로 못바꾸고 부모에서 만든 함수를 넘겨줌으로써)
</div>
}
}
}
export default Child;
내 자신에 있는걸 쓰는건 this.state blabla
부모로부터 받아오는건 this.props blabla
가슴아프지만 자식들끼린 소로 소통을 하지 못한다.
싸웠나보다
그래서 부모를 통해 이야기를 주고 받는다.