阵营高阶组件初始道具
问题描述:
我创建一个播放器库,并希望做出反应流向是这样的:阵营高阶组件初始道具
PlayerHOC -> PlaylistHOC -> FooterContainer
。
我希望它朝这个方向走的原因是PlayerHOC
有PlaylistHOC
和FooterContainer
需要访问(即从道具)的方法。
我的代码:
class FooterContainer extends React.Component {
render() {
return (
<div>
<div className="jp-type-footer" >
//...
</div>
</div>
);
}
}
class FooterPlayer extends React.Component {
constructor() {
super();
this.options = {
smoothPlayBar: false,
muted: true,
//...
};
}
render() {
return (
<Player {...this.options} />
);
}
};
export const PlaylistHOC = (WrappedComponent) => class extends React.Component {
constructor(props) {
super(props);
//Add a new stateClass for the extra loop option
this.stateClass = merge({
shuffled: "state-shuffled",
loopedPlaylist: "state-loop-playlist"
}, this.props.stateClass);
}
setPlaylist =() => {}
};
export const PlayerHOC = (WrappedComponent) => class extends React.Component {
constructor(props) {
super(props);
//get passed in props from FooterPlayer and PlaylistHoc
}
play =() => {}
pause =() => {}
};
const Player = PlayerHOC(PlaylistHOC(FooterContainer));
export default connect()(FooterPlayer);
我也道具传递从FooterPlayer
到PlayerHOC
的正常工作。不过,我也想从PlaylistHOC
到PlayerHOC
的默认道具,这将永远不会更新,我不知道如何做到这一点,同时也保持这种流动。
例如:const Player = PlaylistHOC(PlayerHOC(FooterContainer));
这将让我在最初的道具通过从PlaylistHOC
和FooterPlayer
到PlayerHOC
后来我将无法通过道具来访问PlayerHOC
方法。
我该怎么做?
答
我会使用const Player = PlaylistHOC(PlayerHOC(FooterContainer));
,因为父组件无法从其子组件接收道具。
看起来像PlaylistHOC
和PlayerHOC
是mixin,所以它们应该从被包装的组件继承而不是React.Component
。
我已经更改了一段代码以便能够测试它,但其关键想法是我已将WrappedComponent
而不是React.Component
扩展到您的mixins中。
class FooterContainer extends React.Component {
render() {
return (
<div>
<div className="jp-type-footer">
<button onClick={this.play.bind(this)}>Play</button>
</div>
</div>
);
}
}
class FooterPlayer extends React.Component {
constructor() {
super();
this.options = {
smoothPlayBar: false,
muted: true
//...
};
}
render() {
return (
<Player {...this.options} />
);
}
};
export const PlaylistHOC = (WrappedComponent) => class extends WrappedComponent {
constructor(props) {
super(props);
//Add a new stateClass for the extra loop option
//this.stateClass = merge({
// shuffled: "state-shuffled",
// loopedPlaylist: "state-loop-playlist"
//}, this.props.stateClass);
}
setPlaylist() {
}
};
export const PlayerHOC = (WrappedComponent) => class extends WrappedComponent {
constructor(props) {
super(props);
//get passed in props from FooterPlayer and PlaylistHoc
}
play() {
console.log('playing');
}
pause() {
}
};
const Player = PlaylistHOC(PlayerHOC(FooterContainer));
export default connect()(FooterPlayer);
顺便说一句,尽量decorators对于一些真正看中的语法像
@PlayerlistHOC
@PlayerHOC
class FooterContainer {
}
被警告的装饰都没有明确,可能发生很大的变化。
好主意,但两种方法都返回undefined。另外'WrappedComponent()'抛出一个错误。所以我不认为我可以这样做。 –
我也试过'componentDidMount' –
我刚刚意识到'WrappedComponent'是对类的引用,而不是它的一个实例,因为它依赖于原型继承,所以方法应该在'prototype'上可用。尝试新的代码 –