ミックスインが悪いことを読んだら、自分で悪い経験をした後、ミックスインでのコンポジションを再利用するためにコードをリファクタリングしたい。ミックスインと組成リファクタの比較
イベントを発生させてスタイリングできるようにしたい。イベントを操作する関数を含むmixin EventEmitterと、スタイリングを操作する関数を含むStylableがあります。
組成物でvar Button = React.createClass({
mixins = [EventEmitter, Styleable],
...
});
私はこのようなStyleableと持つEventEmitterのためのコンポーネントを作成しようとしました::
var StylableComponent = React.createClass({
addStyleProperty: ...
render: function() {
React.createElement(this.props.wrappedComponent, ...)??
}
}
var EventEmitterComponent = ...
しかし、私はないミックスインで
var Styleable = {
addStyleProperty: function(styleProperty) {
...
},
...
};
var EventEmitter = {
addEventListener: function(eventName, func) {
},
...
};
は、例えば、コンポーネントは、次のようになります。正しく使用する方法を知っている。私はこれらのコンポーネントをラッパーとして使用する必要があることを読んだが、これを達成する方法はわからない。上記の例のレンダリング関数のようにしてみました。 mixinのような機能を持つボタンをどうやってインスタンス化できますか?
<Button is={[StyleableComponent, EventEmitterComponent]}/>
それとも私が組成物からの間違った行動を期待しています:私はちょうどこのように必要なfunctionalitysを渡すように?
私はそれをリファクタリングしようとした理由があり、与えられたソースを読みました。 EventEmitterのように、追加したい機能が1つしかない場合はうまく動作します。しかし、もし私がStyleableを追加したいのであれば、私は 'styleableWrapper'のようなチェーンを持っています。私はあなたがポイントを得ることを願っています。また、 'eventEmitterWrapper'で宣言された関数にアクセスすることもできません。 – landunder
上位コンポーネントは上位コンポーネントをラップできます。それはまったく臭いではありません(それは単なる機能構成です!)。相互依存関係がない限り、私は思うに、 'styleableWrapper'が' eventEmitterWrapper'に依存すれば少し臭くなりますが、そのようには聞こえません。 –
'eventEmitterWrapper'で宣言された関数にアクセスできないというあなたのコメントのためには、それらをpropsとして渡す必要があります。各HOCはすべての委任された小道具を通過しているので、渡したものは '{... this.props} 'によって集められます。 –