当前位置: 首页 > 知识库问答 >
问题:

反应:无法在现有状态转换期间更新(例如在“呈现”中)。渲染方法应该是道具和状态的纯函数

燕刚捷
2023-03-14

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

此代码使我在现有状态转换期间(例如在“render”内)无法更新。渲染方法应该是控制台中道具和状态错误的纯函数。

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个答案

冀永寿
2023-03-14

我不知道您想要实现什么,但对我来说,您每次调用isActive时都在设置相同的值,因为itemIndex始终为1。

但是如上所述,在isActive中删除setState,错误就会消失

周和志
2023-03-14

您得到这个错误是因为您的isActive函数。

我不太了解您正在使用的组件,NavLink,但我猜isActive道具是一个bool,当您获取isActive的值时,您就得到了这段代码

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

这会导致在渲染函数中更新状态。

您需要在渲染之前找到一种方法来计算这些值,将setState逻辑移出该函数,并在其他地方执行它。通常,我将使用组件didUpdate来查找状态/道具中的更改,并在那里调用setState

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

 类似资料:
  • 你好,我是ReactJS的新手,我正在使用库react-bootstrap4-form-validation来验证我的表单。文档中有用于重置表单验证的函数。文档中有使用触发按钮onClick重置表单验证的示例,如下所示。对于一个条件,我需要重置验证,但不是在触发按钮onClick时,而是在父组件的道具更改时。由于这些需要,我还创建了一个函数(useCompare),用于比较从父组件接收的道具。 简

  • 将此添加到函数组件并报告错误:警告:无法在现有状态转换期间更新(例如在内)。渲染方法应该是道具和状态的纯粹功能。

  • 错误消息: 反应:警告setState无法在现有状态转换期间更新(例如在渲染中) 这是一个react原生应用程序,但我认为,这更多的是一个react问题。 我得到了标题中描述的错误。但我对原因感到困惑,我没有在任何父组件或子组件中设置状态。因此,我有一个孙子组件(CardLayoutResult),它呈现一个listView,每一行呈现一个新组件(Render row),该组件有一个单击事件,单击

  • 无法在现有状态转换期间更新(例如在“呈现”中)。呈现方法应该是道具和状态的纯函数。 我如何修复这种情况,使它将加载项目,并单击链接将重新呈现表单?

  • 我已经创建了以下代码,但是我经常得到以下错误(很多)。看起来应用程序进入了一个循环: 下面是我使用的代码:

  • 我正在开发一个简单的待办事项列表反应应用程序(新的React.js)。我已经将项目添加到工作列表中,但删除项目会引起一个问题。在我的父反应组件中,我有以下代码: 我的组件: 运行此代码将带来: 警告:setState(...):无法在现有状态转换期间更新 问题: 为什么的渲染在添加项时立即执行回调,即: 但是,添加以删除Callback ie。