2016-11-26 4 views
1

Я использую React и наткнулся на что-то странное.Поведение свойства Weird class

Это не сработало, так что я должен был изменить значение componentDidMount, и она работала:

class C extends React.Component { 

    componentDidMount =() => this.animate(); // Lambda is required? 

    animate =() => ... 

} 

Кто-нибудь есть хорошее объяснение, почему это необходимо?

+0

Возможно, 'animate' внутренне использует' this', который будет отличаться при вызове через 'this.animate()', чем ссылкой на функцию 'animate'. вместо этого попробуйте: 'componentDidMount = this.animate.bind (this)' связать 'thisArg' –

+0

. Я не думаю, что это проблема, так как второй фрагмент кода отлично работал – justasking

+1

, что указывает на то, что вызов действительно является проблемой, поэтому мое предложение должно сработать. показать содержимое функции this.animate –

ответ

2

Если вы пишете

class C extends React.Component { 
    componentDidMount = this.animate; // <--- 
    animate =() => ... 
} 

Затем componentDidMount устанавливается в undefined, потому что animate не установлен в то время.

С componentDidMount =() => this.animate();this.animate(); разрешается при каждом вызове componentDidMount, поэтому для вас это работает.

Если вы пишете это таким образом:

class C extends React.Component { 
    animate =() => ... 
    componentDidMount = this.animate; // <--- 
} 

Тогда componentDidMount будет ссылаться на функцию, которую вы назначенную animate раньше.

Но если вы хотите, чтобы определить методы класса вы должны проверить ответ baao, потому что тогда вы не должны использовать назначение, но определение метода animate() {}

+0

что с этим синтаксисом? «animate» и 'componentDidMount' должны быть экземплярами этого компонента? не следует ли писать его как 'animate() {/ * ... * /}' или 'animate: function() {/ * ... * /}' и т. д.? Они выглядят как глобальные переменные –

+0

@WilliamB присваивания оцениваются на этапе строительства, так что да, они являются свойствами экземпляра. Если вы пишете 'animate() {/ * ... * /}', то это метод класса, который будет установлен в цепочку прототипов до фазы строительства, поэтому OP наверняка также может решить проблему используя 'animate() {/ * ... * /}', что действительно было бы лучшей идеей. –

+0

Являются ли методы предпочтительным способом? И причина в том, что они устанавливаются перед строительной фазой? Есть ли еще причины? – justasking

2

Вы должны определить метод анимировать как метод класса, а не как функция стрелки.

class C extends React.Component { 
    componentDidMount = this.animate; 
    animate() {} 
} 
+0

Это зависит от способа использования метода. –

+0

Использование OPs указывает, что он думает использовать метод класса, нет? @FelixKling – baao

+1

Если он не используется нигде (например, как обработчик событий внутри 'render'), тогда да. Вот что я имел в виду «зависит». –