반응형
react 개발시 컴포넌트간에 데이터 전송은 중요합니다. 특히 cra(create-react-app)와 같은 단일 thread에서 매우 중요합니다.
그래서 오늘은 위해 상위 -> 하위, 하위 -> 상위 컴포넌트간 데이터 전달 방식을 익혀볼까 합니다.
상위 -> 하위
class 상위 extends Component {
render() {
let data = 1
return(
<하위 data={this.data}/>
);
}
}
class 하위 extends Component {
render() {
console.log(this.props.data)
// 1이 찍힙니다
return(
<div>하위 컴포넌트</div>
);
}
}
위 코드와 같이 상위 컴포넌트에서 하위로 데이터를 전송해주려면 props를 지정해주면 됩니다.(이때 map함수를 이용해 여러 하위 컴포넌트를 부를경우 key값 설정도 잊지마세요!)
하위 -> 상위
class 상위 extends Component {
goHawee = (res) => {
console.log(res)
}
render() {
let data = 1
return(
<하위 func={this.goHawee}/>
);
}
}
class 하위 extends Component {
render() {
this.props.func(1)
// 1이 찍힙니다
return(
<div>하위 컴포넌트</div>
);
}
}
상위에서 props로 함수를 전달해주면 끝!입니다. 하지만 하위에서 상위로 데이터를 보내는 거 같지 않죠?
그렇다면 하위 데이터로 상위 컴포넌트의 state을 변경해보겠습니다.
class 상위 extends Component {
constructor(props) {
super(props);
this.state = {
data: {}
};
}
goHawee = (res) => {
this.setState({
data:res
}, () => {
console.log(this.state)})
//{data: "test"} 가 찍힙니다
}
render() {
return(
<하위 func={this.goHawee}/>
);
}
}
class 하위 extends Component {
render() {
let test = "test"
this.props.func(test)
return(
<div>하위 컴포넌트</div>
);
}
}
했더니 아래와 같이 에러가 뜹니다.
이는, this.props.func(test)의 위치때문인데요. 저는 무한 루프를 피하기 위해 특정함수에 넣고 onClick시 이를 실행하도록 했습니다.
class 상위 extends Component {
constructor(props) {
super(props);
this.state = {
data: {}
};
}
goHawee = (res) => {
this.setState({
data:res
}, () => {
console.log(this.state)})
//{data: "test"} 가 찍힙니다
}
render() {
return(
<하위 func={this.goHawee}/>
);
}
}
class 하위 extends Component {
clickedFunc = () => {
let test = "test"
this.props.func(test)
}
render() {
return(
<div onClick={this.clickedFunc}>하위 컴포넌트</div>
);
}
}
잘나오네요ㅎㅎ
요약:
@ 상위 -> 하위시, props로 데이터 전달
@ 하위 -> 상위시, props로 실행할 함수를 하위로 전달하고 하위에서 실행. 이때 무한루프에 빠지지 않도록 주의한다.
이상입니다!
코드 보기가 어려우시면 이링크를 참조해주세요
'개발 > react 생태계' 카테고리의 다른 글
비동기 처리 in react (0) | 2020.06.15 |
---|---|
비동기 처리 in react (0) | 2020.06.15 |
react에서 infinite-scroll (0) | 2020.06.08 |
this.function()와 this.function의 차이 (0) | 2020.06.05 |
Uncaught SyntaxError: Unexpected identifier (2) | 2020.06.01 |