【问题标题】:Fowarded ref is null转发的参考为空
【发布时间】:2020-06-23 18:37:30
【问题描述】:

我来自这个帖子:How to use React.forwardRef in a class based component? 我也非常仔细地浏览了文档,但我的 ref 转发似乎根本不起作用。

要创建引用的组件:

class TextEditor extends Component {
    constructor(props: Props) {
        this.editor = createRef();
    }

    render() {
        console.log(this.editor) // -> This is always empty
        return (
            <BaseEditor ref={this.editor}/>
        );
    }
}

接收 ref 的组件:

class BaseEditor extends Component<Props> {

    render() {
        return (
            <Editor ref={this.props.innerRef}/>
        );
    }
}

const BaseEditorForwardRef = React.forwardRef((props: any, ref: any) => (
    <BaseEditor {...props} innerRef={ref} />
));

export default connect(mapStateToProps, mapDispatchToProps)(BaseEditorForwardRef)

我觉得一切都在它应该的地方。然而,如果我在不使用React.forwardRef 的情况下转发引用,则引用在TextEditor 中不存在,一切正常。

有人知道我做错了吗?

【问题讨论】:

    标签: reactjs


    【解决方案1】:

    connect 将使用自己的ref 创建一个全新的组件。然而,React Redux 实际上为connect 提供了一个forwardRef 选项,它应该允许转发引用。

    如果 {forwardRef : true} 已传递给连接,则向连接的包装组件添加 ref 将实际返回被包装组件的实例。

    https://react-redux.js.org/api/connect#forwardref-boolean

    【讨论】:

      【解决方案2】:

      您需要将 ref 传递给已经连接 redux 的组件(我没有尝试使用 redux,但是使用另一个 HOC,我希望它对您有用):

      class BaseEditor extends Component<Props> {
      
          render() {
              return (
                  <Editor ref={this.props.innerRef}/>
              );
          }
      }
      
      const Connected = connect(mapStateToProps, mapDispatchToProps)(BaseEditor)
      
      
      const BaseEditorForwardRef = React.forwardRef((props: any, ref: any) => (
          <Connected {...props} innerRef={ref} />
      ));
      
      export default BaseEditorForwardRef
      

      【讨论】:

      • 太棒了,这行得通。我不完全确定为什么。另一个 HOC 应该将所有其他道具传递为{ ...props },包括参考。嗯...
      • 我也不知道为什么,但请记住 refs 不是道具。我很高兴它有效。
      • :-) 是的,裁判不是道具——真的。但是在转发它们时,你将它们固定到一个道具上(在我的例子中是 innerRef)。 InnerRef 应该作为{ ... props} 的一部分从connect 内传递给它的子代......但是,它有效 - 所以没有问题。
      • connect 将创建一个具有自己的ref 的全新组件。然而,React Redux 实际上为connect 提供了一个forwardRef 选项。我认为这也可以。 react-redux.js.org/api/connect#forwardref-boolean
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-10
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      • 2020-12-28
      相关资源
      最近更新 更多