Более осторожный способ - не изменять прототип класса, а расширять его:
const useAppContext = () => WrappedComponent => {
return class extends WrappedComponent {
$context = { abc: 'abc' };
};
};
На данный момент это просто декоратор, и он не является действительным компонентом высшего порядка, поскольку он не может работать сфункциональные компоненты.
Способ, который идиоматичен для React, состоит в использовании композиции, а не наследования.Распространенным способом расширения функциональности существующего компонента в компоненте более высокого порядка является предоставление необходимых функциональных возможностей через реквизиты, поскольку реквизиты являются основным способом связи между компонентами в React:
Это может быть:
const useAppContext = () => WrappedComponent => props => {
return <WrappedComponent $context={{ abc: 'abc' }} {...props} />;
};
и
@useAppContext()
class NavigationLinkList extends Component {
render() {
console.log(this.props.$context);
...
};
};