我正在构建一个网页,实现了每个组件共享的通用样式(相同的背景、边框和标题样式)。所以我想我应该制作一个HOC,它接受每个组件的内部内容以及一个标题,并返回一个外部组件,它封装了这个内部组件和标题。起初,我在尝试让它发挥作用时遇到了很多问题,因为我是一个新的反应者,但现在它终于起作用了,但我仍然不明白怎么做。
这是我的HOC
const BaseBlock = (WrappedComponent) => {
return class BaseBlock extends Component {
render () {
return (
<div className={styles['base-block']}>
<div className={styles['container']}>
<div className={styles['base-block-head']}>
{ this.props.title }
</div>
<div className={styles['base-block-body']}>
<WrappedComponent {...this.props} />
</div>
</div>
</div>
)
}
}
}
export default BaseBlock
这是WrappedComponent:
const HighlightsBlock = (props) => {
return <ListsComponent items={props.items} />
}
export default BaseBlock(HighlightsBlock)
这是ListsComponent
const ListsComponent = (props) => {
if (props.items) {
return (
<ul className={styles['styled-list']}>
{props.items.map((item, idx) => {
return (
<li key={idx} className={styles['styled-list-item']}>{item}</li>
)
})}
</ul>
)
} else return (
<h3>No highlights</h3>
)
}
export default ListsComponent
这就是我在应用程序中使用组件的方式:
<HighlightsBlock items={this.getHighlights()} title='Highlights' />
现在,我可以看到HighlightsBlock组件接收道具两次(一次是在我的应用程序中使用道具时,一次是在HOC基块中作为WrappedComponent)。如果我从这些地方移除道具,它就会停止工作。我不明白这是怎么回事。
这是因为这一行中的this.get突出显示()
,
<HighlightsBlock items={this.getHighlights()} title='Highlights' />
每次将props
传递给子组件时,都会执行此函数。
要解决此问题,请在父组件中维护一个状态值,并在
getHighlights
函数中设置该值,如,
getHighlights(){
//you logic to get data
this.setState({items:data.items}); //considering `data` is object which has `items`
}
现在您可以传递如下项:,
<HighlightsBlock items={this.state.items} title='Highlights' />
渲染
您可以认为Highlight sBlock组件嵌套了两层深,因此您需要将道具传递给它,首先作为
{...this.props}
从HOC
中,然后将其作为道具接收功能组件
我指的是这个创建React高阶组件的例子,摘自本文。 我正在努力完全理解 下面是我对上述代码的理解: 我们通过名称定义了一个HOC,它接受一个React组件(BaseComponent)。BaseComponent附带了它的props(称为P),它返回一个新的React组件,该组件接受props P 如何使用此HOC?以下尝试给出了一个打字脚本错误,即传递了太多参数: Modal React组件具
问题内容: 可以说我有: 在Tabs组件内部,具有属性 儿童[0](this.props.children)看起来像 儿童[0]。道具看起来像 最终,Children对象看起来像(这是我想要传递的): 问题是这样,如果我这样重写MultiTab 在选项卡组件内部 看起来和上面一样。 好像 我希望该物业看起来像。上面只是打印出Statement函数。 这是一个很奇怪的问题,但是长话短说,我正在使用一
Examples Using the `withRouter` utility 如果你想应用里每个组件都处理路由对象,你可以使用withRouter高阶组件。下面是如何使用它: import { withRouter } from 'next/router' const ActiveLink = ({ children, router, href }) => { const style =
我正在使用react语义ui模态对象。打开模态的对象是一个道具。 我想在另一个组件中嵌入模态: 如何传递JSX代码(
我试图理解React的高阶组件结构,但是所有的参考资料都假设您已经理解了在编写:BaseComponent{…this.props}{…this.state}时,spread操作符在高阶组件中的作用。如果组件已经作为道具传入,为什么有必要像这样展开道具?
在React中,高阶组件是重用组件逻辑的一项高级技术。高阶组件并不是React API的一部分。高阶组件源自于React生态。 具体来说,高阶组件是一个函数,能够接受一个组件并返回一个新的组件。 const EnhancedComponent = higherOrderComponent(WrappedComponent); 组件是将props转化成UI,然而高阶组件将一个组价转化成另外一个组件