2 回答
TA贡献1828条经验 获得超4个赞
我的建议是重新考虑你的程序流程。通常,没有上下文和/或 redux 或其他状态管理器的帮助,您不会看到不相关的组件相互交谈。通过不相关的组件,我们可以将它们定义为那些不共享相对接近的共同祖先的组件,例如,使用状态控制其 props.children 的包装组件。
虽然我相信你可以用 Portals 实现你想要的结果,但它们通常用于渲染模态和类似的组件,如对话框、消息等。
考虑到这些事实,遵循 Facebook 建议的自上而下流程的推荐方法是:
export default class MainWrapper extends React.Component {
state = {
buttonAtLeft: true,
}
changeButtonPosition = () => {
this.setState({ buttonAtLeft: !this.state.buttonAtLeft });
}
render() {
const { buttonAtLeft } = this.state;
return (
<div>
<ParentLeft>
{
buttonAtLeft
? <Button onClick={this.changeButtonPosition} />
: undefined
}
</ParentLeft>
<ParentRight>
{
buttonAtLeft
? undefined
: <Button onClick={this.changeButtonPosition} />
}
</ParentRight>
</div>
);
}
}
只需记住更新 ParentRight/Left 组件,让它们在其渲染方法上渲染 props.children:
render() {
return (
<div className="container">
{this.props.children}
</div>
)
}
解释:
MainWrapper 现在负责改变按钮的位置,它也作为 ParentLeft 和 ParentRight 之间交换通信的桥梁。它的方法 changeButtonPosition 只是切换布尔值 buttonAtLeft,它可以在 MainWrapper 的状态中找到。
随后,我们根据 state.buttonAtLeft 进行条件渲染,将按钮渲染到其合适的位置。
TA贡献1836条经验 获得超13个赞
命名的顶级组件container必须具有定义图形及其位置的所有状态。让它成为Bridge组件:
class Bridge = () => {
const figures = useState()
const squares = useState()
render board.each(square =>
<Square figure={figure[square]}>
)
}
创建组件Square:
class Square = ({figure}) => {
render (
<Figure figure={figure}>
)
}
创建组件Figure:
class Figure = ({figure}) => {
render switch(figure) {
case 'king': return <King/>
case 'queen': return <Quieen/>
default: return null
)
}
所以现在如果你需要方形按钮,只有当方形有图形时,你可以像这样制作方形:
class Square = ({figure}) => {
render (`
<React.Fragment>
<Figure figure={figure}>
{figure ? <Button> : null}
</React.Fragment>
)
}
对您的ParenLeft和使用相同的方法ParentRight。或者创建通用Parent组件。并像这样使用它<Paren left/>或<Paren right/>。请参阅Figure如何使用条件。
您不能使用ReactDOM.createPortal()将某些东西从反应树的一个地方渲染到另一个地方 - 因为门户是另一个额外的反应树。要将某些东西从一个反应位置渲染到另一个反应位置,您需要通过反应
添加回答
举报
