React - 发送 ref 作为道具不起作用

React - sending down ref as a prop not working

我正在使用 react-mui library in my project where I would like to implement a MenuList component, found under MenuList composition here. In my application though I am sending a ref as prop down to a child component where I have a menu. You can see the codesandbox example here。 当我从这样的父组件发送 refsetRef 方法作为 props 时:

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

到具有菜单按钮的子组件:

    <MenuButton
      className={classes.button}
      handleToggle={handleToggle}
      setRef={setRef}
      open={open}
      ref={ref}
   />

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

,您可以在 codesanbox 示例中看到这一点
      <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>

我做错了什么以及如何解决这个问题,或者我如何在 stateless 组件中使用 ref 以避免将 ref 作为 [=15] 发送=]?

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

来自react documentation.

React supports a special attribute that you can attach to any component.

Working example 在两个组件中 ref 重命名为 parentRef。

编辑:

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

Working example

Ref 不能像 React 中的 prop 一样传递。在构建组件时,通常会将引用分配给实例 属性,以便在整个组件中引用它们。此外,当将 ref 传递给渲染中的元素时,可以在 ref.

的当前属性处访问对节点的引用

React 提供了方法React.forwardRef 来在组件层次结构中传递引用。对于应用程序中的大多数组件来说,这通常不是必需的。但是,它对某些类型的组件很有用,尤其是在可重用组件库中。 Read about 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>;