javascript - 从传递给触发事件的无状态 React 组件中提取 HTML
问题描述
我正在尝试创建一个可重用的模式,该模式在 DOM 中呈现较高(的直接子级<body>
),并从任何地方获取传递给它的内容。
我必须使用触发事件之类的东西来设置模态的状态(除非我忽略了另一个选项)。Redux 不是一个选项,因为我在应用程序中没有它。
我的问题是,当我将包含内容的组件传递给触发事件时,它只呈现对象,但不呈现 html。为什么它这样工作对我来说很有意义,但我似乎找不到从该对象中提取内容的方法。
我的模态:
import React from "react"
import PropTypes from "prop-types"
import Rodal from 'rodal'
class ApplicationModal extends React.Component {
state = {
modalIsOpen: false,
htmlContent: ""
}
componentDidMount() {
$(window).on('modalToggle', (e, content) => {
this.modalToggle(() => this.setModalContent(content))
})
}
setModalContent = (content) => {
this.setState({htmlContent: content})
}
modalToggle = (callback) => {
this.setState({modalIsOpen: !this.state.modalIsOpen}, callback())
}
modalClose = () => {
this.setState({modalIsOpen: false})
}
modalOpen = () => {
this.setState({modalIsOpen: true})
}
render () {
return (
<React.Fragment>
<Rodal visible={this.state.modalIsOpen} onClose={this.modalClose} closeOnEsc={true} className={this.props.rodalClasses}>
<div id="modal-container">
<div dangerouslySetInnerHTML={{__html: this.state.htmlContent}}></div>
</div>
</Rodal>
</React.Fragment>
);
}
}
export default ApplicationModal
我的页面:
import React from "react"
import PropTypes from "prop-types"
class MyPage extends React.Component {
render () {
// This works
const html = `
<div className="modal-content">
<p>This is a question.</p>
<p>This is an answer.</p>
</div>
`
// This does not work
const ModalContent = () => (
<div className="modal-content">
<p>This is a question.</p>
<p>This is an answer.</p>
</div>
)
return (
<React.Fragment>
<h1>My page</h1>
{/* This works */}
<a href='javascript:void(0)' onClick={() => $(window).trigger('modalToggle', html)}>Learn more</a>
{/* This does not work */}
<a href='javascript:void(0)' onClick={() => $(window).trigger('modalToggle', <ModalContent/>)}>Learn more</a>
</React.Fragment>
);
}
}
export default MyPage
我希望能够将完整的组件传递到触发事件中,以便可以使用按钮和动态输入呈现内容。
我会完全错了吗?
如果不是很明显,Rodal 只是一个漂亮的模态库。
解决方案
您所描述的可以通过 Reactstrap(一个特定于 React 的引导库)和内置组件 Modal 来完成:
import React from "react";
import { Button, Modal, ModalHeader, ModalBody, ModalFooter } from "reactstrap";
const ApplicationModal = props => {
const modalBody = (
<div className="modal-content">
<p>This is a question.</p>
<p>This is an answer.</p>
</div>
);
return (
<div>
<Button color="danger" onClick={props.toggle}>
{props.props.buttonLabel}
</Button>
<Modal
isOpen={props.modal}
toggle={props.toggle}
className={props.className}
>
<ModalHeader toggle={props.toggle}>Modal title</ModalHeader>
<ModalBody>{modalBody}</ModalBody>
<ModalFooter>
<Button color="primary" onClick={props.toggle}>
Do Something
</Button>{" "}
<Button color="secondary" onClick={props.toggle}>
Cancel
</Button>
</ModalFooter>
</Modal>
</div>
);
};
export default ApplicationModal;
推荐阅读
- c# - 未在动态对象上设置属性时如何引发特定异常
- windows - MinGW vs MSVS下的Windos导出/导入符号;CMake 的 WINDOWS_EXPORT_ALL_SYMBOLS 被忽略
- php - 函数 App\Http\Controllers\Admin\AccountsController::index() 的参数太少,通过了 0 并且在 laravel 中预期正好 1
- jestjs - .env for jest 和 nest 不一样
- ldap - TDI for HCL Connections 6.5 同步失败并出现“错误的 SQL 语法 [];” 错误
- javascript - 打包使用 node-windows 作为服务运行的 Node.js 应用程序
- arrays - 类验证器不验证数组
- facebook - 在 chrome 扩展中使用 Facebook 消息 API/SDK?
- kubernetes - k3s - 树莓派上的高可用性 - 设置问题
- html - Chrome 在打印页面中给了我错误的边距