reactjs - 模态组件 - 如何包含和打开/关闭另一个组件
问题描述
我刚开始学习 React。我有一个模态组件(基本上是 react-bootstrap 的模态组件的包装器)。这个想法是有一个“反馈”模式,我可以在不同的地方包含它。这种方法不起作用,我不知道我不知道什么:/
下面是我的意思/我如何尝试显示我的模态组件的一个快速示例
import React, { Component } from 'react'
import Modal from 'react-bootstrap/Modal'
import Button from "components/button/button"
export class BaseModal extends Component {
constructor(props) {
super(props);
this.state = { show: false };
}
toggleModal() {
this.setState({ show: !this.state.show })
}
render() {
if (!this.props.show) {
return null;
};
return (
<>
<Modal show={this.state.show}>
<Modal.Header closeButton>
<Modal.Title>Modal heading</Modal.Title>
</Modal.Header>
<Modal.Body>Woohoo, you're reading this text in a modal!</Modal.Body>
<Modal.Footer>
<Button variant="secondary" onClick={this.toggleModal}>
Close
</Button>
<Button variant="primary" onClick={this.toggleModal}>
Save Changes
</Button>
</Modal.Footer>
</Modal>
</>
)
}
}
像这样的简单页面 - 单击此按钮不会执行任何操作(React 开发工具在 vdom 中显示没有 BaseModal 节点)
import React, { Component } from 'react'
import Button from "components/button/button"
import BaseModal from "components/modals/baseModal"
export class ButtonDocs extends Component {
render() {
<Button value="Open Modal" onClick={BaseModal.toggleModal} />
}
}
解决方案
你不能只导入 aComponent
然后调用它的方法,因为你实际上并没有在任何地方渲染它。
您需要做的是渲染组件,然后如果您想从另一个组件控制一个组件的状态,您需要“提升状态”并将状态和所需的任何方法作为道具传递给模态组件。像这样的东西:
模态组件
import React, { Component } from 'react'
import Modal from 'react-bootstrap/Modal'
import Button from "components/button/button"
export class BaseModal extends Component {
render() {
if (!this.props.show) {
return null;
};
return (
<>
<Modal show={this.state.show}>
<Modal.Header closeButton>
<Modal.Title>Modal heading</Modal.Title>
</Modal.Header>
<Modal.Body>Woohoo, you're reading this text in a modal!</Modal.Body>
<Modal.Footer>
<Button variant="secondary" onClick={this.props.toggleModal}>
Close
</Button>
<Button variant="primary" onClick={this.props.toggleModal}>
Save Changes
</Button>
</Modal.Footer>
</Modal>
</>
)
}
}
按钮文档
import React, { Component } from 'react'
import Button from "components/button/button"
import BaseModal from "components/modals/baseModal"
export class ButtonDocs extends Component {
constructor(props) {
super(props);
this.state = { show: false };
}
toggleModal() {
this.setState({ show: !this.state.show })
}
render() {
<Button value="Open Modal" onClick={this.toggleModal} />
<BaseModal show={this.state.show} toggleModal={this.toggleModal} />
}
}
推荐阅读
- reactjs - 如何在 React/Redux/Jest 测试中的异步调用后测试方法调用
- javascript - Node.js:将多条路由集中到一个路由文件中
- c++ - d指针中的“d”代表什么?
- javascript - 选择具有目标总和的项目的最佳组合
- python - 删除直线网格线并更改极坐标图中的标签
- python - 快速计算交叉点
- python - 在 Python 中重新排列图像
- ruby - Typhoeus 是否支持 HTTP/2
- c# - 如何从视图中访问字典模型属性值 - ASP.Net MVC
- python - 为自动值创建一个具有简洁语法的 StringAutoEnum 类