我将 Gatsby 与 MDX 插件一起使用。所以我可以在 markdown 中使用 React 组件。没关系。
我有组件,互相交谈。为此,我使用提升状态向上模式。没关系。
这是一个基本的 Counter 示例,用于展示我的概念验证代码。
import React from "react"
export class Counter extends React.Component {
constructor(props) {
super(props)
this.state = { count: 0 }
this.handleCounterUpdate = this.handleCounterUpdate.bind(this)
}
handleCounterUpdate() {
this.setState({ count: this.state.count + 1 })
}
render() {
const children = React.Children.map(this.props.children, child => {
const additionalProps = {}
additionalProps.count = this.state.count
additionalProps.handleCounterUpdate = this.handleCounterUpdate
return React.cloneElement(child, additionalProps)
})
return <div>{children}</div>
}
}
export function Display({ count }) {
return <h2>Current counter is: {count}</h2>
}
export function UpdateButton({ handleCounterUpdate }) {
return <button onClick={handleCounterUpdate}>Increment couter by one</button>
}
通过此设置,可以使用这样的组件
<Counter>
<Display />
<UpdateButton />
</Counter>
甚至像这样
<Counter>
<Display />
<UpdateButton />
<Display />
<Display />
</Counter>
没关系。
在现实世界中,封闭的 Counter 组件(状态持有者)将类似于 Layout 组件。在<Layout>模板中使用并呈现 MDX 页面。这看起来像这样:
<SiteLayout>
<SEO title={title} description={description} />
<TopNavigation />
<Display /> // The state holder is <SiteLayout>, not <Counter>
<Breadcrumb location={location} />
<MDXRenderer>{page.body}</MDXRenderer> // The rendered MDX
</SiteLayout>
(<UpdateButton>在现实世界中类似<AddToCartButton>)在 MDX 页面上,不再是<Layout>组件的直接子项。
该模式不再起作用。
我该如何解决这个问题?
潇潇雨雨
相关分类