С реакцией вы обычно не будете наследовать от своих собственных компонентов.
Вот цитата из официальных документов по Состав против наследования :
В Facebook мы используем React в тысячах компонентов, и мы не нашли ни одного случая использования, в котором мы бы рекомендовали создавать иерархии наследования компонентов.
Реквизиты и состав дают вам всю гибкость, необходимую для настройки внешнего вида компонента.и поведение в явной и безопасной форме.Помните, что компоненты могут принимать произвольные реквизиты, включая примитивные значения, элементы React или функции.
Если вы хотите повторно использовать функциональность, не относящуюся к пользовательскому интерфейсу, между компонентами, мы предлагаем извлечь ее в отдельный модуль JavaScript.Компоненты могут импортировать его и использовать эту функцию, объект или класс, не расширяя его.
Это, как говорится, если вы все еще хотите отклониться от рекомендуемого способа и иметь базовый компонент для общего доступафункциональность, это возможно.Вы все еще на «безопасной стороне» (т.е. это, скорее всего, не вызовет слишком много путаницы или проблем), если вы (1) уменьшите функциональность своей базы до наименьшего общего знаменателя, необходимого большинству ее дочерних элементов (2), а несохраняйте любое общее состояние в базовом компоненте (3), не используйте , не используйте функции стрелок в базовом компоненте, а если вы (4), обязательно сохраняйте методы жизненного цикла и connect
в дочерних компонентах, чтобы избежать непредвиденныхповедения.
Выполнение connect
в базовом классе, как вы планируете это сделать, было бы проблематично, так как connect
возвращает вновь обернутый компонент, который действует как владелец изваш фактический BaseComponent (см. , как работает connect ).Следовательно, вы потеряете возможность доступа к вашим методам класса в ваших ChildComponents.Также, скорее всего, произойдут и другие плохие вещи, потому что вы теперь независимо внедряете и управляете состоянием и жизненными циклами на двух уровнях (дочерний и базовый).- Поэтому при использовании пользовательского BaseComponent лучше всего не помещать connect
в родительский объект, а позволить ребенку обработать соединение.
Вот также статья в блоге Дана Абрамова , которую стоит прочитать, где обсуждается вопрос наследования в реакции.Его основные опасения заключаются в том, что многоуровневые иерархии сложнее реорганизовать; конфликты имен возникнут, если родительский класс позже добавит методы с именами, которые уже используются некоторым дочерним классом, а разделение логики между дочерними и родительскими методами затруднит понимание кода.В целом он предлагает полагаться на стиль функционального программирования.
Так, каковы мои рекомендации для компонентов React?
- Вы можете использовать класс в своем JS, если не наследуетедважды и не используйте super.
- Предпочитайте писать компоненты React как чистые функции, когда это возможно.Используйте классы ES6 для компонентов, если вам нужны перехватчики состояния или жизненного цикла.
- В этом случае вы можете только напрямую расширять React.Component.Оставьте свой отзыв команде React по предложениям о функциональном состоянии.
Вообще говоря, хороши или нет иерархии в программировании ООП, является предметом споров.