React - 发送 ref 作为 prop 不起作用

Lef*_*eff 3 javascript reactjs material-ui react-ref

我在我的项目中使用了一个react-mui库,我想在其中实现一个MenuList组件,可以在此处的MenuList合成下找到。在我的应用程序中,虽然我将refas发送propchild component我有menu. 您可以在此处查看codesandbox 示例。当我从父组件发送一个方法时,如下ref所示setRefprops

state = {
    open: false,
    ref: React.createRef()
  };

  setRef = element => {
    this.setState({ ref: element });
  };

  handleToggle = () => {
    this.setState(state => ({ open: !state.open }));
  };

  handleClose = () => {
    this.setState({ open: false });
  };

  render() {
    return (
      <MenuListComposition
        setRef={this.setRef}
        handleToggle={this.handleToggle}
        handleClose={this.handleClose}
        open={this.state.open}
        ref={this.state.ref}
      />
    );
  }
Run Code Online (Sandbox Code Playgroud)

对于具有菜单按钮的子组件:

    <MenuButton
      className={classes.button}
      handleToggle={handleToggle}
      setRef={setRef}
      open={open}
      ref={ref}
   />
Run Code Online (Sandbox Code Playgroud)

然后,具有菜单列表的 Popper 组件在错误的位置打开,如果单击TOGGLE MENU GROW button.

      <Popper open={open} anchorEl={ref} transition disablePortal>
          {({ TransitionProps, placement }) => (
            <Grow
              {...TransitionProps}
              id="menu-list-grow"
              style={{
                transformOrigin:
                  placement === "bottom" ? "center top" : "center bottom"
              }}
            >
              <Paper>
                <ClickAwayListener onClickAway={handleClose}>
                  <MenuList>
                    <MenuItem onClick={handleClose}>Profile</MenuItem>
                    <MenuItem onClick={handleClose}>My account</MenuItem>
                    <MenuItem onClick={handleClose}>Logout</MenuItem>
                  </MenuList>
                </ClickAwayListener>
              </Paper>
            </Grow>
          )}
        </Popper>
Run Code Online (Sandbox Code Playgroud)

我做错了什么以及如何解决这个问题,或者如何refstateless组件中使用以避免ref作为发送prop

nub*_*nub 6

ref是reactjs中的一个关键字。当您用作refprop 时,它将组件链接到 ref 对象。将其重命名为您喜欢的FancyButton组件和MenuListComposition组件名称。

来自反应文档。

React 支持一个可以附加到任何组件的特殊属性。

在两个组件中将 ref 重命名为parentRef 的工作示例。

编辑:

正如 Vaibhav Shukla 所指出的,您可以React.forwardRef在两者上使用FancyButtonMenuListComposition这可能是正确的方法。

工作示例


Vai*_*kla 6

Ref 不能像 React 中的 prop 一样传递。引用通常在构造组件时分配给实例属性,以便可以在整个组件中引用它们。此外,当将 ref 传递给渲染中的元素时,可以通过 ref 的当前属性访问对该节点的引用。

React 提供了React.forwardRef方法来在组件层次结构中传递引用。对于应用程序中的大多数组件来说,这通常是不必要的。但是,它对于某些类型的组件很有用,特别是在可重用组件库中。了解forwardRef

    const ButtonWrapper = React.forwardRef((props, ref) => (
      <button ref={ref}>
        {props.children}
      </button>
    ));

    // You can now get a ref directly to the DOM button:
    const ref = React.createRef();
    <ButtonWrapper ref={ref}>Click me!</ButtonWrapper>;
Run Code Online (Sandbox Code Playgroud)