javascript - 错误:重新渲染过多。React 限制了渲染的数量以防止无限循环。如何防止此错误?
问题描述
这是我的代码。我想在列表顶部添加一个新的费用项目。我希望就如何在列表顶部创建新费用获得一些帮助。我不断收到同样的错误:重新渲染太多。React 限制了渲染的数量以防止无限循环。我怎样才能解决这个问题?
import React, { useState } from "react";
import { Text, View, ScrollView } from "react-native";
import NewExpense from "../NewExpense";
import {
selectTitle,
selectPrice,
selectCategory,
} from "../../slices/dataSlice";
import { useSelector } from "react-redux";
const RenderedExpense = () => {
const title = useSelector(selectTitle);
const price = useSelector(selectPrice);
const category = useSelector(selectCategory);
const enteredData = {
id: Math.random().toString(),
title: title.disTitle,
price: price.disPrice,
category: category.disCategory,
};
const expense = enteredData;
const [expenseItems, setExpenseItems] = useState([]);
setExpenseItems([expense, ...expenseItems]);
return (
<View>
{
(title.disTitle,
price.disPrice,
category.disCategory ? <NewExpense /> : null)
}
{
expenseItems.map(() => {
<NewExpense key={enteredData.id} /> })
}
</View>
);
};
解决方案
您在您的setExpenseItems
内部直接调用您的组件,这将导致您的组件无限重新渲染,因为每当设置状态时,组件都会重新渲染。所以,它只会继续设置状态并重新渲染。
如果你想在组件加载后立即设置状态,你应该使用useEffect
钩子。
像这样:
import React, { useState, useEffect } from "react";
...
const title = useSelector(selectTitle);
const price = useSelector(selectPrice);
const category = useSelector(selectCategory);
const enteredData = {
id: Math.random().toString(),
title: title.disTitle,
price: price.disPrice,
category: category.disCategory,
};
const expense = enteredData;
const [expenseItems, setExpenseItems] = useState([]);
useEffect(()=>{
setExpenseItems([expense, ...expenseItems]);
},[])
...
注意我是如何调用setExpenseItems
inside 的useEffect
。它setExpenseItems
只会在组件第一次渲染时调用。useEffect 还接受依赖项列表,这将确定函数中指定的内容是否会运行。但是我传递了一个空数组作为我的依赖项。
请参阅此处,了解更多信息。
推荐阅读
- flutter - 如何使用 Flutter 消费 graphql 订阅?
- algorithm - 在 M×N 大小的网格上随机生成一个自回避多边形
- reactjs - 使用变量作为键时,如何使用扩展运算符设置状态?
- operating-system - 操作系统有哪些新的技术发展?
- html - 我正在尝试使用 python 烧瓶更新用户的详细信息,但提示“peewee.IntegrityError:重复键值违反唯一约束”
- python - 如何在 Python 3 中安装 textract?
- java - 使用普通 JAVA Stream 收集 int 数组的值
- android - 如何显示从我的位置到保存的纬度和经度的方向
- javascript - 如何在 Google Chrome 中修复我的网站的 pdf.js 渲染错误
- cassandra - Cassandra 集群:它如何解决单个时间戳更新?