inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Redux vs MobX (둘 다 배우자!)

context 사용 시 에러가납니다.

해결된 질문

2984

혁999

작성한 질문수 4

0

강사님이 만드신 소스에서 그냥 간단하게 + - 되는 카운터 기능의 예제를 진행중입니다.

역시  hooks를 이용하려구 하구요.

// src/index.js

import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
import StoreProvider from './Context';

ReactDOM.render(
  <StoreProvider>
    <App />,
  </StoreProvider>,
  document.getElementById('root'),
);

-------------------------------------------------------------------------

// src/Context.js

import React, { createContext } from 'react';
import { counterStore } from './store/counterStore';

export const storeContext = createContext({ counterStore });

export const StoreProvider = ({ children }) => {
  return <storeContext.Provider>{children}</storeContext.Provider>;
};

export default StoreProvider;

-------------------------------------------------------------------------

// src/App.js

import React from 'react';
import { useObserver } from 'mobx-react';
import useStore from './useStore';
// import { counterStore } from './store/counterStore';

function App() {
  const { counterStore } = useStore();

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

export default App;

-------------------------------------------------------------------------

// src/store/counterStore.js

import { observable } from 'mobx';

const counterStore = observable({
  number: 0,
  increase() {
    counterStore.number++;
  },
  decrease() {
    counterStore.number--;
  },
});

export { counterStore };

-------------------------------------------------------------------------

// src/useStore.js
import { useContext } from 'react';
import { storeContext } from './Context';

const useStore = () => {
  const { counterStore } = useContext(storeContext);

  return { counterStore };
};

export default useStore;

-------------------------------------------------------------------------

TypeError: Cannot destructure property 'counterStore' of 'Object(...)(...)' as it is undefined.

실행시 위와 같이 디스트럭처링을 할 수 없다고 나옵니다.

그래서 위의  src/useStore.js 부분에서 디스트럭처링 하지 않고 그냥 하게되면

// src/useStore.js
import { useContext } from 'react';
import { storeContext } from './Context';

const useStore = () => {
  const counterStore = useContext(storeContext);

  return { counterStore };
};

export default useStore;

TypeError: Cannot read property 'number' of undefined

Context API를 사용하지 않을 경우 스무스하게 잘 되는데 Context만 이용하려 하니 게속 에러가 발생합니다..

×

redux mobx

답변 4

1

제로초(조현영)

import { useLocalStore } from 'mobx-react';
import React from 'react';
import counterStore from './counterStore';

export const storeContext = React.createContext(null);

export const StoreProvider = ({ children }) => {
  const store = useLocalStore(counterStore);

  return (
    <storeContext.Provider value={store}>
      {children}
    </storeContext.Provider>
  );
};

export default StoreProvider;​

Provider에 store을 안 넣으셨네요.

import * as React from 'react';
import { storeContext } from './Context';

function useStore() {
  const store = React.useContext(storeContext);
  if (!store) {
    // this is especially useful in TypeScript so you don't need to be checking for null all the time
    throw new Error('useStore must be used within a StoreProvider.');
  }
  return store;
}

export default useStore;

1

제로초(조현영)

useStore에서 useContext쓰실 필요없이 그냥 import하셔서 return { counterStore }만 하셔도 됩니다.

https://github.com/ZeroCho/redux-vs-mobx/blob/master/8.mobx-react/useStore.js

0

혁999

해결되었습니다. 감사합니다!

0

혁999

말씀하신대로 하는 경우는 Context.js 도 필요없고 App.js에서 Provider가 전혀 안쓰이는것과 다름이 없는것 아닌가요? Context 자체를 안쓰고 커스텀훅만 사용할 경우 잘 되는 것 같습니다... 그런데 저는 Context를 한번 사용해보고 싶어서요.

context api, redux를 혼용하는건 별로일까요?

0

368

1

섹션 3 mobx autorun 관련 질문입니다.

0

255

1

thunk 미들웨어 잡업 중 논리로직 단계? 질문이 있습니다.

0

285

1

rootSaga에서 call를 사용하는 이유가 궁금합니다.

0

358

1

observable의 함수를 익명함수로 바꿔봤습니다.

0

383

1

useSelector 리랜더링 질문있습니다.

0

382

1

비동기 action 타입을 뭘로 지정해야 할까요?

0

258

1

redux-thunk질문

0

432

1

state 변경 시 질문

0

346

1

state변경 시 질문

0

329

2

firstMiddleware와 thunkMiddleware 순서 질문

0

433

1

객체 동적 다이나믹 속성?? 질문

1

272

1

미들웨어 질문

0

247

1

리덕스 사가 실습 파일 확인 부탁드립니다!

1

581

2

1-6 강의에서 질문 있습니다!

1

359

1

redux-saga 깃헙 파일

0

369

1

createStore -> configureStore

0

300

1

전역 변수와 전역 상태 값

0

666

2

Redux toolkit 과 axios API 호출에 관한 질문입니다.

0

439

1

MobX Data

0

233

1

mobx state action 변화 감지 관련

0

717

1

mobx configure

0

208

1

리덕스 툴킷 과 saga질문

0

287

1

로깅 미들웨어 질문입니다

0

238

1