РЕДАКТИРОВАТЬ: я решил свою проблему, и она работает для меня сейчас - также отредактировал мой код, чтобы отразить новые изменения.
Я получаю эту ошибку, и я не уверен, что является причиной этой ошибки.
Я не могу показать код, поскольку это материал компании, поэтому я постараюсь описать его:
App.js:
`class App extends React.Component {
constructor(props) {
super(props);
}
render () {
return (
<div>
<Header />
<RouteList />
<Footer />
</div>
)
}
}`
My <RouteList />
- это функция без сохранения состояния, которая возвращает все маршруты для веб-приложения.
Header.js:
class Header extends React.Component {
constructor (props) {
super(props);
this.changeHeader = this.changeHeader.bind(this);
}
changeHeader(headerType) {
this.props.actions.changeHeader(headerType)
}
GetHeader() {
// if-else statement which will return a different sub header class
const HeaderType = this.props.renderHeader.headerType
if (headerType == 'abc') {
<aHeader changeHeader={this.changeHeader} />
} [...] {
// Final else block return something
}
}
render () {
return (
<div>{this.GetHeader()}</div>
)
}
}
function mapStateToProps(state, ownProps) {
return { renderHeader: state.renderHeader};
}
function mapDispatchToProps(dispatch) {
return { actions: bindActionCreators(headerActions, dispatch) };
}
export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Header));
this.props.action.changeHeader(headerType)
- это оператор if-else, который в зависимости от значения headerType вызовет другое действие.
state.renderHeader
объявлено в моем rootReducer.
Я передаю changerHeader()
в отдельные header.js, которые не имеют состояния (то есть aHeader.js, bHeader.js ...). Если щелкнуть навигационную ссылку, она вызовет метод, а также направит страницу к другому пользовательскому интерфейсу. Вот как я встраиваю метод в navlink: onClick={changeHeader(input')}
.
rootReducer.js
const rootReducer = combineReducers({renderHeader});
export default rootReducer;
renderHeader - это renderHeaderReducer.
headerAction.js
export function changeHeader(headerType) {
if (headerType == "abc") {
return {type: type, headerType: "abc"}
} [...] {
// something default
}
}
renderHeaderReducer.js
export default function renderHeaderReducer(state = initialState, action) {
switch(action.type) {
case "abc":
return (Object.assign({}, ...state, {headerType: action.headerType}));
[...];
default:
return state;
}
}
В этот момент при нажатии на ссылку веб-браузер должен обновиться, оставив заголовок на месте, но изменив часть. Однако мой сайт заходит в бесконечный цикл, и ошибка:
Ошибка: невозможно обновить во время существующего перехода состояния (например, в рамках визуализации или конструктора другого компонента). Методы рендеринга должны быть чистой функцией реквизита и состояния; побочные эффекты конструктора - это не шаблон, но их можно переместить в componentWillMount.
Когда я делал console.log, чтобы увидеть, что происходит, он, кажется, перебирает все различные опции, которые я определил, которые будут отображать Header.js
Оказывается, основная проблема была в том, что я вызвал свой метод onClick. Бесконечный цикл, в котором произошел мой код, был результатом срабатывания функции onClick даже без нажатия.
Оригинал: onClick={this.changeHeader('abc')}
Новый: onClick={() => changeHeader('abc')}
Обратитесь к этому сообщению для объяснения.
Спасибо.