Когда важно перейти props
на super()
и почему?
class MyComponent extends React.Component {
constructor(props) {
super(); // or super(props) ?
}
}
reactjs
ecmascript-6
Миша Морошко
источник
источник
Ответы:
Есть только одна причина, когда нужно перейти
props
кsuper()
:Когда вы хотите получить доступ
this.props
в конструкторе.Передача:
Не проходя:
Обратите внимание , что передача или не проходит ,
props
чтобыsuper
не имеет никакого влияния на последующие использованияthis.props
снаружиconstructor
. То естьrender
,shouldComponentUpdate
или обработчики событий всегда имеют доступ к нему.Об этом прямо говорится в ответе Софи Альперт на аналогичный вопрос.
Документация - Состояние и жизненный цикл, Добавление локального состояния в класс, пункт 2 - рекомендует:
Однако причина не указана. Мы можем предположить, что это либо из-за подклассов, либо для будущей совместимости.
(Спасибо @MattBrowne за ссылку)
источник
this.props
этоundefined
если не передаетсяsuper()
. В любом случае, это не влияет позже рендеринга или наличиеthis.props
вrender()
функции.super
, у вас есть ссылка на них в конструкторе.props
по адресуsuper()
: facebook.github.io/react/docs/… . Я не уверен, почему, так как, как вы указываете,this.props
доступен в других методах в любом случае ... возможно, они рекомендуют это для будущей совместимости в случае, если будущие версии React могут захотеть что-то сделатьprops
в конструкторе?props
кsuper
когда, как вы указали, тоprops
параметр прямо доступен для нас , чтобы использовать в конструкторе , иthis.props
работает везде? Есть ли польза от использованияthis.props
над простоprops
? Это плохая практика для деструктурироватьprops
в конструкторе? Я думаю , что я до сих пор не в состоянии увидеть случай , когда вы когда - либо необходимо пройти ,props
чтобыsuper
, но я готов поспорить , что это только мое невежество, ха.super(props)
, вы можете вызывать методы, которые используютthis.props
в конструкторе from , напримерthis.doStuffUsingThisDotProps()
, без необходимости передавать параметр props этим методам / функциям. Я просто написал конструктор, делающий это, что, по-видимому, потребовало бы, чтобы яsuper(props)
сначала использовал его , в соответствии с ответами на этот вопрос.В этом примере вы расширяете
React.Component
класс, и в соответствии со спецификацией ES2015 конструктор дочернего класса не может использовать егоthis
доsuper()
тех пор, пока он не будет вызван; Кроме того, конструкторы класса ES2015 должны вызывать,super()
если они являются подклассами.В отличие от:
Более подробно в соответствии с этим превосходным ответом переполнения стека
Вы можете увидеть примеры компонентов, созданных путем расширения
React.Component
класса, который не вызывает,super()
но вы заметите, что они не имеютconstructor
, следовательно, в этом нет необходимости.Некоторые разработчики, с которыми я общался, сталкивались с тем, что компоненты, которые не имеют
constructor
и, следовательно,super()
нигде не вызывают , все ещеthis.props
доступны вrender()
методе. Помните, что это правило и эта необходимость созданияthis
привязкиconstructor
относятся только кconstructor
.источник
super()
иsuper(props)
).Когда вы переходите
props
кsuper
, реквизит назначаетсяthis
. Взгляните на следующий сценарий:Как всегда, когда вы делаете:
источник
Согласно исходному коду
Вы должны проходить
props
каждый раз, когда у вас есть реквизиты, и вы не кладете ихthis.props
вручную.источник
super(props)
а другой нет. Но их потребители устанавливают реквизит. В чем разница?this.props = props
иsuper(props)
то же?this.props
извне - независимо от того, что делается в конструкторе.Дан Абрамов написал статью на эту тему:
Почему мы пишем супер (реквизит)?
И суть в том, что полезно иметь привычку передавать его, чтобы избежать этого сценария, что, честно говоря, я не вижу, что это вряд ли произойдет:
источник
super()
используется для вызова родительского конструктора.super(props)
будет переходитьprops
к родительскому конструктору.Из вашего примера,
super(props)
вызоветReact.Component
конструктор, передавая вprops
качестве аргумента.Дополнительная информация по адресу
super
: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/superисточник
При реализации
constructor()
функции внутри компонента React,super()
это требование. Имейте в виду, что вашMyComponent
компонент расширяет или заимствует функциональность изReact.Component
базового класса.Этот базовый класс имеет собственную
constructor()
функцию, в которой есть некоторый код для настройки нашего компонента React для нас.Когда мы определяем
constructor()
функцию внутри нашегоMyComponent
класса, мы, по сути, переопределяем или заменяемconstructor()
функцию, которая находится внутриReact.Component
класса, но нам все еще нужно убедиться, что весь установочный код внутри этойconstructor()
функции по-прежнему вызывается.Чтобы убедиться, что функция
React.Component
sconstructor()
вызывается, мы вызываемsuper(props)
.super(props)
это ссылка наconstructor()
функцию родителей , вот и все.Мы должны добавлять
super(props)
каждый раз, когда определяемconstructor()
функцию внутри компонента на основе классов.Если мы этого не сделаем, мы увидим ошибку, говорящую, что мы должны позвонить
super(props)
.Вся причина определения этой
constructor()
функции заключается в инициализации нашего объекта состояния.Итак, чтобы инициализировать наш объект состояния, под супер вызовом я собираюсь написать:
Таким образом, мы определили наш
constructor()
метод, инициализировали наш объект состояния, создав объект JavaScript, присвоив ему свойство или пару ключ / значение, присвоив результат этогоthis.state
. Теперь, конечно, это только пример, поэтому я на самом деле не назначил пару ключ / значение для объекта состояния, это просто пустой объект.источник
Вот скрипка, которую я сделал: jsfiddle.net . Это показывает, что реквизиты назначаются не в конструкторе по умолчанию. Как я понимаю, они заданы в методе
React.createElement
. Следовательно,super(props)
должен вызываться только тогда, когда конструктор суперкласса вручную указываетprops
наthis.props
. Если вы просто продлитеReact.Component
вызовsuper(props)
, вы ничего не сделаете с реквизитом. Возможно, это будет изменено в следующих версиях React.источник
Здесь мы не получим это в конструкторе, поэтому он вернет undefined, но мы сможем получить это за пределами функции конструктора
Если мы используем super (), то мы можем также извлечь переменную "this" внутри конструктора
Поэтому, когда мы используем super (); мы сможем получить это, но this.props будет неопределенным в конструкторе. Но кроме конструктора this.props не будет возвращать undefined.
Если мы используем super (props), то мы можем также использовать значение this.props внутри конструктора
Ответ Софи Альперт
источник
Для реагирующей версии 16.6.3 мы используем super ( props ) для инициализации имени элемента состояния : this.props.name
источник