reactjs - react 警告 : Function components cannot be given refs

标签 reactjs material-ui

我有一个组件,它呈现带有图标和文本的 Material UI MenuItem:

export default class ProjectMenuItem extends Component {
  render() {
    return (
      <MenuItem onClick={this.props.onClick}>
        <ListItemIcon>{this.props.iconComponent}</ListItemIcon>
        <ListItemText primary={this.props.text} />
      </MenuItem>
    );
  }
}
这工作正常。
我正在努力理解的是为什么我会收到 警告:不能为函数组件提供引用。尝试访问此引用将失败。 如果我将此组件更改为功能组件:
export const ProjectMenuItem = ({ onClick, iconComponent, text }) => {
  return (
    <MenuItem onClick={onClick}>
      <ListItemIcon>{iconComponent}</ListItemIcon>
      <ListItemText primary={text} />
    </MenuItem>
  );
};
父组件:
      <StyledMenu
        id='customized-menu'
        anchorEl={anchorEl}
        keepMounted
        open={Boolean(anchorEl)}
        onClose={handleClose}>
        {projectMenuItens.map((menuItem, i) => (
          <ProjectMenuItem
            key={i}
            onClick={menuItem.onClick}
            text={menuItem.text}
            iconComponent={menuItem.iconComponent}
          />
        ))}
      </StyledMenu>
完整的警告是:

Warning: Function components cannot be given refs. Attempts to access this ref will fail. Did you mean to use React.forwardRef()? Check the render method of ForwardRef(Menu).

最佳答案

StyledMenu组件尝试为您的 ProjectMenuItem 分配一个引用成分。 Refs 不能用于函数组件,因为它们没有实例。您只能在类组件或 DOM 元素上使用它们。
如果你想要 ProjectMenuItem要成为功能组件,请使用 react 的 React.forwardRef公用事业:

export const ProjectMenuItem = React.forwardRef(({onClick, iconComponent, text}, ref) => (
    <MenuItem onClick={onClick} ref={ref}>
      <ListItemIcon>{iconComponent}</ListItemIcon>
      <ListItemText primary={text} />
    </MenuItem>
));
您可以在 the official react docs 中阅读有关引用的更多信息.

关于reactjs - react 警告 : Function components cannot be given refs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62645556/

相关文章:

reactjs - 在 redux 状态的语言环境更新后重新渲染 React 组件

javascript - React - 在表单上提交获取 POST 参数

javascript - 如何根据数据有条件地更改 react 表访问器值?

reactjs - 如何使用 React Material UI 将不同的颜色传递给组件

reactjs - 我如何禁用或删除警报组件

reactjs - 在 TextField 类型 ="number"上设置最小值/最大值?

reactjs - 如何重置 React 输入的默认值

javascript - 在react-router的普通对象中转换多个配置路由

reactjs - 在 React 构建中减少 Lighthouse "First Meaningful Paint"

reactjs - 如何使用 MaterialTable 屏蔽密码