非同期にフェッチされたデータに基づいて反応コンポーネントを初期状態にする方法がわかりました。 MyComponentはAPIからデータをフェッチし、その内部のdata
プロパティをMobx action
で設定します。コンポーネントデータをMobxと非同期にサーバー側にロード
クライアント側では、componentDidMount
が呼び出され、データが取得され、正しく設定されてレンダリングされます。
import React from 'react';
import { observer } from 'mobx-react';
import { observable, runInAction } from 'mobx';
@observer
export default class MyComponent extends React.Component {
@observable data = [];
async fetchData() {
loadData()
.then(results => {
runInAction(() => {
this.data = results;
});
});
}
componentDidMount() {
this.fetchData();
}
render() {
// Render this.data
}
}
私はサーバー上でcomponentDidMount
が呼び出されていないことを理解しています。私は最初の店がProvider
コンポーネントを介して計算され、渡され、多くの記事を見てきました
import React from 'react';
import { renderToString } from 'react-dom/server';
import { useStaticRendering } from 'mobx-react';
import { match, RouterContext } from 'react-router';
import { renderStatic } from 'glamor/server'
import routes from './shared/routes';
useStaticRendering(true);
app.get('*', (req, res) => {
match({ routes: routes, location: req.url }, (err, redirect, props) => {
if (err) {
console.log('Error', err);
res.status(500).send(err);
}
else if (redirect) {
res.redirect(302, redirect.pathname + redirect.search);
}
else if (props) {
const { html, css, ids } = renderStatic(() => renderToString(<RouterContext { ...props }/>));
res.render('../build/index', {
html,
css
});
}
else {
res.status(404).send('Not found');
}
})
})
:
は、私は私のサーバーのためにこのようなものを持っています。私のコンポーネントはレンダリングされますが、状態は初期化されません。私はこのデータをストアに保持し、それをコンポーネントのローカルスコープにしたいと考えていません。どのようにそれを行うことができますか?
ストアを使用して初期化する以外に方法はありませんか? – Komo
はい、あります。第2のリンクを参照してください – mweststrate
ありがとう、私はhttps://github.com/ericclemmons/react-resolverを使用して2番目のアプローチを使用しました – Komo