Подтвердить что ты не робот

Разница между использованием HOC и обвязкой компонентов

Я только что проверил HOC в React. Они довольно крутые. Однако, не просто ли обертывание компонента достигает того же результата?

Компонент более высокого порядка

Этот простой HOC передает состояние как свойства ComposedComponent

const HOC = ComposedComponent => class extends React.Component {

    ... lifecycle, state, etc;...

    render() {
      return (<ComposedComponent {...this.state} />);
    }      

}

Компонентная упаковка

Этот компонент передает состояние как свойства дочернему компоненту

class ParentComponent extends React.Component {

    ... lifecycle, state, etc;...

    render() {
      return (
        <div>
          {React.cloneElement(this.props.children, { ...this.state })}  
        </div>
      );
    }      

}

Хотя использование немного отличается от двух, оба они кажутся одинаково повторными.

Где реальная разница между HOC и составлением компонентов через this.props.children? Существуют ли примеры, когда вы можете использовать только один или другой? Лучше использовать HOC. Это просто выбор, который у вас есть, где вы можете выбрать свой предпочтительный аромат?

4b9b3361

Ответ 1

Компоненты более высокого порядка (HOC) и компоненты контейнера различны. Они имеют разные варианты использования и решают подобные, но разные проблемы.

HOC подобны миксинам. Они используются для создания функциональных возможностей, о которых знает украшенный компонент. Это противоречит компонентам контейнера, которые обертывают дочерние элементы и позволяют детям быть немыми (или не знают о функциональности, украшенной контейнером).

Это верно при передаче реквизитов, что Контейнеры могут добавить функциональность своим детям. Но это обычно в виде реквизита, передаваемого детям. В контейнерах это также неудобно из-за ограничения, которое вы не можете просто добавить реквизиты к уже созданному элементу:

Итак, если вы хотите добавить новую опору для ребенка из this.props.children, вам нужно будет использовать cloneElement. Это не так эффективно, потому что это означает, что вам нужно воссоздать элементы.

Кроме того, HOC - это просто способ (factory) для создания Компонентов. Таким образом, это может произойти вне render.

Ответ 2

Я просто хотел добавить, что когда вам нужно динамические компоненты более высокого порядка, подход Container работает лучше.

Если вы, например, имеете 4 элемента для рендеринга, которые могли бы определять HOC, вы хотели бы создать компонент более высокого порядка внутри render, но поскольку вызов компонентов более высокого порядка внутри рендера вызывает перезапуск <HigherOrderComponent/> на каждом рендере это становится очень плохой идеей.

Это описано здесь; https://github.com/facebook/react/blob/044015760883d03f060301a15beef17909abbf71/docs/docs/higher-order-components.md#dont-use-hocs-inside-the-render-method.

Но в целом я бы пошел на HOC-подход.