React 动态创建打开相应模态的按钮
React dynamically create buttons that open the corresponding modal
我正在尝试动态显示 3 个按钮,每个按钮打开一个不同的模式。我正在努力寻找打开属于按钮的模式的解决方案。
我尝试像下面的代码一样实现它。它没有像我预期的那样工作,但我正在努力寻找实现预期结果的正确方法。
按钮-模态代码:
export default function SidenavButtons(props) {
const [modalShow, setModalShow] = React.useState(false);
return (
<React.Fragment>
<a class="dropdown-item" onClick={() => {setModalShow(true)}}>{props.usage}</a>
{
if(props.usage === "post" && modalShow){
<CreatePostModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
if(props.usage === "tweet" && modalShow){
<CreateTweetModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
if(props.usage === "tiktok" && modalShow){
<CreateTiktokModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
}
</React.Fragment>
)
}
您的错误是在 return 中使用了 if 语句。您可以像下面这样使用表达式本身
export default function SidenavButtons(props) {
const [modalShow, setModalShow] = React.useState(false);
return (
<React.Fragment>
<a class="dropdown-item" onClick={() => {setModalShow(true)}}>{props.usage}</a>
{props.usage === "post" && modalShow &&
<CreatePostModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
{props.usage === "tweet" && modalShow &&
<CreateTweetModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
{props.usage === "tiktok" && modalShow &&
<CreateTiktokModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
}
</React.Fragment>
)
}
你怎么看这个:
export default function SidenavButton(props) {
const [modalShow, setModalShow] = React.useState(false);
return (
<React.Fragment>
<a class="dropdown-item" onClick={() => {setModalShow(true)}}>{props.usage}</a>
{modalShow && (
<Modal onHide={() => setModalShow(false)} show>
{props.usage === 'post' && (
// Put here the content that would go inside CreatePostModal
)}
{props.usage === 'tweet' && (
// Put here the content that would go inside CreateTweetModal
)}
{props.usage === 'tiktok' && (
// Put here the content that would go inside CreateTiktokModal
)}
</Modal>
)}
</React.Fragment>
)
}
模态元素看起来像这样:
export default function Modal(props) {
return <React.Fragment>
{props.show && (
<div className="modal-class-name">
//Here I use props.children to render everything that is rendered inside
//the modal
{props.children}
<button onClick={props.onHide}>Close</button>
</div>
)}
</React.Fragment>
}
我喜欢这种方法,因为它分离了关注点。有一个 Modal
组件处理在模态框上显示内容,还有一个 SidenavButton
组件使用 Modal
根据用途在模态中呈现内容。
最后,简单提醒一下:
if(props.usage === "tiktok" && modalShow){
<CreateTiktokModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
不会渲染任何东西,因为你只能将值放在括号内,而不是实际的 javascript 代码,正确的实现是:
{
(props.usage === "tiktok" && modalShow) && (
<CreateTiktokModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
)
}
我正在尝试动态显示 3 个按钮,每个按钮打开一个不同的模式。我正在努力寻找打开属于按钮的模式的解决方案。 我尝试像下面的代码一样实现它。它没有像我预期的那样工作,但我正在努力寻找实现预期结果的正确方法。
按钮-模态代码:
export default function SidenavButtons(props) {
const [modalShow, setModalShow] = React.useState(false);
return (
<React.Fragment>
<a class="dropdown-item" onClick={() => {setModalShow(true)}}>{props.usage}</a>
{
if(props.usage === "post" && modalShow){
<CreatePostModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
if(props.usage === "tweet" && modalShow){
<CreateTweetModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
if(props.usage === "tiktok" && modalShow){
<CreateTiktokModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
}
</React.Fragment>
)
}
您的错误是在 return 中使用了 if 语句。您可以像下面这样使用表达式本身
export default function SidenavButtons(props) {
const [modalShow, setModalShow] = React.useState(false);
return (
<React.Fragment>
<a class="dropdown-item" onClick={() => {setModalShow(true)}}>{props.usage}</a>
{props.usage === "post" && modalShow &&
<CreatePostModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
{props.usage === "tweet" && modalShow &&
<CreateTweetModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
{props.usage === "tiktok" && modalShow &&
<CreateTiktokModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
}
</React.Fragment>
)
}
你怎么看这个:
export default function SidenavButton(props) {
const [modalShow, setModalShow] = React.useState(false);
return (
<React.Fragment>
<a class="dropdown-item" onClick={() => {setModalShow(true)}}>{props.usage}</a>
{modalShow && (
<Modal onHide={() => setModalShow(false)} show>
{props.usage === 'post' && (
// Put here the content that would go inside CreatePostModal
)}
{props.usage === 'tweet' && (
// Put here the content that would go inside CreateTweetModal
)}
{props.usage === 'tiktok' && (
// Put here the content that would go inside CreateTiktokModal
)}
</Modal>
)}
</React.Fragment>
)
}
模态元素看起来像这样:
export default function Modal(props) {
return <React.Fragment>
{props.show && (
<div className="modal-class-name">
//Here I use props.children to render everything that is rendered inside
//the modal
{props.children}
<button onClick={props.onHide}>Close</button>
</div>
)}
</React.Fragment>
}
我喜欢这种方法,因为它分离了关注点。有一个 Modal
组件处理在模态框上显示内容,还有一个 SidenavButton
组件使用 Modal
根据用途在模态中呈现内容。
最后,简单提醒一下:
if(props.usage === "tiktok" && modalShow){
<CreateTiktokModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
}
不会渲染任何东西,因为你只能将值放在括号内,而不是实际的 javascript 代码,正确的实现是:
{
(props.usage === "tiktok" && modalShow) && (
<CreateTiktokModal
show={modalShow}
onHide={() => setModalShow(false)}
modelUsage={props.usage}
/>
)
}