웹/react

react typescript hooks mobx6 사용하기!(useContext없이)

allblack 2021. 7. 31. 16:24
반응형

mobx란?

MobX는 전역 상태 라이브러리중 하나입니다!

특징

  • React에 종속적인 라이브러리가 아님(vue, anglur등에서도 사용가능)
  • redux와 다르게 store에 제한이 없음
  • observable을 기본적으로 사용하고 있음
  • Mobx는 절대적으로 필요한 경우에만 state 변경 (어떤 뜻인지를 모르겠음)
  • Typescript를 기반으로 만들어짐

개념

  • observable: 추적 가능한 state 정의
  • action: state를 변경하는 메소드
  • computed: state와 캐시로부터 새로운 결과를 반환

observable

  • Observable State를 만듬
    • state의 변화는 reaction과 computations를 일으킴
    • 관찰할 수 있는 변화가 일어나면 탐지함
  • 시간에 따라 변할 수 있는 값들을 MobX에게 알려주기 위해

action

  • store에 있는 state를 변경시킨다.
    • makeObservable을 사용하면 action을 따로 작성해줘야 하지만, makeAutoObservable은 이를 대신해준다.
functionName(pramater){
		~~
}

computed

  • store에 있는 값과 pramater에 값을 이용해서 계산된 결과를 반환한다.
get functionName(pramater){
		~~
		return value /* 타입은 상관없다. */
}

 

store만들기

object형식과 class방식 둘다 해보겠습니다

Object(observable)

import { observable } from "mobx";

interface TestStoreProps {
  number: number;
  increase: () => void;
}

const Tstore = observable<TestStoreProps>({
  number: 1,
  increase() {
    this.number++;
  },
});
export default Tstore;

Class(makeAutoObservable)

import { action, makeAutoObservable, observable } from "mobx";

class Tstore {
  constructor() {
    makeAutoObservable(this);
		// makeAutoObservable이 다른 action, computed를 자동으로 선언
		/*
		makeAutoObservable(this, {
		      value: observable,
		      toggleValue: action,
		    });
		이렇게 해도 가능
		*/
  }
  value = "Hello";

  toggleValue() {
    this.value = this.value === "Hello" ? "World" : "Hello";
    console.log(this.value);
  }
}

const store = new Tstore();

export default store

Class(makeObservable)

import { action, makeObservable, observable } from "mobx";

class Tstore {
  constructor() {
    makeObservable(this, {
      value: observable,
      toggleValue: action,
    });
//수동설정
  }
  value = "Hello";
  toggleValue() {
    this.value = this.value === "Hello" ? "World" : "Hello";
    console.log(this.value);
  }
}

const store = new Tstore();

export default store;

*주의사항

object형식으로 만들면 state model형식으로 만들어 지기 때문에 action함수를 거치지 않아도 value가 변경이 가능하다.

 

store사용하기

 

useStore

import Tstore from "./TestStore";

const useStore = () => ({ Tstore });
export default useStore;

꼭 이렇게 store를 하나로 모을 필요는 없습니다. 용도별로 따로 만들어도 됩니다!

사용법

import React from "react";
import UseStore from "@store/index";
import { observer } from "mobx-react";

function Example() { 
/* const Example=observer(()=>{})
	 export default Example; */
  const { Tstore } = UseStore();
	
	return (
		<div>{Tstore.number}</div>
    <button onClick={() => Tstore.increase()}>+1</button>
	);
}

export default observer(Example);

 

반응형