React:无法在现有状态转换期间更新(例如在“渲染”中)。渲染方法应该是 props 和 state 的纯函数
React: Cannot update during an existing state transition (such as within `render`). Render methods should be a pure function of props and state
我想在 React 状态下激活 NavLink“子菜单键”,以告知 NavLink 的 onClick() 方法检查 Collapse 中是否有任何 NavLink 处于活动状态,如果是,则不要为 Collapse 切换 isOpen。
1。如果 Collapse 中的 NavLink 之一处于活动状态,我想停止折叠当前 Collapse
2。刷新站点后打开折叠会很好(当然,如果内部的某些 NavLink 处于活动状态)
此代码在控制台中出现 Cannot update during an existing state transition (such as within 'render'). Render methods should be a pure function of props and state
错误。
import React from 'react';
import { connect } from 'react-redux';
import { NavLink as Link } from 'react-router-dom';
import { Nav, NavItem, NavLink, Collapse } from 'reactstrap';
import { bindActionCreators } from 'redux';
import { actions } from './../../containers/Account/store';
import classnames from 'classnames';
class NavMenuAside extends React.Component {
constructor(props) {
super(props);
this.state = { collapsed: {} };
}
toggle(itemIndex) {
const { collapsed, active } = this.state
// Don't collapse if some NavLinks inside is active
// but allow to toggle() if is collapsed (if we refresh site)
if (active === itemIndex && collapsed[itemIndex]) {
return
}
this.setState({
collapsed: {
...collapsed,
[itemIndex]: !collapsed[itemIndex]
}
});
}
isActive = (itemIndex) => (match) => {
const { active } = this.state
if (match) {
if (active !== itemIndex) {
this.setState({
active: itemIndex
})
}
}
return !!match;
}
render() {
const { t } = this.props;
return (
<Nav className="nav--aside">
<NavItem>
<NavLink tag={Link} to="/admin/qqqq/ffff">{icon('envelope-colored', 'aside-svg')} {t('navMenu.alerts')}</NavLink>
</NavItem>
<NavItem>
<NavLink onClick={() => this.toggle(1)} className={classnames({ 'open': this.state.collapsed[1] })}>{icon('analytics', 'aside-svg')} {t('navMenu.terefere')}</NavLink>
<Collapse isOpen={this.state.collapsed[1]}>
<NavLink tag={Link} isActive={this.isActive(1)} to="/admin/wfwfwfwfwwf">{t('navMenu.terefere2')}</NavLink>
<NavLink tag={Link} isActive={this.isActive(1)} to="/admin/qdqdqd">{t('navMenu.terefere2')}</NavLink>
<NavLink tag={Link} isActive={this.isActive(1)} to="/admin/qqqqq">{t('navMenu.terefere2')}</NavLink>
<NavLink tag={Link} isActive={this.isActive(1)} to="/admin/wfwwfwf">{t('navMenu.terefere2')}</NavLink>
</Collapse>
</NavItem>
</Nav>
);
}
}
由于您的 isActive
功能,您会收到该错误。
我不太了解您正在使用的组件,NavLink
,但我猜 isActive
道具是 bool
,而您正在获取值对于 isActive
你将得到这段代码
if (match) {
if (active !== itemIndex) {
this.setState({
active: itemIndex
})
}
}
这会导致渲染函数中的状态更新。
您需要找到一种方法在渲染之前找出这些值,将 setState
逻辑移出该函数并在其他地方执行。通常,我会使用 componentDidUpdate
来查找 state/props 的变化并在那里调用 setState
。
如果您对此有任何疑问或需要澄清,请告诉我。
我不知道你想要达到什么目的,但对我来说,你每次调用 isActive
时都会设置相同的值,因为 itemIndex
总是 1。
但正如上面的回答,删除 isActive
中的 setState
错误将消失
我想在 React 状态下激活 NavLink“子菜单键”,以告知 NavLink 的 onClick() 方法检查 Collapse 中是否有任何 NavLink 处于活动状态,如果是,则不要为 Collapse 切换 isOpen。
1。如果 Collapse 中的 NavLink 之一处于活动状态,我想停止折叠当前 Collapse
2。刷新站点后打开折叠会很好(当然,如果内部的某些 NavLink 处于活动状态)
此代码在控制台中出现 Cannot update during an existing state transition (such as within 'render'). Render methods should be a pure function of props and state
错误。
import React from 'react';
import { connect } from 'react-redux';
import { NavLink as Link } from 'react-router-dom';
import { Nav, NavItem, NavLink, Collapse } from 'reactstrap';
import { bindActionCreators } from 'redux';
import { actions } from './../../containers/Account/store';
import classnames from 'classnames';
class NavMenuAside extends React.Component {
constructor(props) {
super(props);
this.state = { collapsed: {} };
}
toggle(itemIndex) {
const { collapsed, active } = this.state
// Don't collapse if some NavLinks inside is active
// but allow to toggle() if is collapsed (if we refresh site)
if (active === itemIndex && collapsed[itemIndex]) {
return
}
this.setState({
collapsed: {
...collapsed,
[itemIndex]: !collapsed[itemIndex]
}
});
}
isActive = (itemIndex) => (match) => {
const { active } = this.state
if (match) {
if (active !== itemIndex) {
this.setState({
active: itemIndex
})
}
}
return !!match;
}
render() {
const { t } = this.props;
return (
<Nav className="nav--aside">
<NavItem>
<NavLink tag={Link} to="/admin/qqqq/ffff">{icon('envelope-colored', 'aside-svg')} {t('navMenu.alerts')}</NavLink>
</NavItem>
<NavItem>
<NavLink onClick={() => this.toggle(1)} className={classnames({ 'open': this.state.collapsed[1] })}>{icon('analytics', 'aside-svg')} {t('navMenu.terefere')}</NavLink>
<Collapse isOpen={this.state.collapsed[1]}>
<NavLink tag={Link} isActive={this.isActive(1)} to="/admin/wfwfwfwfwwf">{t('navMenu.terefere2')}</NavLink>
<NavLink tag={Link} isActive={this.isActive(1)} to="/admin/qdqdqd">{t('navMenu.terefere2')}</NavLink>
<NavLink tag={Link} isActive={this.isActive(1)} to="/admin/qqqqq">{t('navMenu.terefere2')}</NavLink>
<NavLink tag={Link} isActive={this.isActive(1)} to="/admin/wfwwfwf">{t('navMenu.terefere2')}</NavLink>
</Collapse>
</NavItem>
</Nav>
);
}
}
由于您的 isActive
功能,您会收到该错误。
我不太了解您正在使用的组件,NavLink
,但我猜 isActive
道具是 bool
,而您正在获取值对于 isActive
你将得到这段代码
if (match) {
if (active !== itemIndex) {
this.setState({
active: itemIndex
})
}
}
这会导致渲染函数中的状态更新。
您需要找到一种方法在渲染之前找出这些值,将 setState
逻辑移出该函数并在其他地方执行。通常,我会使用 componentDidUpdate
来查找 state/props 的变化并在那里调用 setState
。
如果您对此有任何疑问或需要澄清,请告诉我。
我不知道你想要达到什么目的,但对我来说,你每次调用 isActive
时都会设置相同的值,因为 itemIndex
总是 1。
但正如上面的回答,删除 isActive
中的 setState
错误将消失