В прошлом мы, возможно, видели много статей, анализирующих HOC и реквизиты для рендеринга, но в 2020 году у нас появился новый любимый «крючок».
В этой статье будут проанализированы преимущества и недостатки трех паттернов — хуков, рендеринга и HOC.Позволим вам досконально понять эти три паттерна и расскажем, почему вы должны использовать хуки как можно чаще.
HOC
Как создать ХОК
Чтобы изучить HOC, нам нужно всего лишь запомнить следующие 2 определения:
- Создайте функцию, которая принимает компонент в качестве входных данныхКроме компонентов могут передаваться и другие параметры
- На основе этого компонента возвращается другой компонент.
код показывает, как показано ниже:
function withSubscription(WrappedComponent, selectData) {
return class extends React.Component {
constructor(props) {
super(props);
this.state = {
data: selectData(DataSource, props)
};
}
// 一些通用的逻辑处理
render() {
// ... 并使用新数据渲染被包装的组件!
return <WrappedComponent data={this.state.data} {...this.props} />;
}
};
}
Преимущества HOC
- Не влияет на состояние внутренних компонентов, уменьшая сцепление
Недостатки HOC
- Фиксированные реквизиты могут быть переопределены.
<MyComponent
x="a"
y="b"
/>
Если эти два значения совпадают со значениями компонентов более высокого порядка, то x, y будут перезаписаны значениями компонентов более высокого порядка.
// 如果 withMouse 和 withPage 使用了同样的 props, 比如 x , y.
// 则会有冲突.
export default withMouse(withPage(MyComponent));
- Он не четко определяет источник данных
withMouse(MyComponent) Он не говорит вам, какие реквизиты включены в компонент, что увеличивает время отладки и исправления кода.
render props
Функция: передать состояние в компоненте в качестве реквизита вызывающей стороне, и вызывающая сторона может динамически решать, как выполнять рендеринг.
Как создать реквизит для рендеринга
- Получить переданное извне свойство реквизита
- Передайте внутреннее состояние в качестве аргумента методу свойства props вызывающего компонента.
код показывает, как показано ниже:
class Mouse extends React.Component { constructor(props) { super(props); this.state = { x: 0, y: 0 }; }
render() { return ( <div style={{ height: '100%' }}> // 使用 render props 属性来确定要渲染的内容 {this.props.render(this.state)} </div> ); } } // 调用方式: <Mouse render={mouse => ( <p>鼠标的位置是 {mouse.x},{mouse.y}</p> )}/>
недостаток
- Доступ к данным невозможен вне оператора return
Он не позволяет использовать свои данные вне оператора return.Как и в приведенном выше примере, значения x и y нельзя использовать в хуке useEffect или где-либо еще в компоненте, доступном только в операторе return.
- вложенный
Это может легко привести к вложенному аду.Следующий код:
const MyComponent = () => {
return (
<Mouse>
{({ x, y }) => (
<Page>
{({ x: pageX, y: pageY }) => (
<Connection>
{({ api }) => {
// yikes
}}
</Connection>
)}
</Page>
)}
</Mouse>
)
};
Исходя из двух вышеперечисленных способов, оба имеют свои недостатки, тогда приходим к самому ароматному решению: крючок
hook
Давайте посмотрим на пример:
const { x, y } = useMouse(); const { x: pageX, y: pageY } = usePage();useEffect(() => {
}, [pageX, pageY]);
Как видно из приведенного выше кода, хук имеет следующие характеристики: Он устраняет недостатки вышеупомянутых свойств hoc и render.
- крючки можно переименовывать
Если параметры, предоставляемые двумя хуками, одинаковы, мы можем просто переименовать их.
- Крюк будет четко обозначать источник
Как видно из приведенного выше примера, x и y являются производными от useMouse, ниже x, y являются производными от usePage.
- хуки позволяют использовать данные вне возврата
- хуки не вложены
- Простой и легкий для понимания Сравнение hoc и render props очень интуитивно понятно и легко для понимания.
Суммировать
При выборе между хуками, реквизитами рендеринга и HOC (компонентами более высокого порядка) по возможности следует использовать хуки.
Справочная статья[1]
наконец
Обратите внимание на «Front-end Jiajia» и получите качественные статьи в первый раз.
использованная литература
[1]Справочная статья:https://dev.to/bettercodingacademy/react-hooks-vs-render-props-vs-higher-order-components-1al0