React Hooks (useState) и Mobx [без mobx-react-lite]

в моем реагирующем приложении (с машинописным текстом) я хочу использовать хуки React (в частности, useState) для управления состоянием формы и тем временем использовать его в качестве наблюдаемого компонента для хранилища Mobx, но я получаю сообщение об ошибке

Hooks can only be called inside the body of a function component.

так, например, в следующем компоненте

import * as React from "react";
import { inject, observer } from "mobx-react";
import { MyStore } from "./MyStore";

interface IProps {
  myStore?: MyStore;
  id: string;
}

const MyComponent: React.FC<IProps> = props => {
  const [state, setState] = React.useState("");
  return (
    <div>
      <h1>{props.id}</h1>
    </div>
  );
};
export default inject("myStore")(observer(MyComponent));

Я видел решение, но оно использовало React.createContext для экспорта класса магазина. не где ли старый подход для Mobx и Hooks?

вот песочница для примера

mobx-react@5 не поддерживает хуки, а его будет поддерживать версия 6, которая сейчас находится в rc.4.
Tholle 25.03.2019 09:28

@Толле, спасибо. Кстати, как я вижу, вы так активны здесь, особенно для тега реакции, как вы думаете, использование контекста стало намного проще с версии 16.8, удобнее ли создавать собственный менеджер состояний для приложений малого и среднего размера, а не импортировать некоторые МБ библиотеки ?

Amir-Mousavi 25.03.2019 10:35

Вы определенно можете использовать, например. перехватчик useReducer и совместное использование объекта состояния и функции отправки через контекст, который подойдет для многих случаев использования, но я не думаю, что он заменит MobX для приложений среднего размера. Это во многом зависит от вашего конкретного проекта.

Tholle 25.03.2019 10:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
6
3
15 293
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

mobx-react не поддерживает хуки, и если вы хотите использовать хуки с mobx, вам нужно использовать mobx-react-lite, который также упоминается в документация на гитхабе.

Для этого вы можете использовать React.createContext вместо провайдера и useContext вместо inject.

Индекс.tsx

import * as React from "react";
import { render } from "react-dom";
import MyComponent, { Store } from "./MyComponent";

import "./styles.css";
import MyStore from "./MyStore";

function App() {
  const [state, setState] = React.useState("");
  return (
    <Store.Provider value = {MyStore}>
      <div className = "App">
        <MyComponent id = {"someID"} />
      </div>
    </Store.Provider>
  );
}

const rootElement = document.getElementById("root");
render(<App />, rootElement);

MyComponent.tsx

import * as React from "react";
import { Observer } from "mobx-react-lite";
import { MyStore } from "./MyStore";

interface IProps {
  myStore?: MyStore;
  id: string;
}

export const Store = React.createContext();
const MyComponent: React.FC<IProps> = props => {
  const [state, setState] = React.useState("");
  const store = React.useContext(Store);
  console.info(state, store);
  return (
    <div>
      <h1>{props.id}</h1>
    </div>
  );
};
export default MyComponent;

Рабочая демонстрация

Ответ принят как подходящий

Благодаря тому, что @Tholle упомянул версию Mobx, теперь, когда выпущен Мобкс 6, этот вопрос решен.

Другие вопросы по теме