Определение компонентов высшего порядка
HoC — это не API React, это шаблон реализации, по сути, функция, которая принимает один или несколько компонентов React в качестве параметров и возвращает совершенно новый компонент React вместо преобразования существующего.Такой компонент вызывается для компонентов более высокого порядка. В процессе разработки, когда некоторые функции необходимо повторно использовать в нескольких классах компонентов, в это время можно создать Hoc.
Основное использование
- способ упаковки
const HoC = (WrappendComponent) => {
const WrappingComponent = (props) => (
<div className="container">
<WrappendComponent {...props} />
</div>
);
return WrappingComponent;
};
В приведенном выше коде WrappendComponent принимается в качестве параметра.Этот параметр является обычным компонентом, который будет обернут HoC.Оберните div в рендере и дайте емуclassName
свойства, результирующий WrappingComponent и входящий WrappendComponent — это два совершенно разных компонента.
В WrappingComponent вы можете читать, добавлять, редактировать, удалять переданные в WrappendComponentprops
, вы также можете обернуть WrappendComponent другими элементами, чтобы реализовать стили обтекания, добавить макет или другие операции.
- комбинация
const HoC = (WrappedComponent, LoginView) => {
const WrappingComponent = () => {
const {user} = this.props;
if (user) {
return <WrappedComponent {...this.props} />
} else {
return <LoginView {...this.props} />
}
};
return WrappingComponent;
};
В приведенном выше коде есть два компонента, WrappedComponent и LoginView, если входящийprops
существуют вuser
, компонент WrappedComponent отображается нормально, в противном случае отображается компонент LoginView, позволяющий пользователю войти в систему. Параметров, передаваемых HoC, может быть несколько, и несколько компонентов передаются для настройки поведения нового компонента, например, главная страница отображается, когда пользователь вошел в систему, а интерфейс входа отображается, когда пользователь не вошел в систему. in; при отображении списка компоненты List и Loading передаются и добавляются к новому компоненту.
- Наследование
const HoC = (WrappendComponent) => {
class WrappingComponent extends WrappendComponent {
render() (
const {user, ...otherProps} = this.props;
this.props = otherProps;
return super.render();
}
}
return WrappingComponent;
};
WrappingComponent — это новый компонент, который наследуется от WrappendComponent и разделяет функции и свойства родителя. Вы можете использовать super.render() или super.componentWillUpdate() для вызова родительской функции жизненного цикла, но это соединит два компонента вместе и уменьшит возможность повторного использования компонентов.
Инкапсуляция компонентов в React инкапсулируется в соответствии с идеей наименьшей доступной единицы В идеале компонент делает только одну вещь, которая соответствуетOOP
Принцип единой ответственности в . Если функцию компонента необходимо улучшить, компонент должен быть улучшен путем объединения или добавления кода, а не изменения исходного кода.
Меры предосторожности
- Не используйте компоненты более высокого порядка в функциях рендеринга
render() {
// 每一次render函数调用都会创建一个新的EnhancedComponent实例
// EnhancedComponent1 !== EnhancedComponent2
const EnhancedComponent = enhance(MyComponent);
// 每一次都会使子对象树完全被卸载或移除
return <EnhancedComponent />;
}
в реакцииdiff
Алгоритм сравнивает старое и новое деревья подобъектов и определяет, следует ли обновить существующее дерево подобъектов или удалить существующее поддерево и перемонтировать его.
- Вы должны сделать копию статического метода
// 定义静态方法
WrappedComponent.staticMethod = function() {/*...*/}
// 使用高阶组件
const EnhancedComponent = enhance(WrappedComponent);
// 增强型组件没有静态方法
typeof EnhancedComponent.staticMethod === 'undefined' // true
- Свойство Refs не может быть передано
указано в ГКref
, и не будет передан дочернему компоненту, его нужно использовать через функцию обратного вызоваprops
передача.
Ссылка на ссылку
Обратите внимание на публичный аккаунт WeChat: KnownsecFED, получайте больше качественной галантереи по коду!