JavaScript와 HTML,CSS등에 대해서는 일체 다루지 않는다.
기초 지식은 다른 강의를 참조하도록 하라.
이 강의는 React의 사용법 위주로 작성되어 있다.
왜 React여야는지, React를 써야하는지에 대하지는 논하지 않으므로 그런 자료는 다른 데이터를 참조하라.
참조:
기본적으로 React같은 frontend framework에서는 양방향 바인딩을 지원하지 않는다.
다만 양방향을 흉내낼수 있게 단방향을 양쪽으로 지원할 뿐이다.
그래서 아래에서 이야기할 양방향이라는 것은 단방향을 양쪽으로 하는것임을 미리 알아주길 바란다.
여러분은 이 때까지 props를 이용해서 부모가 자식에게 영향을 줄 수 있다는걸 알 수 있다.
그런데 반대로 자식이 부모에게 영향을 줄 수 있느냐라고 물으면 가능하다고 할 수 있다.
다만 정말 깔끔하지 못한 방법을 사용한다. 이를 Lifting State Up이라고 부른다.
줄여서 보통 리프트 업이라고 부르는 편인데 어떻게 구현하는지 보도록 하자.
// App.js
import React, {Component} from 'react';
import Hello from './Hello'
class App extends Component {
state = {
name: 'kukaro'
};
getName(data) {
this.setState({
name: data
});
}
constructor(props) {
super(props);
}
render() {
return (
<div className="App">
<Hello name={this.state.name} getName={this.getName.bind(this)}/>
</div>
);
}
}
export default App;
코드의 전문이다.
눈에 띄는 점을 몇개 골라보자.
getName(data) {
this.setState({
name: data
});
}
getName은 인자로 data를 받아서 이것을 name에 넣어주는 역활을 한다.
아주 기초적인 역활임을 쉽게 알 수 있다.
<Hello name={this.state.name} getName={this.getName.bind(this)}/>
다만 여기서 보면 신기한게 있는데 getName을 props인자로 던졌다.
즉 함수자체를 인자로 던진것이다.
그러면 이제 Hello를 보도록하자.
// Hello.js
import React, {Component} from 'react'
class Hello extends Component {
onMyClick = ()=> {
this.props.getName(this.props.name + '!');
}
render() {
return (
<div className="Hello" onClick={this.onMyClick}> hello {this.props.name}!
</div>
);
}
}
export default Hello;
보면 알겠지만 신기하게 만들어진걸 알 수 있다.
우리는 Hello라는 div를 클릭할 때마다 onMyClick이 호출된다.
그런데 잘보면 props로 넘긴 함수에 현재 값에 !를 추가한 값이 전달된다.
getName(data) {
this.setState({
name: data
});
}
다시 넘어와서 App.js의 getName을 보자.
data가 넘어오면 state의 값을 data로 덮어쓰게 되어있다.
이제 여러분들은 이게 어떻게 동작하는지를 알 수 있을 것이다.
부모가 자식에게 함수를 하나 하달해주고 자식은 그 하달한 함수를 통해서 바뀐값을 전달한다.
그러면 부모측에서의 함수가 호출되고 부모에서는 값이 바뀌게 된다.
이게 바로 Lifting State Up이라는 방식이다.
하지만 이 방식은 치명적인 문제점이 있다.
그런데 다음 리액트 강의에서 언급하도록 하겠다.
'Programming > JavaScript-React' 카테고리의 다른 글
[React-12]react-redux로 redux더 직관적이게 사용하기 (0) | 2019.06.14 |
---|---|
[React-11]Redux로 전역으로 저장하자 (0) | 2019.06.10 |
[React-09]react의 props 다시 자세히 알아보자 (0) | 2019.05.12 |
[React-08]create-react-app, cli로 프로젝트 만들기 (0) | 2019.03.22 |
[React-07]변수(state)와 이벤트 바인딩(event bind)그리고 라이프 사이클(life cycle) (0) | 2019.03.17 |