React:无法在现有状态转换期间更新(例如在 `render` 内)。Render 方法应该是 props 和 state 的纯函数

IT技术 javascript reactjs react-redux react-router reactstrap
2021-05-25 08:13:01

我希望在 React 状态中有活动的 NavLink“子菜单键”,以告诉 NavLink 的 onClick() 方法检查折叠中的任何 NavLink 是否处于活动状态,如果是,请不要切换 isOpen 以进行折叠。

1. 如果 Collapse 内的 NavLink 之一处于活动状态,我想停止折叠当前的 Collapse

2.刷新站点后打开Collapse就好了(当然如果里面的一些NavLink是Active的话)

这段代码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>
        );
    }
}
2个回答

由于您的isActive功能,您会收到该错误

我不太了解你正在使用的组件NavLink,但我猜isActiveprops是 a bool,当你为isActive获取值时,你正在获取这段代码

if (match) {
    if (active !== itemIndex) {
        this.setState({
            active: itemIndex
        })
    }
 }

这会导致渲染函数内部的状态更新。

您需要找到一种方法在渲染之前计算出这些值,将setState逻辑移出该函数并在其他地方执行。通常,我会componentDidUpdate用来寻找状态/props的变化并在setState那里调用

如果您对此有任何疑问或需要澄清,请告诉我。

我不知道你想达到什么目的,但对我来说,你每次打电话时都设置相同的值来声明,isActive因为itemIndex它总是 1。

但正如上面的回答,删除setStateisActive错误就会消失