代码之家  ›  专栏  ›  技术社区  ›  jorgen

使用react mobx在异步获取时重新渲染

  •  1
  • jorgen  · 技术社区  · 6 年前

    我试着用 mobx-rest 具有 mobx-rest-axios-adapter mobx-react ,并且我在异步数据检索时无法使组件重新呈现。

    state/user.js

    import { Model } from 'mobx-rest';
    
    class User extends Model {
      url() {
        return '/me';
      }
    }
    
    export default new User();
    

    这是反应成分,在 App.js :

    import React from 'react';
    import { inject, observer } from 'mobx-react';
    import { apiClient } from 'mobx-rest';
    import createAdapter from 'mobx-rest-axios-adapter';
    import axios from 'axios';
    import { compose, lifecycle, withProps } from 'recompose';
    
    const accessToken = '...';
    const API_URL = '...';
    
    const App = ({ user }) => (
      <div>
        <strong>email:</strong>
        {user.has('email') && user.get('email')}
      </div>
    );
    
    const withInitialise = lifecycle({
      async componentDidMount() {
        const { user } = this.props;
    
        const axiosAdapter = createAdapter(axios);
        apiClient(axiosAdapter, {
          apiPath: API_URL,
          commonOptions: {
            headers: {
              Authorization: `Bearer ${accessToken}`,
            },
          },
        });
    
        await user.fetch();
    
        console.log('email', user.get('email'));
      },
    });
    
    export default compose(
      inject('user'),
      observer,
      withInitialise,
    )(App);
    

    它使用 recompose user 从中的API异步 componentDidMount() ,一旦可用,组件就应该显示用户电子邮件。 组件安装() 一旦有空就打印电子邮件。

    最后这是 index.js :

    import React from 'react';
    import ReactDOM from 'react-dom';
    import createBrowserHistory from 'history/createBrowserHistory';
    import { Provider } from 'mobx-react';
    import { RouterStore, syncHistoryWithStore } from 'mobx-react-router';
    import { Router } from 'react-router';
    
    import App from './App';
    import { user } from './state/user';
    
    const documentElement = document.getElementById('ReactApp');
    
    if (!documentElement) {
      throw Error('React document element not found');
    }
    
    const browserHistory = createBrowserHistory();
    const routingStore = new RouterStore();
    
    const stores = { user };
    const history = syncHistoryWithStore(browserHistory, routingStore);
    
    ReactDOM.render(
      <Provider {...stores}>
        <Router history={history}>
          <App />
        </Router>
      </Provider>,
      documentElement,
    );
    

    我的问题是,一旦检索到用户并且电子邮件可用,组件就不会重新提交,尽管控制台日志显示它在异步请求中返回ok。我试过和mobx react玩 computed ,但运气不好。有什么想法吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Renwei Liu    6 年前

    我想如果你改变你的作曲顺序就行了 App.js :

    export default compose(
      inject('user'),
      withInitialise,
      observer,
    )(App);
    

    MobX official document ,

    提示:当observator需要与其他decorator或 最里面的 装饰者;否则它可能什么也做不了。