我正在尝试将基于类的组件转换为功能组件。如果在useEffect钩子中使用与componentDidMount下相同的代码,则会出现上述错误。
// Class based component
class Container extends Component {
state = {
elements: [],
counter: 1,
bgColor: "#ffffff",
botTextColor: "#000000",
botBGColor: "#aaaaaa",
userTextColor: "#000000",
userBgColor: "#aaaaaa",
};
componentDidMount = async () => {
this.setState({
bgColor: this.props.chat.currentChat.bgColor,
botTextColor: this.props.chat.currentChat.botTextColor,
botBGColor: this.props.chat.currentChat.botBGColor,
userTextColor: this.props.chat.currentChat.userTextColor,
userBgColor: this.props.chat.currentChat.userBgColor,
});
this.setState({
elements:
this.props.chat.currentChat.elements &&
this.props.chat.currentChat.elements.length > 0
? elements
: [
{
id: "0",
data: {
label: (
<WelcomeNode
id={"0"}
images={this.props.chat.media.map((e) => e.file)}
updateChoices={(choices) =>
this.updateChoices("0", choices)
}
updateMessage={(message) =>
this.updateMessage("0", message)
}
updateImage={(e) => this.updateImage(e, "0")}
addEdge={this.addEdgeCustom}
deleteEdgeChoice={(index) =>
this.deleteEdgeChoice("0", index)
}
isChoiceConnected={(index) =>
this.isChoiceConnected("0", index)
}
></WelcomeNode>
),
message: "",
choices: [],
type: "welcome",
id: "0",
},
className: "node-elements",
position: { x: 100, y: 100 },
},
],
counter: elements.length > 0 ? elements.length : 1,
});
}
}
以下是发生错误的功能组件
// Functional component
const initialState = {.....}
const Container = () => {
const [state, setState] = useState(initialState);
const { auth, chat } = useSelector((state) => ({ ...state }));
const dispatch = useDispatch();
const history = useHistory();
useEffect(() => {
setState({
...state,
bgColor: chat.currentChat.bgColor,
botTextColor: chat.currentChat.botTextColor,
botBGColor: chat.currentChat.botBGColor,
userTextColor: chat.currentChat.userTextColor,
userBgColor: chat.currentChat.userBgColor,
});
setState({
...state,
elements:
chat.currentChat.elements && chat.currentChat.elements.length > 0
? elements
: [
{
id: "0",
data: {
label: (
<WelcomeNode
id={"0"}
images={chat.media.map((e) => e.file)}
updateChoices={(choices) => updateChoices("0", choices)}
updateMessage={(message) => updateMessage("0", message)}
updateImage={(e) => updateImage(e, "0")}
addEdge={(e) => addEdgeCustom(e)}
deleteEdgeChoice={(index) =>
deleteEdgeChoice("0", index)
}
isChoiceConnected={(index) =>
isChoiceConnected("0", index)
}
></WelcomeNode>
),
message: "",
choices: [],
type: "welcome",
id: "0",
},
className: "node-elements",
position: { x: 100, y: 100 },
},
],
counter: elements.length > 0 ? elements.length : 1,
});
}, []);
}
抛出以下错误,浏览器崩溃未捕获(promise)错误:重新渲染过多。React限制渲染的数量以防止无限循环。
useEffect通常需要依赖项数组。您在useEffect钩子中使用的内容应该包含在该数组中,例如,我们有一个设置id的函数。useEffect依赖项需要数组中的id。因此,只有在id更改时才更新/运行此useEffect挂钩。
useEffect(() => {
setId(id)
}, [id])
如果只希望在第一次渲染时运行一次useEffect,可以将阵列保留为空,如下所示:
useEffect(()=>{
//http fetch request or something
}, [])
很抱歉,您的代码太复杂,无法阅读。请重新组织代码,使其更易于阅读和理解。请尝试将充电useSelector
线路连接到此线路:
const { auth, chat } = useSelector((state) => state);
这会导致多重渲染,因为useSelector
detect状态正在重新创建(使用扩展运算符),因此它将重新渲染组件。
另外,在useffect
中,当您设置状态usesetState
回调时,这不会覆盖您以前的状态更新:
setState(prev=>({...prev,newState}))
我正在做这个康威的生活游戏react项目,它工作得很好,但当我添加最后几个按钮来清除棋盘和其他一些功能时,react给了我这个错误 从代码片段来看,它向我展示了Clear()函数似乎是这里的问题所在,但我认为我没有在渲染()中设置状态来触发无限循环。这里是Clear和
已经有一些人问了这个问题,但是他们几乎都是由相同的原因引起的(例如< code > 附言:一些实用程序函数是在幕后定义的。 错误出在中。我找不到我无限地重新渲染的地方。
有很多类似的问题,尽管我在这里发布。 我收到以下错误: 未捕获的不变量冲突:超过最大更新深度。当组件在componentWillUpdate或componentDidUpdate内重复调用setState时,可能会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 请注意,我还没有在page中使用过这样的功能。 选择时出错: 已编辑:我刚刚从setState中移除了矩函数。现在它工作正常
我只想渲染一次拖动,但渲染的是无限循环。我在这个项目中使用反应Dnd方法 显示此警告:超过最大更新深度。当组件重复调用componentWillUpdate或componentDidUpdate内部的setState时,会发生这种情况。React限制嵌套更新的数量,以防止无限循环。 < code>storeData代码:
我正在用React做我的前几个实验,在这个组件中,我调用了一个外部API来获取所有NBA玩家的列表,通过作为组件道具接收的teamId过滤它们,最后呈现过滤玩家的标记。 一个需要考虑的问题是,由于我调用了API并获得了一个大列表,所以我将它保持在组件的状态,以便对该组件的新调用将使用该状态,而不是再次调用API。这不是生产代码,我没有API,所以我这样做是因为我收到了“太多请求”消息,因为我一直在
当我运行我的代码时,我收到了这个错误。 超过了最大更新深度。当组件重复调用组件WillUpdate或组件DidUpdate中的setState时,可能会发生这种情况。React限制嵌套更新的数量以防止无限循环。 这是代码。它在引用。 我按照React网站上的文章所说的方式设置了我的东西,它“来了”于这个简洁的控制台类型,这就是我产生上述代码的地方。我对React、JSX和Javascript(以及