當我讀到mixin是多麼糟糕,並且自己做出了一些不好的體驗之後,我想重構我的代碼以使用mixin混合來實現可重用性。反應mixin到組成重構
我想要一個組件發出事件並進行風格化。所以我有mixins EventEmitter,其中包含操作事件的函數和包含操作樣式的函數的Stylable。
var Styleable = {
addStyleProperty: function(styleProperty) {
...
},
...
};
var EventEmitter = {
addEventListener: function(eventName, func) {
},
...
};
隨着混入爲例成分如下所示:
var Button = React.createClass({
mixins = [EventEmitter, Styleable],
...
});
隨着組成我試圖創建的設置樣式和EventEmitter成分是這樣的:
var StylableComponent = React.createClass({
addStyleProperty: ...
render: function() {
React.createElement(this.props.wrappedComponent, ...)??
}
}
var EventEmitterComponent = ...
但我不知道如何正確使用它們。我讀過,我必須使用這些組件作爲包裝,但我不知道如何實現這一點。我試圖像在上面例子的渲染函數中那樣做。我怎樣才能實現一個像mixin變體一樣的函數按鈕?所以,我只是通過所需的功能如下:
<Button is={[StyleableComponent, EventEmitterComponent]}/>
或者我期待從組成錯誤的行爲?
我已閱讀給定的來源,這就是爲什麼我試圖重構它。如果有一個我想添加的功能,比如EventEmitter,它工作得很好。但是,如果我想添加Styleable,我也有一個像'styleableWrapper'這樣的鏈,然後把已經包裝好的對我來說很臭的組件。我希望你明白這一點。我也無法再訪問'eventEmitterWrapper'中聲明的函數。 – landunder
高階組件可以包裝更高階的組件;它根本不臭(這只是功能組成!)。我認爲只要沒有相互依賴關係......如果'styleableWrapper'依賴於'eventEmitterWrapper',它會變得有點臭,但聽起來並不是這樣。 –
爲了您對無法訪問在eventEmitterWrapper中聲明的函數的評論,需要將它們作爲道具傳遞下來。因爲每個HOC都會傳遞所有委託的道具,所以您傳遞的任何內容都將由'{... this.props}'收集。 –