使用ReactDom.createportal 实现弹框


import React, { Children, useEffect, useState } from "react";
import ReactDOM from "react-dom";
import "./c1.css";
const Modal = (props: any) => {  //第一次渲染dom 走生命周期  还会在渲染拿值
    console.log(props, 1114)
    const [target, setTarget] = useState(null);
    console.log(target, 1111, target)
    useEffect(() => {
        console.log(1, document.getElementById("modal-root"))
        setTarget(document.getElementById("modal-root") as any);
    }, []);


    useEffect(() => {
        console.log("show change", props.show);
    }, [props.show]);

    if (!props.show) return null;  //false 就返回null 

    const close = () => {
        console.log("modal close");
        props.onClose();
    };
    const children = (
        <div className="modal">
            modal <button onClick={close}>close</button>
        </div>
    );
    console.log("Modal", children, target);
    //target 一拿到dom 就会添加一个dom 到 target
    return target ? ReactDOM.createPortal(children, target as any) : <div>无父元素</div>;
};
const C = () => {
    const [show, setShow] = useState(false);
    const onClose = () => {
        console.log("C onClose");
        setShow(false);
    };
    return (
        <div>
            C,
            <Modal show={show} onClose={onClose}></Modal>
            <button onClick={() => setShow((i) => !i)}>change</button>
        </div>
    );
};
const A = (props: any) => {

    return (
        <>
            <div id="modal-root"></div>
            <div id="father">
                
            </div>
        </>
    );
};

export default A;
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容