2020-9-9 Mobx기초

Mobx

  • Mobx는 상태관리 라이브러리로서 함수형 프로그래밍에서 필수적인 옵저버 패턴을 적극적으로 사용한다.

주요 개념

  • Observable State : 관찰 받고 있는 상태.

  • Computed Value(연산된 값) : 값이 바뀌어야되는 필드에서 값이 바뀌는 경우만 리렌더링을 한다.

  • Reaction(반응) : computed는 연산결과값이 달라지면 특정함수가 실행되지만, reactions는 값이 바뀜에 따라 함수를 호출한다. observable state의 내부값이 바뀔때마다 호출할 수 있다.

  • Action(액션) : Observable State 변화시키는 함수

  • autorun : reaction이나 computed를 대신해서 사용할 수 있다. autorun으로 전달해주는 함수에서 사용되는 값이 있으면 자동으로 상태 주시하고 바뀔때마다 함수를 호출

    • // Reaction
      reaction(
        () => calculator.a,
        (value, reaction) => {
          console.log(`change calculator.a :  ${calculator.a}`);
        }
      );
      
      reaction(
        () => calculator.b,
        value => {
          console.log(`change calculator.b :  ${calculator.b}`);
        }
      );
      // Autorun
      autorun(() => console.log(`change calculator.a :  ${calculator.a}`));
      autorun(() => console.log(`change calculator.b :  ${calculator.b}`));
      
      // 결과값은 동일하다
      
  • Mobx를 이용하면 observable을 사용하여 state를 관리한다.

    • import React, { Component } from 'react';
      import { observable, action } from 'mobx'
      import { observer } from 'mobx-react'
      
      @observer
      class Login extends Component {
        @observable email = ''
        @observable passwords = ''
      
        constructor(props) {
          super(props)
          this.onSubmit = this.onSubmit.bind(this)
        }
      ...
        @action.bound
        onChange(event) {
          const { name, value } = event.target;
          this[name] = value;
        }
      
        onSubmit() {
          const { email, password } = this
          console.log('결과확인 : ', email, password);
        }
      }
      
      export default Login;
      
    • 위와 같이 @observer를 붙이고, 상태관리하고자 하는 필드에 @observable을 붙인다.

    • @Observer는 mobx.autorun함수를 가지고 컴포넌트의 render함수를 감싼다. observable한 데이터가 변경될때마다 observer가 포함된 컴포넌트는 재 렌더링된다.

    • 모든 컴포넌트에 @observer를 붙여도 mobx가 알아서 성능최적화를 해준다.

    • mobx를 사용하면 setState를 잘안쓴다. setState는 비동기적으로 처리되서 바로 렌더링이 안되는 경우가 존재하는데, 변수에 observable 선언만 해주면 변경에 대해서 즉각적으로 렌더링된다.

    • mobx에서 데이터조작할대는 action decorator를 사용해야한다.

Store

  • 상태관리 저장소

    • class ApartStore {
        @observable activeApartInfo = {};
      
        constructor(root) {
          this.root = root;
        }
      
        @action setActiveApartInfo = (activeApartInfo) => {
          this.activeApartInfo = activeApartInfo;
        };
      }
      
      export default ApartStore;
      
    • store에 저장할 데이터를 @observable을 통해 선언하고 constructor를 통해 초기화한다.

참조

  • https://medium.com/@jsh901220/mobx-%EC%B2%98%EC%9D%8C-%EC%8B%9C%EC%9E%91%ED%95%B4%EB%B3%B4%EA%B8%B0-a768f4aaa73e
Written on September 9, 2020