Компонент высшего порядка - это функция, которая принимает компонент и возвращает новый компонент.
Позволяет разбить ваш код, чтобы понять, какие две функции, реквизиты и потомки
const Name = (props) => <span>{props.children}</span>
Name
теперь просто функциональный компонент, поэтому при вызове его как
<Name>Stack OverFlow<Name/>
будет отображаться <span>Stack OverFlow</span>
для домена.
Теперь давайте посмотрим на обратный ход ho c,
const reverse = (PassedComponent) =>
({ children, ...props }) =>
<PassedComponent {...props}>
{children.split("").reverse().join("")}
</PassedComponent>
- это просто функция, возвращающая другую функцию. Старый добрый способ написать это
var reverse = function reverse(PassedComponent) {
return function (props) {
var children = props.children,
propsWithoutChildren = _objectWithoutProperties(props, ["children"]); //some function to remove children from props
return (
<PassedComponent {...propsWithoutChildren}>
{children.split("").reverse().join("")}
</PassedComponent>
)
};
};
Теперь, когда вы вызываете const reversedName = reverse(name)
, обратное имя будет новым компонентом, который является функцией, возвращаемой из HO C, что эквивалентно
const ReversedName = ({ children, ...props }) =>
<Name {...props}> //the component you passed is used here
{children.split("").reverse().join("")}
</Name>
Передача {...props}
позволяет передавать любые дополнительные реквизиты компоненту имени. Например, если вы используете обратное имя, подобное этому,
<ReversedName className='class-for-name-component'>name</ReversedName>
реквизит className
будет передан компоненту имени. Вся идея заключается в том, чтобы включить возможность многократного использования, поскольку здесь вы визуализируете одно и то же имя компонента для отображения имени как в прямом, так и в обратном формате. Надеюсь, это поможет.