Ajax呼び出しでreactを使用するという面白いケースがあります。ajax呼び出しライフサイクルを持つ反応コンポーネント
文脈に入れると、3つのタブを持つアコーディオンがあります。 Accordionの反応コンポーネントを初期化した後、最初のタブが最初に開き、残りの部分が閉じられます。 すべてのタブには、次のようになり、それの体いわゆるDictionaryCallコンポーネントであり:小道具とReact docs初期状態設定に応じて、すべての
return class DictionaryCall extends React.Component {
constructor (props) {
super();
this.state = {
word: '',
data: [],
error: false,
nodata: false,
initialLoaded: props.load
}
}
componentDidMount() {
if(this.state.initialLoaded){
this.callAjax();
}
}
componentWillReceiveProps (nextProps) {
if(nextProps.load){
this.setState({initialLoaded: true});
this.callAjax();
}
}
callAjax() {
$.ajax({
url: this.props.url,
dataType: 'json',
catche: false,
method: 'POST',
data: {word: this.props.word},
success: function(data){
if(!data.length){
this.setState({nodata: true});
} else {
this.setState({data: data});
}
}.bind(this),
error: function(xhr, status, error){
console.log(this.props.url, status, error.toString());
this.setState({error: true});
}.bind(this)
});
}
render() {
let body,
error = this.state.error;
if(this.state.nodata){
body = <div>No definition found</div>
} else {
body = <DataTab data={this.state.data} title={this.props.word}/>
}
return (
<div className="dictionary-call">
{body}
{error ? <ServerError onClick={this.callAjax.bind(this)}/> : null}
</div>
)
}
};
拳あなたはそれが唯一のコンポーネントの初期化のためだ、明示的に指定するまで、アンチパターンです。
コンストラクタで見ることができるように、initialLoaded
の状態をprops.load
に設定しています。 props.load
をtrue
として最初のAccordionタブに渡していますが、最初にロードする必要があります。
componentDidMount
メソッドが呼び出され、initialLoaded
状態をチェックします。 true
に設定されている場合、単にajaxを呼び出してコンポーネントを再レンダリングします。
今やトリッキーなビットです。 componentWillReceiveProps
メソッド。私は、ユーザーがアコーディオンタブをクリックして開くときにコンポーネントがnextProps.load
を受け取ることを期待しています。次に、をtrue
の値のコンポーネントに渡します。
私の質問はcomponentWillReceiveProps
といいますか?this.callAjax()
に電話するのはいいですか?この場合、initalLoaded
状態を作成するのは少し意味がないようです。代わりにprops.load
をベースにして、shouldComponentUpdate
と呼んではいけませんか?
それとも私がinitalLoaded
状態に固執し、componentWillUpdate
またはcomponentDidUpdate
を使用する必要があります。
心に留めておいてください。初めてアコーディオンタブを開いたときに、ajaxコールを1回呼び出すだけです。
ありがとうございます!
このアーキテクチャを使用することに限定していますか?私は、アコーディオンのコンポーネントの中でajaxを呼び出すことによってアンチパターンを永続させると思います。アコーディオンコンポーネントは、データの表示のみを処理し、何も取得しないようにしてください。あなたの最上位レベルのコンポーネントでさえ、フェッチやアコーディオンの状態を上げて扱うことで、これはずっと簡単でしょうか? – azium
いいえ、別のエンドポイントから各タブをフェッチしたいと思います。さらに、ユーザーがタブヘッダーをクリックしたときにのみ、 'this.props.open'に基づいてフェッチをトリガーします。だから私にとってはまったく問題ない。 – matewilk
これはあなたにとってうれしいことですが、私はあなたにこれを扱うもっと「リアクト」な方法を検討することを奨めます。フラックススタイルの実装では、コンポーネントがajax呼び出しを行うことはなく、アクションレイヤーですべて処理されます。これにより、コンポーネントの動作の見栄えを完全に重視することができます。 – azium