如何重构包装组件实例?

时间:2017-07-19 01:48:29

标签: reactjs recompose

我正在使用lifecycle来创建更高阶的组件。我需要访问包装的组件实例。我怎么能得到它?

e.g。

export default function ajaxLoader(options) {
    return lifecycle({
        componentWillMount() {
            // how to get *wrapped* component instance here?
            // `this` refers to an instance of the lifecycle HOC, not the wrapped component
            // i.e., I want the instance of `SomeComponent`
        }
    }) // this returns a function that accepts a component *class*
}

用法,如果你想看到它:

class SomeComponent extends React.PureComponent {

    render() {
        return <span/>;
    }
}

const WrappedComponent = ajaxLoader({
    // options
})(SomeComponent);

想想如果我覆盖了HOC中的render()方法,并使用ref=...渲染了包装组件,我可以获得对包装组件的引用,但是{ {1}}我不会让我自己实施recompose方法。

  

它支持整个Component API,但render()方法除外,它默认实现(如果指定重写;将记录错误到控制台)。

1 个答案:

答案 0 :(得分:3)

如果您必须有权访问实例方法,则可以执行以下操作:

class ParentComponent extends Component {
  constructor(props) {
    super(props);
    this.childController = null;
  }

  // access child method via this.childController.instanceMethod

  render() {
    return <DecoratedChildComponent provideController={controller => this.childController = controller} />
  }
}

class ChildComponent extends Component {
  componentDidMount() {
    this.props.provideController({
      instanceMethod: this.instanceMethod,
    })
  }

  componentWillUnmount() {
    this.props.provideController(null);
  }

  instanceMethod = () => {
    console.log("I'm the instance method");
  }
}

这有点令人费解,在大多数情况下都可以避免,但是你确实需要访问一个实例方法,这样可以正常工作