使用重组组件作为 ref 时丢失功能

losing functions when using recompose component as ref

我有这个简单的组件

class App extends React.Component {
  a = () => null
  b = () => null
  c = () => null

  render() {
    return (<div>hey123</div>)
  }
}

这是我的第二个组件,参考了第一个组件

class BApp extends React.Component {
  setComponentRef = ref => {
    console.log('ref', ref)
    this.playerComponentRef = ref
  }
  render() {
    return (
      <div>
        <App ref={this.setComponentRef} />
      </div>)
  }  
}

在这种情况下,在 console.log 我将接收所有 App 组件的功能 (a, b, c) 但如果我在 App 组件上使用 Recompose.withState,我将不会再收到它们。看这里的例子 https://codepen.io/anon/pen/qYjpoE?editors=1111

查看swtich的工作方式

<ModifyedApp ref={this.setComponentRef} />

<App ref={this.setComponentRef} />

我在这里错过了什么?为什么使用 Recompose HOC 会删除 App class 组件内部函数?

谢谢。

HOC 将在子组件之外创建一个新组件。因此,如果您在 HOC 中包装子组件并尝试接收包装组件的引用,您将获得 HOCs ref.

这里有一个解决方法 - 只需将 ref 从父组件传递给 hoc 中的子组件 - 只需代理 ref。

您可以将函数 providerRef 传递给您的组件,然后向其提供 App 实例,例如

class BApp extends React.Component {
  setComponentRef = ref => {
    console.log('ref', ref)
    this.playerComponentRef = ref
  }
  render() {
    return (
      <div>
        <App providerRef={this.setComponentRef} />
      </div>)
  }  
}


class App extends React.Component {
  a = () => null
  b = () => null
  c = () => null
  componentDidMount() {
     this.props.providerRef(this);
  }
  render() {
    return (<div>hey123</div>)
  }
}

在 Recompose 的情况下,它是一个 HOC,因此 ref 将应用于 HOC 而不是内部组件,一些库提供了一个 withRef 钩子来使用 this.playerComponentRef.getWrappedInstance() 访问 innerComponent ref ,但是我不确定它在 recompose.

中的可用性