我正在阅读关于不要改变原始组件的部分。使用此链接中的组合。
https://reactjs.org/docs/higher-order-components.html
然后我回顾了一个我正在尝试构建的项目。在高层次上,这就是我的代码的样子:
class Wrapper extends Component {
constructor(props) {
this.wrappedComponent = props.wrappedComponent;
}
async componentWillAppear(cb) {
await this.wrappedComponent.prototype.fetchAllData();
/* use Greensock library to do some really fancy animation on the wrapper <Animated.div> */
this.wrappedComponent.prototype.animateContent();
cb();
}
render() {
<Animated.div>
<this.wrappedComponent {...this.props} />
</Animated.div>
}
}
class Home extends Component {
async fetchAllData(){
const [r1,r2] = await Promise.All([
fetch('http://project-api.com/endpoint1'),
fetch('http://project-api.com/endpoint2')
]);
this.setState({r1,r2});
}
animateContent(){
/* Use the GreenSock library to do fancy animation in the contents of <div id="result"> */
}
render() {
if(!this.state)
return <div>Loading...</div>;
return (
<div id="result">
{this.state.r1.contentHTML}
</div>
);
}
}
export default class App extends Component {
render() {
return <Wrapper wrappedComponent={Home} />;
}
}
我的问题是:
- 在我的
Wrapper.componentWillAppear()
中,我触发了对象方法,例如this.wrappedComponent.prototype.<methodname>
. 这些对象方法可以设置它自己的状态或在渲染函数中为 html 的内容设置动画。这是否考虑改变原始组件? - 如果问题 1 的答案是肯定的,那么也许我需要一种更好的设计模式/方法来完成我试图在我的代码中描述的内容。这基本上是我的大部分组件需要获取自己的数据(
Home.fetchAllData(){then set the state()}
),更新视图(Home.render()
),运行一些通用动画函数(Wrapper.componentWillAppear(){this.animateFunctionOfSomeKind()}
),然后运行特定于自身的动画(Home.animateContent()
)。所以也许用抽象方法继承更适合我想做的事情?