使用 react-mobx 重新渲染异步获取
Rerendering on async fetch with react-mobx
我正在尝试使用 mobx-rest with mobx-rest-axios-adapter and mobx-react,但我无法在异步数据检索时重新呈现组件。
这是我的数据模型,在 state/user.js
:
import { Model } from 'mobx-rest';
class User extends Model {
url() {
return '/me';
}
}
export default new User();
这是 React 组件,在 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 从 componentDidMount()
中的 API 异步获取 user
,一旦可用,该组件应该显示用户电子邮件。 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,
);
我的问题是,一旦检索到用户并且电子邮件可用,组件就不会重新呈现,尽管控制台日志显示它在异步请求中返回正常。我试过玩弄 mobx-react 的 computed
,但没有成功。有什么想法吗?
我认为如果您更改 App.js
:
的撰写顺序,它会起作用
export default compose(
inject('user'),
withInitialise,
observer,
)(App);
Tip: when observer needs to be combined with other decorators or
higher-order-components, make sure that observer is the innermost
(first applied) decorator; otherwise it might do nothing at all.
我正在尝试使用 mobx-rest with mobx-rest-axios-adapter and mobx-react,但我无法在异步数据检索时重新呈现组件。
这是我的数据模型,在 state/user.js
:
import { Model } from 'mobx-rest';
class User extends Model {
url() {
return '/me';
}
}
export default new User();
这是 React 组件,在 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 从 componentDidMount()
中的 API 异步获取 user
,一旦可用,该组件应该显示用户电子邮件。 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,
);
我的问题是,一旦检索到用户并且电子邮件可用,组件就不会重新呈现,尽管控制台日志显示它在异步请求中返回正常。我试过玩弄 mobx-react 的 computed
,但没有成功。有什么想法吗?
我认为如果您更改 App.js
:
export default compose(
inject('user'),
withInitialise,
observer,
)(App);
Tip: when observer needs to be combined with other decorators or higher-order-components, make sure that observer is the innermost (first applied) decorator; otherwise it might do nothing at all.