代码之家  ›  专栏  ›  技术社区  ›  OmniOwl

从父级调用子级中的函数表示“不是函数”?

  •  0
  • OmniOwl  · 技术社区  · 7 年前

    我有一个父母叫 <Home/> 在里面,我有一个孩子叫 <ProjectDialog> 这是一个GoogleMaterial对话框,我将在它运行后自定义它。

    在child中,我有以下代码:

    handleOpen = () => {
        this.setState({ open: true });
    };
    

    老实说,这很正常。但我希望能够从父级更改打开状态,我在这里尝试:

    let dialog = <ProjectDialog/>;
    
    class Home extends Component {
    
        handleCardClick = id => {
            dialog.handleOpen();
        };
    

    但是当我点击任何应该触发这个对话的元素时,我得到一个错误,handleOpen()不是一个函数。

    我还有别的办法吗?将打开状态存储在道具中并以这种方式触发是否有意义?

    1 回复  |  直到 7 年前
        1
  •  1
  •   0xc14m1z    7 年前

    事情本来就不是这样的。

    您必须以声明的方式这样做,这意味着打开/关闭信息应该保存在父级中,并通过道具传递给子级。

    class Home extends Component {
      state = {
        isDialogOpen: false
      }
    
      handleOpen = () => this.setState({ isDialogOpen: true })
    
      render() {
        return (
          ...
          <ProjectDialog isOpen={ this.state.isDialogOpen } />
          ...
          <button onClick={ this.handleDialogOpen }>
            Open project dialog
          </button>
          ...
        )
      }
    }