はい、React-Artがあることは知っていますが、壊れているようです。
問題は、d3.js はブラウザ DOM を変更するだけなので、componentDidMount メソッド内で直接使用しても、ブラウザ DOM へのすべての変更が React の仮想 DOM に反映されないため、正しく動作しないことです。何かアイデアはありますか?
ベストアンサー1
一つの戦略としては、Reactに更新させないブラックボックスコンポーネントを構築することが考えられます。コンポーネントライフサイクル方式は、shouldComponentUpdate()
コンポーネントが再レンダリングが必要かどうかを独自に判断できるようにすることを目的としています。いつもこのメソッドから戻るとfalse
、React は子要素に飛び込むことはありません (つまり、 を呼び出さない限りforceUpdate()
)。そのため、これは React のディープ アップデート システムに対する一種のファイアウォールとして機能します。
最初の呼び出しでrender()
チャートのコンテナを作成し、componentDidMount()
メソッド内でD3を使用してチャート自体を描画します。その後は、Reactコンポーネントの更新に応じてチャートを更新するだけです。想定でそのようなことを行う場合shouldComponentUpdate()
、そこからD3アップデートを呼び出すことができない理由はないと思います(Reactコンポーネントのコードを参照してください)。_performUpdateIfNecessary()
)。
したがって、コンポーネントは次のようになります。
React.createClass({
render: function() {
return <svg></svg>;
},
componentDidMount: function() {
d3.select(this.getDOMNode())
.call(chart(this.props));
},
shouldComponentUpdate: function(props) {
d3.select(this.getDOMNode())
.call(chart(props));
return false;
}
});
チャートは、componentDidMount()
メソッド (最初のレンダリング用) とshouldComponentUpdate()
(後続の更新用) の両方で呼び出す必要があることに注意してください。また、コンポーネントのプロパティまたは状態をチャートに渡す方法が必要であり、それらはコンテキスト固有であることにも注意してください。最初のレンダリングでは、それらはすでに および に設定されていますthis.props
がthis.state
、その後の更新では新しいプロパティがコンポーネントにまだ設定されていないため、代わりに関数パラメータを使用する必要があります。
jsfiddleを参照ここ。