Я использую Gatsby с плагином MDX. Так что я могу использовать компоненты React в уценке. Это нормально.
У меня есть компоненты, которые разговаривают друг с другом. Для этого я использую Шаблон подъема состояния подъема . Это нормально.
Вот базовый пример c счетчика, чтобы показать мой код подтверждения концепции.
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>
используется в шаблоне и отображает страницы многомерных выражений. Это выглядит так:
<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>
.
Шаблон больше не работает.
Как я могу решить эту проблему?
Всем спасибо