React - Почему я могу использовать методы React без вызова super? - PullRequest
0 голосов
/ 21 января 2019

Интересно, как компонент может использовать реагирующие методы, такие как render, componentDidMount и т. Д., Если вызов конструктора с super не обязателен?Не должно ли быть так, что компонент наследует методы своего родительского класса (который является React, поскольку я его расширяю) и вызывает super для их использования?Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Вопрос недостаточно конкретен относительно того, что означает , называемое супер , хотя это может означать две разные вещи.

super() относится к вызову родительского конструктора. Это необходимо только в дочернем конструкторе. Это обязательно в дочернем конструкторе после его использования, это требуется спецификацией ES6:

class Parent extends Component {
  constructor(props) {
    // if no super() is called, it's invalid ES6 class 
  }

  render() {...}
}

Но сам конструктор не является обязательным (так называемый неявный конструктор):

class Parent extends Component {
  state = {};

  // is a shortcut for:
  /*
  constructor(props) {
    super(props);
    this.state = {}
  }
  */

  render() {...};
}

super.method ссылается на свойство method в прототипе родительского класса. Его можно использовать в дочерних методах конструктора и прототипа. Его использование не является обязательным.

Дочерний класс может полностью переопределить метод без использования соответствующего super метода:

class Parent extends Component {
  render () { return 'foo'; }
}

class Child extends Parent {
  render () { return 'bar'; }
}

Или расширить его функциональность:

class AnotherChild extends Parent {
  render () { return <h1>{super.render()}</h1>; }
}
0 голосов
/ 21 января 2019

super() заполнит конструктор базового класса (в вашем случае React.Component) тем, что вы передадите.

Расширение класса унаследует свойства и методы.

Вы можете абсолютно расширить класс, не используя его конструктор. Таким образом, никогда не звонит super().

Что касается super() и реакции, если вы используете реквизит, вам нужно будет передать его базовому классу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...