Еще один способ думать об этом состоит в том, что компоненты высшего порядка более высокого порядка , чем их дочерние элементы (то есть они ближе root дерева узлов DOM), и что они визуализируют своих дочерних элементов с модификациями. или предоставление дополнительной информации своим детям.
1) Почему Autosizer является HO C?
Более полезно думать о нем как о компоненте, который возвращает его дети, но с дополнительной информацией. В этом случае ширина и высота, которые дочерние компоненты могут использовать для изменения самих себя.
Но технически в исходном он возвращает некоторую оболочку JSX вокруг дочерних элементов, которые вы передаете. компонент, который он «берет», является его дочерним элементом (в данном случае <List>
), а компонент, который он возвращает, является <div>
с содержимым, в которое он затем помещает ваш <List>
, предоставляя дополнительную информацию, которой он не имел бы в других отношениях. .
Так что это не так уж и отличается от connect
, который принимает компонент, а затем возвращает компоненты с добавленными дополнительными подпорками, тогда это иначе имело бы.
Но независимо от того, является ли это HO C на самом деле не так уж важно здесь. Это компонент, который ожидает функцию, которая возвращает JSX как children
. Это важный бит.
2) В анонимной функции ({высота, ширина}) => {...} высота и ширина являются свойствами передаваемого объекта. От какого объекта и откуда он взялся?
Прежде всего, все, что находится между открывающим и закрывающим тегами, это children
этого компонента. Чаще всего это JSX, чистое значение javascript между {}
символами. Это также может быть функция.
Так что в этом случае Autosizer
ожидает, что ее children
prop будет функцией. Autosizer
затем вызывает эту функцию во время рендеринга и передает объект с width
и height
в качестве аргументов.
Autosizer
может иметь такую реализацию:
function Autosizer({children}) {
return children({
width: window.outerWidth, // or some other internal logic
height: window.outerHeight, // or some other internal logic
})
}
This означает, что Autosizer
имеет некоторые внутренние логики c для получения некоторых значений, а затем передает эти значения в функцию, передаваемую как children
в качестве аргументов.
Этот шаблон называется пропеллером рендеринга. И у React есть документация об этом здесь.
Вот простой пример простого HO C, который предоставляет размер окна своим дочерним элементам через рендер проп .