为什么 MobX v6.x 在 React with Typescript 中不能按预期工作?

Kei*_*eno 4 reactjs mobx mobx-react

我目前正在编写一个 React 应用程序,当任何可观察的值发生变化时,它应该能够重新渲染组件。问题是,email如果它发生变化,我将无法重新渲染。

store.ts

export class ExampleStore {
  @observable email = 'hello';

  @action setEmail(email: string) {
    this.email = email;
  }
}
Run Code Online (Sandbox Code Playgroud)

索引.tsx

const stores = {
  exampleStore
};

ReactDOM.render(
  <Provider {...stores}>
    <App />
  </Provider>,
  document.querySelector('#root')
);
Run Code Online (Sandbox Code Playgroud)

应用程序.tsx

interface Props {
  exampleStore?: ExampleStore;
}

@inject('exampleStore')
@observer
export class App extends React.Component<Props, {}> {
  componentDidMount() {
    setInterval(() => {
      this.props.exampleStore!.setEmail(Math.random() * 10 + '');
    }, 2500);
  }

  render() {
    const { email } = this.props.exampleStore!;
    return <div>{email}</div>;
  }
}
Run Code Online (Sandbox Code Playgroud)

我见过很多使用useContext钩子的例子,但我必须使用类组件。我不确定为什么这不会再次调用渲染函数。我有mobxmobx-react安装。

Dan*_*ila 9

你在使用 MobX 6 吗?

装饰器 API 稍有变化,现在您需要makeObservable在构造函数中使用方法来实现与以前相同的功能:

class ExampleStore {
  @observable email = "hello";

  constructor() {
    makeObservable(this);
  }

  @action setEmail(email) {
    this.email = email;
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然有新的东西可能会让你完全放弃装饰器,makeAutoObservable

class ExampleStore {
  email = "hello2";

  constructor() {
    // Don't need decorators now, just this call
    makeAutoObservable(this);
  }

  setEmail(email) {
    this.email = email;
  }
}
Run Code Online (Sandbox Code Playgroud)

更多信息在这里:https : //mobx.js.org/react-integration.html

Codesandbox:https ://codesandbox.io/s/httpsstackoverflowcomquestions64268663-9fz6b ? file =/ src/App.js