【问题标题】:Generic react bootstrap modal using React ref使用 React ref 的通用反应引导模式
【发布时间】:2020-10-27 07:26:54
【问题描述】:

我正在使用 react-table 库,当用户单击展开图标时,我希望它使用(react-bootstrap modal)以模式打开表格。我需要模态是通用的,并且每次都会获得不同的图形组件,甚至只是常规内容。我想知道这是否是实现此功能的最佳实践。我知道不建议使用 React ref 并且根据反应文档,对话框不是使用此策略的好地方。但我想不出其他选项可以让我动态传递图形组件或任何其他组件。很想听听其他选择。

这是我的模态组件:

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>
     );
   });

这是我的父组件,也是一个 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>
  );
});

这是我的最高父母:

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>
 );
}

【问题讨论】:

    标签: reactjs react-ref


    【解决方案1】:

    您不要使用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>
      );
    }
    

    【讨论】:

    • 你说得对,我刚刚在 React 文档中读到了它,那么我有什么选择呢?假设我不想将功能组件转换为类组件
    【解决方案2】:

    好的,所以我显然以错误的方式使用了 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>
            );
          }
    

    【讨论】:

      猜你喜欢
      • 2020-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 2017-02-18
      • 2019-11-14
      • 1970-01-01
      • 2020-05-19
      • 2022-09-23
      相关资源
      最近更新 更多