【问题标题】:"Reactjs" How to create a modal inside a functional component without using hooks“Reactjs”如何在不使用钩子的情况下在功能组件内创建模式
【发布时间】:2020-08-16 07:05:41
【问题描述】:

我们能否在不使用钩子的情况下在功能组件中创建可切换的模式。实际上我正在尝试在功能组件中设计一个模态,但我无法实现我所尝试的。在谷歌上,我能找到的只有钩子。 这是我写的,但它不起作用

import React from 'react';
import { Card, CardImg, CardImgOverlay, CardBody, CardText, CardTitle, Breadcrumb, BreadcrumbItem, Button, Modal, ModalHeader } from 'reactstrap';
import { Link } from 'react-router-dom';

let isModalOpen = false;

const toggleModal = () => {
   isModalOpen = !isModalOpen;
   console.log(isModalOpen);
}

function RenderComments({comments}) {
if(comments!=null){
    const list = comments.map((comment) =>{
        let options = { year: 'numeric', month: 'long', day: 'numeric' };
        let dt = new Date(comment.date);
        return (
            <li key={comment.id}>
                {comment.comment}<br/><br/>
                -- {comment.author}, {dt.toLocaleString('en-US', options)}
                <br/><br/>
            </li>  
        );
    });
    return(
        <div className="col-12 col-md-7 mt-3 mb-3">
            <h4>Comments</h4>
            <ul className="list-unstyled">
                {list}
            </ul>
            <Button onClick={toggleModal} outline color="secondary"><span className="fa fa-pencil"></span> Submit Comment</Button>
        </div>
    );
}else{
    return (<div></div>);
}  
}

const DishDetail = (props) => {
if(props.dish!=undefined){
    return(
        <div className="container">
            <div className="row">
                <Breadcrumb>
                    <BreadcrumbItem><Link to="/menu">Menu</Link></BreadcrumbItem>
                    <BreadcrumbItem active>{props.dish.name}</BreadcrumbItem>
                </Breadcrumb>
                <div className="col-12">
                    <h3>{props.dish.name}</h3>
                </div>
                <RenderDish dish = {props.dish} />
                <RenderComments comments = {props.comments} />
            </div>
            <Modal isOpen={isModalOpen} toggle={toggleModal}>
                <ModalHeader toggle={toggleModal}>
                    Login
                </ModalHeader>
            </Modal>
         </div>
    )
}else{
    return(<div></div>);
}
}

export default DishDetail;

有人能解释一下为什么这段代码不起作用吗?

在调试器中,我发现模态的 isOpen 属性始终为 false,并且在单击按钮时不会改变

【问题讨论】:

    标签: reactjs modal-dialog


    【解决方案1】:

    实际上你的代码可以工作,但是 react 组件没有重新渲染,因为 react 不知道有什么变化,这就是你必须使用 useState 钩子的原因。

    代码改动不大,只是把isModalOpen状态放在函数顶部

    const [isModalOpen, setisModalOpen] = useState(false);
    
    const toggleModal = () => {
       setisModalOpen(!isModalOpen);
       console.log(isModalOpen);
    }
    

    【讨论】:

    • 非常感谢您的帮助,但我正在做一门课程,该课程是其中的一部分。它是一个没有钩子的旧课程。所以我想知道是否有一种方法可以在不使用钩子的情况下实现所需的功能。
    • 您可以将 isModalOpen 添加为组件的道具,并从父组件更改它
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 2021-06-25
    • 2021-04-13
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 2018-04-08
    • 2020-08-04
    相关资源
    最近更新 更多