[React] MobX - React에서 사용하기

2022. 5. 3. 14:56·React/이론
반응형

카운터 만들기 

yarn add mobx mobx-react
import React, { Component } from "react";
import { observable, action, makeObservable } from "mobx";
import { observer } from "mobx-react";

class Counter extends Component {
  number = 0;

  constructor() {
    super();
    makeObservable(this, {
      number: observable,
      increase: action,
      decrease: action,
    });
  }

  increase = () => {
    this.number++;
  };

  decrease = () => {
    this.number--;
  };

  render() {
    return (
      <div>
        <h1>{this.number}</h1>
        <button onClick={this.increase}>+1</button>
        <button onClick={this.decrease}>-1</button>
      </div>
    );
  }
}

export default observer(Counter);

setState, useState 없이 값을 바꿔주면 알아서 렌더링이 된다. 

observer가 observable 값이 변할 때 컴포넌트의 forceUpdate를 호출해서 자동으로 변화가 화면에 반영된다. 

 

최적화가 많이 되어 있어 성능상의 문제도 크게 걱정할 필요가 없다. 

 

MobX 스토어 분리시키기

MobX에는 스토어라는 개념이 있다. 

Redux는 하나의 앱에 하나의 스토어만 있지만, MobX는 여러개를 만들어도 된다. 

스토어 만들기 

import { observable, action } from "mobx";

export default class CounterStore {
  number = 0;

  constructor() {
    super();
    makeObservable(this, {
      number: observable,
      increase: action,
      decrease: action,
    });
  }

  increase = () => {
    this.number++;
  };

  decrease = () => {
    this.number--;
  };
}

Redux 처럼 리듀서나, 액션 생성 함수 등이 필요하지 않고 하나의 클래스에 observable 값이랑 함수를 만들어주면 

끝이다. 

 

Provider, 프로젝트에 스토어 적용

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { Provider } from "mobx-react";                             -- 1
import CounterStore from "./stores/counter";                       -- 2

const counter = new CounterStore();                                -- 3

const root = ReactDOM.createRoot(document.getElementById("root")); 
root.render(
  <Provider counter={counter}>                                     -- 4
    <App />
  </Provider>
);

MobX에서 프로젝트에 스토어를 적용할 때는 Redux처럼 Provider라는 컴포넌트를 사용한다. 

 

1. MobX에서 사용하는 Provider이다. 

2. 만들어둔 스토어를 불러온다. 

3. 스토어 인스턴스를 만든다. 

4. Provider에 props로 넣어준다. 

 

useStore, 컴포넌트에 스토어 주입

import { useContext } from "react";
import { MobXProviderContext } from "mobx-react";

const useStores = () => {
  return useContext(MobXProviderContext);
};

export default useStores;

6버전이 아닌 이전 버전의 경우 inject라는 함수를 사용해야하는데 useStores 안에 useContext로 사용할 경우 

내부에서 알아서 바인딩이 된다. 

 

컴포넌트에서 사용하기 

import React from "react";
import { observer } from "mobx-react";
import useStores from "./hooks/useStores";

export default observer(function NewCounter() {
  const { counter } = useStores();

  return (
    <div>
      <h1>{counter.number}</h1>
      <button onClick={counter.increase}>+1</button>
      <button onClick={counter.decrease}>-1</button>
    </div>
  );
});

observer는 여전히 사용하지만, useStores를 통해서 쉽게 store에 접근이 가능하다. 

즉, 컴포너트는 인터페이스와 인터랙션만 관리하면 되고, 상태 관리 로직은 스토어로 분리되었다. 

 

깃허브 

https://github.com/SeoJaeWan/mobx-with-react

 

GitHub - SeoJaeWan/mobx-with-react

Contribute to SeoJaeWan/mobx-with-react development by creating an account on GitHub.

github.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'React > 이론' 카테고리의 다른 글

[React] Redux - 기본편  (1) 2022.07.21
[React] MobX - 심화  (2) 2022.05.05
[React] MobX - 시작하기  (1) 2022.04.29
[React] import React from 'react'는 어디에 쓰일까?  (1) 2022.04.17
[React] Virtual DOM  (2) 2022.03.12
'React/이론' 카테고리의 다른 글
  • [React] Redux - 기본편
  • [React] MobX - 심화
  • [React] MobX - 시작하기
  • [React] import React from 'react'는 어디에 쓰일까?
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    리얼클래스
    식물
    타입스크립트
    next.js
    Docker
    영어회화
    네트워크
    javascript
    webpack
    Node.js
    리얼학습일기
    리액트
    자바스크립트
    네이버 부스트캠프
    ReactNative
    바질 키우기
    다이소
    알고리즘
    Babel
    react
    타일러영어
    바질
    ChatGPT
    덤프
    redux
    typescript
    영어독학
    프로그래머스
    CSS
    CCNA
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] MobX - React에서 사용하기
상단으로

티스토리툴바