React&Redux 에센셜

8231 단어 Reactredux

Redux&Redux 에센셜



우선, reduce, reducer, state, action의 정리

Reduce,Reducer,State,Action이란?



reduce -직역->바꾸기
reducer -직역->변화를 주는 것
state -직역->상태
action -직역->실행

정의



Reduce는 한 번에 함수를 적용하여 수행되는 값의 변화입니다.
Reducer는 적용되는 함수입니다.
State란, reduce되기 전의 초기 상태
Action이란 state가 어떻게 변경되는가?

예) 함수 F(a를 2배로 하는 처리를 한다(Action))

F(2) ->F(a) -Reduce->4

F(2)가 State,
F (a)는 Reducer입니다.

Redux 연습



가져오기


import { createStore } from 'redux'

간단한 예



Reducer에서는 Action에 의해 switch 문 등으로 State를 변경한다
function counter(state = 0, action) {
  switch (action.type) {
  case 'INCREMENT':
    return state + 1
  case 'DECREMENT':
    return state - 1
  default:
    return state
  }
}

게시판을 만들자



목표



JQuery에서 말하면,
<html>
<form>
<input type="text" id="hoge" />
<button onclick="push()">追加</button>
</form>
<ul id="list"></ul>
</html>

<script>
function push(){
let sentence = $("#hoge").val() ;
$("#list").append("<li>"+sentence+"</li>") ;
}
</script>



이런 것을 React&Redux의 기초를 바탕으로 설명.

install



React



npm은 설치된 환경이라고 가정합니다.
※하지 않은 분은 $brew install npm
$ npm install -g create-react-app


이렇게 react 설치

프로젝트 만들기


$ create-react-app todo



이런 느낌의 폴더를 할 수 있다고 생각합니다.
$ cd todo

todo로 이동합시다.

Redux


$  npm install --save redux react-redux redux-logger

todo 폴더에 Redux 설치


이것으로 환경 구축이 완료되었습니다.

디렉토리 만들기



액션
components
containers
reducers
라는 폴더를 src 아래에 배치
각 폴더에 todo.js를 만듭니다.



또한 src 아래에 createstore.js라는 파일을 만들어야합니다.


createstore.js에 함수 만들기
import { createStore as reduxCreateStore, applyMiddleware, combineReducers } from "redux";
import logger from "redux-logger";
import { todoReducer } from "./reducers/todo";

export default function createStore() {
  const store = reduxCreateStore(
    combineReducers({
      todo: todoReducer,
    }),
    applyMiddleware(
      logger,
    )
  );

  return store;
}


React에 Redux 적용



index.js를 변경합니다.
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import * as serviceWorker from './serviceWorker';

import { Provider } from 'react-redux';
import createStore from './createstore';

const store = createStore() ;

ReactDOM.render(
  <Provider store={store}>
    <App />
  </Provider>, 
  document.getElementById('root')
);


// If you want your app to work offline and load faster, you can change
// unregister() to register() below. Note this comes with some pitfalls.
// Learn more about service workers: https://bit.ly/CRA-PWA
serviceWorker.unregister();


redux, createstore를 가져 와서 Provider에 store를 설정하면됩니다.

serviceWorker.unregister ()는 오프라인 캐시를 비활성화합니다.
이것은 create-react-app를 하면 표준으로 붙어 있습니다. 지금은 무시하고 OK입니다.

Component 정의



components/todo.js
todo 추가를위한 텍스트 상자와 버튼을 씁니다.
import React from 'react';

export default class Todo extends React.Component{
  render(){
    return(
      <div>
        <input type="text" />
        <button>追加</button><br />
        <ul>
          <li>aaa</li>
          <li>bbb</li>
        </ul>
      </div>
    );
  }
}




Action 정의



actions/todo.js
export const addTodo = (todo) => {
  return {
    type: 'ADD_TODO',
    payload: { todo: todo }
  };
}

Action은 Reducer에 지시를 내립니다.
type 프로퍼티를 반드시 가지고 있어 이것이 처리의 키가 됩니다.

payload property는 처리에 사용하는 파라미터로, 이 예에서는 추가하는 TODO를 가지게 하고 있습니다

Reducer 정의



reducer.todo.js
const initialState = {
  todoList: []
}

export const todoReducer = (state = initialState, action) => {
  switch (action.type) {
    case 'ADD_TODO':
      // 新しく追加するTODO
      const todo = action.payload.todo;
      // stateを複製して追加
      const newState = Object.assign({}, state);
      newState.todoList.push(todo);
      return newState;
    default:
      return state;
  }
};

state는 rewrite가 아닌 새로운 객체입니다.

단순히 인수의 state에 추가하는 대신,

Object.assign 메소드로 복제한 새로운 state 에 추가해,
그것을 반환 값으로 설정합니다.

Component 정의



components/todo.js
import { connect } from 'react-redux';
import * as actions from '../actions/todo';
import Todo from '../components/todo';

const mapStateToProps = state => {
  return {
    todo: state.todo,
  }
}

const mapDispatchToProps = dispatch => {
  return {
    addTodo: (todo) => dispatch(actions.addTodo(todo)),
  }
}

export default connect(mapStateToProps, mapDispatchToProps)(Todo)


mapStateToProps 함수
사용할 상태를 잘라내어 props에서 참조할 수 있는 함수

mapDispatchToProps 함수
dispatch 하기 위한 함수를 props 에 매핑 하기 위한 함수

각각 정의한 것을 connect 함수로 컴퍼넌트에 접속해 export합니다. 이렇게 하면 컴포넌트가 redux에 의한 상태 관리를 의식하지 않고, state나 dispatch를 참조, 실행할 수 있게 됩니다.

컨테이너의 사용법은, 컴퍼넌트를 import 하고 있는 개소를 컨테이너로 전환할 뿐.
app.js
import React, { Component } from 'react';
import './App.css';
//import Todo from './components/todo';
import Todo from './containers/todo';

Component 재작성



components/todo.js
import React from 'react';

export default class Todo extends React.Component {
  state = {
    todo: ''
  }

  render() {
    console.log(this.props);

    // StoreのTodoからリストを生成
    const list = this.props.todo.todoList.map((todo, index) => <li key={index}>{todo}</li>)

    return (
      <div>
        <input type="text" onChange={elm => this.setState({ todo: elm.target.value })} />
        <button onClick={() => this.props.addTodo(this.state.todo)}>追加</button><br />
        <ul>
          {list}
        </ul>
      </div>
    );
  }
}



중복 코드가 될수록 redux의 혜택이 커집니다.
변경 사항을 즉시 알 수 있으므로 팀 개발이 기존보다 간단합니다.

좋은 웹페이지 즐겨찾기