微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MobX 自动运行不工作类组件构造函数

如何解决MobX 自动运行不工作类组件构造函数

React 实际上是难以置信的难 T_T....

我只想在状态发生变化时调用组件方法。我可以使用 Vue 中的观察者轻松做到这一点。但是我应该在 React 类组件和 MobX 的自动运行中做什么?这会在功能组件中工作吗?

import someStore 

@observer
class MyComponent {
    constructor(){
       autorun( 
         // references someStore.someObservable
         // call component methods 
         // but this isn't hit when there's change
        )
    }
}

解决方法

我为您制作了 2 个示例,一个是类组件,不再推荐使用这种方式来做事,另一个是功能组件。

示例相当升级,因为在渲染中计算我们的 status 会容易得多,但让我们假设我们不能这样做并且我们想要调用一些内部方法。

首先,我们设置存储并每秒更新一次:

import { observable,reaction } from 'mobx';
import { observer } from 'mobx-react';
import React,{ useEffect,useState } from 'react';

const store = observable({
  counter: 0
});

setInterval(() => {
  store.counter++;
},1000);

// Helper method
const getStatus = (number) => (number % 2 === 0 ? 'even' : 'odd');

这是我们的功能组件,我们使用 useEffect 对计数器更改做出反应,然后使用 setStatus 方法更新我们的内部状态:

const CounterFunctional = observer(() => {
  const [status,setStatus] = useState(() => getStatus(store.counter));

  useEffect(() => {
    setStatus(getStatus(store.counter));
  },[store.counter]);

  return <div>functional: {status}</div>;
});

这是我们的类组件,现在我们使用 MobX reaction(不要忘记在卸载时处理它)并在 counter 更改后类似地更新我们的内部状态:

const CounterClass = observer(
  class extends React.Component {
    disposer;

    constructor() {
      super();

      this.state = {
        status: getStatus(store.counter)
      };
    }

    componentDidMount() {
      this.disposer = reaction(
        () => store.counter,() => {
          this.setState({
            status: getStatus(store.counter)
          });
        }
      );
    }

    componentWillUnmount() {
      this.disposer();
    }

    render() {
      return <div>class: {this.state.status}</div>;
    }
  }
);

希望它是有道理的,React 实际上是一个超级简单的库 :)

代码沙盒:https://codesandbox.io/s/httpsstackoverflowcomquestions66602050-7uhm6

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。