使用 React ref 的通用 React bootstrap 模态
Generic react bootstrap modal using React ref
我正在使用 react-table 库,当用户单击展开图标时,我希望它使用(react-bootstrap 模态)在模态中打开 table。我需要模态是通用的,每次都会得到不同的图形组件,甚至只是常规内容。我想知道这是否是实现此功能的最佳做法。我知道不建议使用 React ref,根据 React 文档,对话框不是使用此策略的好地方。但我想不出其他选项可以让我动态传递图形组件或任何其他组件。很想听听其他选择。
这是我的模态组件:
const SiteModal = React.forwardRef((props, ref) => {
return (
<Modal {...props} size="lg" aria-labelledby="contained-modal-title-vcenter" centered ref={ref}
dialogClassName={classes.modalContainer}>
<Modal.Header closeButton>
<Modal.Title id="contained-modal-title-vcenter">
Modal heading
</Modal.Title>
</Modal.Header>
<Modal.Body>
<h4>{props.children}</h4>
</Modal.Body>
</Modal>
);
});
这是我的 parent 组件,它也是一个 ref 元素:
const CollapseEelemet = React.forwardRef((props, ref) => {
const [open, setOpen] = useState(true);
const [modalShow, setModalShow] = useState(false);
return (
<div className={classes.collapseWrapper}>
<div onClick={() => setOpen(!open)} className={classes.collapseTitle} aria-controls={props.id}
aria-expanded={open}>
{props.title}
<span onClick={() => setModalShow(true)} className="icon-launch"></span>
**<SiteModal show={modalShow} onHide={() => setModalShow(false)}>
{props.children}
</SiteModal>**
</div>
<Collapse in={true}>
<div id={props.id} ref={ref}>
{props.children}
</div>
</Collapse>
</div>
);
});
这是我的上衣parent:
const Cost = (props) => {
const renderMainGraph = () => {
const ref = React.createRef();
return (
<div className={classes.mainChartWidget}>
<CollapseEelemet ref={ref} id={constant.mainGraph.id} title={constant.mainGraph.title}>
<LineChartFusion />
<GroupColumnChart />
</CollapseEelemet >
</div>
);
};
return (
<div>{renderMainGraph ()}</div>
);
}
你没有用好ref
,React.createRef
应该只用在Class组件中。
const Cost = (props) => {
const ref = useRef();
return (
<div className={classes.mainChartWidget}>
<CollapseEelemet
ref={ref}
id={constant.mainGraph.id}
title={constant.mainGraph.title}
>
<LineChartFusion />
<GroupColumnChart />
</CollapseEelemet>
</div>
);
}
好的,所以我显然错误地使用了 Ref。我真的根本不需要使用它(FYI Ref 仅适用于 Class 组件!)。
我删除了所有 Refs 和 ForwordRef 并只是将任意子项传递给组件。
这是现在的样子:
模态组件:
const SiteModal = (props) => {
return (
<Modal {...props} size="lg" aria-labelledby="contained-modal-title-vcenter"
centered ref={ref} dialogClassName={classes.modalContainer}>
<Modal.Header closeButton>
<Modal.Title id="contained-modal-title-vcenter">
Modal heading
</Modal.Title>
</Modal.Header>
<Modal.Body>
<h4>{props.children}</h4>
</Modal.Body>
</Modal>
});
展开组件:
const CollapseEelemet = (props, ref) => {
const [open, setOpen] = useState(true);
const [modalShow, setModalShow] = useState(false);
return (
<div className={classes.collapseWrapper}>
<div onClick={() => setOpen(!open)} className={classes.collapseTitle} aria-
controls={props.id} aria-expanded={open}>
{props.title}
<span onClick={() => setModalShow(true)} className="icon-launch"></span>
**<SiteModal show={modalShow} onHide={() => setModalShow(false)}>
{props.children}
</SiteModal>**
</div>
<Collapse in={true}>
<div id={props.id}>
{props.children}
</div>
</Collapse>
</div>
});
顶级父组件:
const Cost = (props) => {
const renderMainGraph = () => {
return (
<div className={classes.mainChartWidget}>
<CollapseEelemet id={constant.mainGraph.id} title
{constant.mainGraph.title}>
<LineChartFusion />
<GroupColumnChart />
</CollapseEelemet >
</div>
);
};
return (
<div>{renderMainGraph ()}</div>
);
}
我正在使用 react-table 库,当用户单击展开图标时,我希望它使用(react-bootstrap 模态)在模态中打开 table。我需要模态是通用的,每次都会得到不同的图形组件,甚至只是常规内容。我想知道这是否是实现此功能的最佳做法。我知道不建议使用 React ref,根据 React 文档,对话框不是使用此策略的好地方。但我想不出其他选项可以让我动态传递图形组件或任何其他组件。很想听听其他选择。
这是我的模态组件:
const SiteModal = React.forwardRef((props, ref) => {
return (
<Modal {...props} size="lg" aria-labelledby="contained-modal-title-vcenter" centered ref={ref}
dialogClassName={classes.modalContainer}>
<Modal.Header closeButton>
<Modal.Title id="contained-modal-title-vcenter">
Modal heading
</Modal.Title>
</Modal.Header>
<Modal.Body>
<h4>{props.children}</h4>
</Modal.Body>
</Modal>
);
});
这是我的 parent 组件,它也是一个 ref 元素:
const CollapseEelemet = React.forwardRef((props, ref) => {
const [open, setOpen] = useState(true);
const [modalShow, setModalShow] = useState(false);
return (
<div className={classes.collapseWrapper}>
<div onClick={() => setOpen(!open)} className={classes.collapseTitle} aria-controls={props.id}
aria-expanded={open}>
{props.title}
<span onClick={() => setModalShow(true)} className="icon-launch"></span>
**<SiteModal show={modalShow} onHide={() => setModalShow(false)}>
{props.children}
</SiteModal>**
</div>
<Collapse in={true}>
<div id={props.id} ref={ref}>
{props.children}
</div>
</Collapse>
</div>
);
});
这是我的上衣parent:
const Cost = (props) => {
const renderMainGraph = () => {
const ref = React.createRef();
return (
<div className={classes.mainChartWidget}>
<CollapseEelemet ref={ref} id={constant.mainGraph.id} title={constant.mainGraph.title}>
<LineChartFusion />
<GroupColumnChart />
</CollapseEelemet >
</div>
);
};
return (
<div>{renderMainGraph ()}</div>
);
}
你没有用好ref
,React.createRef
应该只用在Class组件中。
const Cost = (props) => {
const ref = useRef();
return (
<div className={classes.mainChartWidget}>
<CollapseEelemet
ref={ref}
id={constant.mainGraph.id}
title={constant.mainGraph.title}
>
<LineChartFusion />
<GroupColumnChart />
</CollapseEelemet>
</div>
);
}
好的,所以我显然错误地使用了 Ref。我真的根本不需要使用它(FYI Ref 仅适用于 Class 组件!)。 我删除了所有 Refs 和 ForwordRef 并只是将任意子项传递给组件。
这是现在的样子:
模态组件:
const SiteModal = (props) => {
return (
<Modal {...props} size="lg" aria-labelledby="contained-modal-title-vcenter"
centered ref={ref} dialogClassName={classes.modalContainer}>
<Modal.Header closeButton>
<Modal.Title id="contained-modal-title-vcenter">
Modal heading
</Modal.Title>
</Modal.Header>
<Modal.Body>
<h4>{props.children}</h4>
</Modal.Body>
</Modal>
});
展开组件:
const CollapseEelemet = (props, ref) => {
const [open, setOpen] = useState(true);
const [modalShow, setModalShow] = useState(false);
return (
<div className={classes.collapseWrapper}>
<div onClick={() => setOpen(!open)} className={classes.collapseTitle} aria-
controls={props.id} aria-expanded={open}>
{props.title}
<span onClick={() => setModalShow(true)} className="icon-launch"></span>
**<SiteModal show={modalShow} onHide={() => setModalShow(false)}>
{props.children}
</SiteModal>**
</div>
<Collapse in={true}>
<div id={props.id}>
{props.children}
</div>
</Collapse>
</div>
});
顶级父组件:
const Cost = (props) => {
const renderMainGraph = () => {
return (
<div className={classes.mainChartWidget}>
<CollapseEelemet id={constant.mainGraph.id} title
{constant.mainGraph.title}>
<LineChartFusion />
<GroupColumnChart />
</CollapseEelemet >
</div>
);
};
return (
<div>{renderMainGraph ()}</div>
);
}