Вообщем пишу я контейнер Contact и при инициализации его, хочу, что бы он изменял цвет шапки, вызываю действие в конструкторе, вроде все работает, но в chrome devTool ошибка:
Warning: setState(...): Cannot update during an existing state transition (such as within `render` or another component's constructor). Render methods should be a pure function of props and state; constructor side-effects are an anti-pattern, but can be moved to `componentWillMount`.
(
Из сообщения, react рекомендует использовать componentWillMount.)
Проблема возникает если я перехожу по url к компоненту, тогда как если обновить страницу находясь на странице контейнера, ошибка не возникает, стейт меняется как надо.
Ошибку поборол с помощью метода
componentWillMount()
, но до этого читал на хабре следующее:
React на ES6+
. . .
Все методы жизненного цикла компонента, кроме одного могут быть определены, как можно было бы ожидать, с использованием нового синтаксиса определения классов. Конструктор класса в настоящее время выступает в роли ранее используемого метода componentWillMount:
// The ES5 way
var EmbedModal = React.createClass({
componentWillMount: function() { … },
});
// The ES6+ way
class EmbedModal extends React.Component {
constructor(props) {
super(props);
// Operations usually carried out in componentWillMount go here
}
}
. . .
и на сайте
react'a тоже не рекомендуют использовать componentWillMount:
componentWillMount() is invoked immediately before mounting occurs. It is called before render(), therefore setting state in this method will not trigger a re-rendering. Avoid introducing any side-effects or subscriptions in this method.
This is the only lifecycle hook called on server rendering. Generally, we recommend using the constructor() instead.
Я немного запутался, как в данной ситуации, вызвать действие, что бы это работало и что бы это соответствовало общим соглашениям?