【发布时间】:2021-05-01 20:16:12
【问题描述】:
我正在尝试在按钮单击时呈现自定义和动态模式。例如,当单击“游戏”按钮时,我希望使用有关游戏的详细信息来呈现模式,当单击“银行”按钮时,我希望使用有关银行的详细信息来填充模式。
首先,当我将 onClick 函数添加到自定义按钮组件时,模态不会呈现。但是,当我将 onClick 函数放在常规按钮上时,模式会呈现。如何在任何组件上简单地添加 onClick 函数来呈现动态模式?
其次,我想用不同的数据填充每个模式。例如,“游戏”按钮将使用标题“游戏”等填充模态框。我正在使用道具来做到这一点,但这是最好的解决方案吗?
这是我到目前为止的代码,但是当我将 onClick 函数添加到组件时它被破坏了。
// Navbar.js
import { ModalContext } from '../contexts/ModalContext'
function Navbar() {
const [showModal, updateShowModal] = React.useState(false)
const toggleModal = () => updateShowModal((state) => !state)
return(
<ModalContext.Provider value={{ showModal, toggleModal }}>
<Modal
title="Title"
canShow={showModal}
updateModalState={toggleModal}
/>
</ModalContext.Provider>
)
// does not render a modal
<Button
onClick={toggleModal}
type="navItem"
label="Game"
icon="windows"
/>
// render a modal
<button onClick={toggleModal}>Show Modal</button>
)
}
import { ModalContext } from '../contexts/ModalContext'
// Modal.js
const Modal = ({ title }) => {
return (
<ModalContext.Consumer>
{(context) => {
if (context.showModal) {
return (
<div style={modalStyles}>
<h1>{title}</h1>
<button onClick={context.toggleModal}>X</button>
</div>
)
}
return null
}}
</ModalContext.Consumer>
)
}
// modalContext.js
export const ModalContext = React.createContext()
// Button.js
function Button({ label, type = 'default', icon }) {
return (
<ButtonStyle buttonType={type}>
{setIcon(icon)}
{label}
</ButtonStyle>
)
}
【问题讨论】:
-
可以分享
Button组件的实现吗?它是否将onClick属性代理到任何可点击的底层 DOMNode/元素?如果您想使模态内容动态化,那么我建议将其作为ModalContext状态的一部分并为其公开更新程序功能。我还看到您的ModalContext.Provider没有渲染/包装children,因此它实际上无法为任何消费者提供上游上下文。 -
检查我更新的 Button.js 实现代码。
-
我明白了,它不会解构并将
onClick属性传递给任何东西,因此它不可点击。你也可以分享ButtonStyle组件吗? -
@DrewReese ButtonStyle 只是同一个 Button.js 文件中的样式化组件。就是这样:
const ButtonStyle = styled.button....`
标签: javascript reactjs modal-dialog components react-context