Passing React context through HOC for wrapped component

Is there a way you can pass context through a higher-order component to the React component that it wraps?

I have a HOC that receives a context from its parent and uses this context to perform a basic, generic action, and then wraps a child component that also needs to access the same context to perform actions. Examples:

HOC:

export default function withACoolThing(WrappedComponent) {
  return class DoACoolThing extends Component {
    static contextTypes = {
      actions: PropTypes.object,
    }

    @autobind
    doAThing() {
      this.context.actions.doTheThing();
    }

    render() {
      const newProps = {
        doAThing: this.doAThing,
      };

      return (
        <WrappedComponent {...this.props} {...newProps} {...this.context} />
      );
    }
  }
};

Wrapped Component:

import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { autobind } from 'core-decorators';
import withACoolThing from 'lib/hocs/withACoolThing';


const propTypes = {
  doAThing: PropTypes.func,
};

const contextTypes = {
  actions: PropTypes.object,
};

@withACoolThing
export default class SomeComponent extends PureComponent {

  @autobind
  doSomethingSpecificToThisComponent(someData) {
    this.context.actions.doSomethingSpecificToThisComponent();
  }

  render() {
    const { actions } = this.context;

    return (
      <div styleName="SomeComponent">
        <SomeOtherThing onClick={() => this.doSomethingSpecificToThisComponent(someData)}>Do a Specific Thing</SomeOtherThing>
        <SomeOtherThing onClick={() => this.props.doAThing()}>Do a General Thing</SomeOtherThing>
      </div>
    );
  }
}

SomeComponent.propTypes = propTypes;
SomeComponent.contextTypes = contextTypes;

Transfer {...this.context}to HOC does not work. this.contextis empty {}while the wrapped component is wrapped in HOC. Please help? Is there a way to convey a context that does not involve passing it as a property?

+6
source share
1

:

contextTypes , .

:

WrappedComponent.contextTypes HOC.

:

contextTypes SomeComponent . SomeComponent @withACoolThing, , SomeComponent, DoACoolThing, contextTypes SomeComponent , {}.

:

this.context HOC :

<WrappedComponent {...this.props} {...newProps} {...this.context} />

, this.props.actions.doTheThing.

+5

Source: https://habr.com/ru/post/1684430/


All Articles