css ReactJS中的模态转换Tabler/Bootstrap

2ic8powd  于 2023-04-01  发布在  React
关注(0)|答案(1)|浏览(124)

我正在用一些ReactJS组件构建一个Tabler Jmeter 板。起初我使用普通的HTML页面,使用Jinja 2模板,但我开始为一些组件实现ReactJS。
我不想使用太多的第三方工具,如react-tabler或bootstrap-tabler,因为它会创建很多我可能并不真正需要的额外包。我已经能够创建一个漂亮的Tabler Jmeter 板,使用ReactJS组件,而不需要这些包。
我现在遇到的唯一问题是显示一个Modal....现在这个可以工作了,但是CSS过渡并不真正。至少,一开始不是。我让他们这样工作:

// handle button click
const handleEditClick = (row) => {
    setIsModalOpen(true);
    modalRef.current.style.display = "block";

    // delay to make sure block is set first
    setTimeout(() => {
        modalRef.current.classList.add("show");
    }, 100);
};

问题是我不太喜欢这个感觉有点土
显示一个Modal可以很好地工作,只需首先添加style="display:block属性,然后添加show类。这样我就可以在没有太多额外JavaScript或其他东西的情况下工作。但是display:block必须首先设置。看起来,如果没有设置,它们会同时设置,或者稍后设置display:block,所以你不会看到转换。
我尝试添加以下事件列表modalRef.current.addEventListener("transitionend", handleTransitionEnd);,但我想这只适用于实际过渡,而不是更改样式。
有没有比100 ms超时更简洁的方法?显然,我不能在默认情况下添加display:block,因为这样我的应用程序就无法访问了,因为透明模式位于我的应用程序之上。

agxfikkp

agxfikkp1#

这就是我现在修复它的方法。我使用了两次useEffect,这是防止类“show”与display:block样式同时添加所必需的。
要关闭Modal,我实际上可以使用transitionend事件侦听器。

const MyComponent = () => {
    const [isModalOpen, setIsModalOpen] = useState(false);
    const [isButtonClicked, setIsButtonClicked] = useState(false);
    const modalRef = useRef(null);

    const [isStyleApplied, setIsStyleApplied] = useState(false);
    const [isClassApplied, setIsClassApplied] = useState(false);

    const handleEditClick = () => {
        setIsModalOpen(true);
        setIsButtonClicked(true);
    };

    useEffect(() => {
        const applyStyle = () => {
            if (modalRef.current && !isStyleApplied && isButtonClicked) {
                modalRef.current.style.display = 'block';
                setIsStyleApplied(true);
            }
        };

        applyStyle();
    }, [isButtonClicked, isStyleApplied]);

    useEffect(() => {
        const applyClass = () => {
            if (modalRef.current && isButtonClicked && isStyleApplied && !isClassApplied) {
                modalRef.current.classList.add('show');
                setIsClassApplied(true);
            }
        };

        applyClass();
    }, [isButtonClicked, isStyleApplied, isClassApplied]);

    const handleCloseModal = () => {
        setIsModalOpen(false);

        modalRef.current.addEventListener("transitionend", handleTransitionEnd);
        modalRef.current.classList.remove("show");

        function handleTransitionEnd() {
            modalRef.current.removeEventListener("transitionend", handleTransitionEnd);
            modalRef.current.style.display = "none";
        }
        setIsButtonClicked(false);
        setIsStyleApplied(false);
        setIsClassApplied(false);
    };

    return (
        <a className="dropdown-item" onClick={() => handleEditClick(row)} href="#">Open Modal</a>
        <EditModal row={selectedRow}  modalRef={modalRef} isOpen={isModalOpen} onClose={handleCloseModal} />
    );
}

相关问题