Компоненты высшего порядка - это функции, которые «улучшают» компоненты, передаваемые в качестве параметра. Чтобы понять, откуда берутся реквизиты, давайте посмотрим, как будет выглядеть такой компонент.
Вот наш основной компонент, который будет передан в HoC:
function TodoList(props) {
return (
<div>We have {props.todos.length} tasks to do!</div>
);
}
И теперь мы можем использовать наш HoC для создания нового «расширенного» компонента, который предотвращает отображение этого сообщения, когда нет Никаких оставленных задач:
const EnhancedTodoList = withTodosNull(TodoList);
Затем мы можем использовать этот новый компонент для рендеринга сообщения (или нет, если задач нет):
<EnhancedTodoList todos={someTodos} />
Как Вы можете видеть, EnhancedTodoList
является первым компонентом, который получает todos
. Затем он решает, следует ли передавать реквизиты в TodoList
или возвращать null
, когда нет никаких задач.
Тоды явно передаются из компонента, который представляет HoC. EnhancedTodoList
действует как фильтр для TodoList
.
Согласитесь с Ножами. Проспект depedencies является запахом дизайна. Осуществите рефакторинг его Беспощадно!
Это может быть сложно в случае, где бизнес-объекты сильно связываются. В большинстве случаев это может быть решено посредством внедрения зависимости.
Псевдо пример C++:
class Employee {
Company company;
};
class Company {
vector<Employee> employees;
};
Хитрый? Не neccesarily:
template<class CompanyT>
class Employee {
CompanyT company;
};
class Company {
vector<Employee<Company> > employees;
};
Более типы примитивов, которые должны зависеть от более высокого уровня, могут быть абстрагированы для работы с любым видом другого типа, пока он выполняет свои контракты.
Если Вашей библиотеке String действительно нужна Ваша библиотека XML, это - вероятно, признак, что Ваша библиотека String должна быть пересмотрена в определение типа данных низшего уровня и "базовые утилиты" (никакие внешние зависимости, если возможный), и другая высокоуровневая библиотека, которая может ввести XML, SQL, регулярные выражения, или независимо от того, что Вы находите полезными на прикладном уровне.
Сделайте это дополнительным методом, который определяется в xml блоке (на основе Вашего комментария "метод преобразования, который принимает XML и преобразовывает в основанный на строке формат"). Это имеет дело с xml. Точно так же, как Linq делает для IEnumerable.