리액트
→ 사용자 정의 태그 = 컴포넌트로 체계적인 애플리케이션 만드는 기술
리덕스
→ 상태를 중앙 관리해 데이터 변형 사고 방지 …
두 개 모두 개발의 복잡성을 낮춤… 리액트는 ‘소문'처럼, 리덕스는 ‘미디어'처럼 데이터 주고 받음
하지만 리액트는 모든 컴포넌트가 render() 함수 호출 + 모든 컴포넌트끼리 연결되어야 함
리액트와 리덕스를 연결해주는 라이브러리 react-redux → 필요한 컴포넌트에게만 전달 !
import React from 'react';
import AddNumberRoot from './Components/AddNumberRoot';
import DisplayNumberRoot from './Components/DisplayNumberRoot';
function App() {
return (
<div className="App">
<h1>Root</h1>
<AddNumberRoot></AddNumberRoot>
<DisplayNumberRoot></DisplayNumberRoot>
</div>
);
}
export default
→ import시 컴포넌트를 사용할 수 있게 함
이 상태에서 상태 관리가 도입되면, 깊은 depth에 있는 컴포넌트와 외부의 컴포넌트 상호작용 시 굉장히 복잡함
npm install redux
로 리덕스 설치부터!
// store.js
import { configureStore } from 'redux';
export default configureStore(function(state, action){
if ( state === undefined ) {
return { number: 0 } // 초기값
}
if ( action.type === 'INCREMENT') {
return { ... state, number: state.number + action.size }
}
return state;
}, window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()); // dev툴 사용을 위함
import React, {Component} from 'react';
import store from '../store';
export default class DisplayNumber extends Component {
state = { number: store.getState().number } // store에서 number 가져오기
constructor(props) {
super(props); // 반드시 먼저 실행 !
store.subscribe(function() { // 변경 시 render() 재 호출을 위한 subscribe
this.setState({number: store.getState().number});
}.bind(this));
}
render() {
return (
<div>
<h1>Display Number</h1>
<input type="text" value={this.state.number} readOnly></input>
</div>
)
}
}