reactjs - 如何使用 useState 挂钩在 FormDataConsumer 中设置值
问题描述
我必须使用useState
hook in设置一个 const 值FormDataConsumer
。这是必要的,因为 const 的值只能在FormDataConsumer
. 此 const 值将用作另一个组件的道具。我遇到的问题是下面的错误消息。做这个的最好方式是什么?提前致谢
错误:超过最大更新深度。当组件
setState
在内部重复调用componentWillUpdate
或时会发生这种情况componentDidUpdate
。React 限制了嵌套更新的数量以防止无限循环。
//const initialized here
const [outletsList, setOutletsList] = useState([]);
//the place where the const must be set
<FormDataConsumer>
{({ formData, ...rest }) => {
//console.log(`formData: ${JSON.stringify(formData)}`)
//console.log(`rest: ${JSON.stringify(rest)}`)
let s = GetOutletsBySalesRep({
distributorkey: formData.distributorid,
salesrep: formData.salesrep,
});
**setOutletsList(s);**
}}
</FormDataConsumer>
解决方案
您得到的错误是因为 React 本身的工作方式 - 您更新了一个状态变量,该变量使组件重新渲染,并且在每次渲染时您再次设置状态......所以您最终陷入了无限循环。
要逃避它,您应该设置一个条件,在该条件下将更新状态,例如
if(outletsList.length === 0) setOutletsList(s);
或者使用引用通过useRef
钩子更新它的当前属性来保存结果,因为此操作不会触发重新渲染。
const outletsListRef = useRef();
...
outletsListRef.current = s;
虽然不确定为什么需要保存它而不是重新渲染组件。
推荐阅读
- python - How can I convert 1 ½ to 1.5
- windows - USRP X310 无法通过 1GbE 识别
- c++ - 有没有办法将 const class* 转换为非 const 类
- php - 用星号播放来电者广播流
- r - openxlsx Excel公式连续,如何为每列动态创建公式
- c# - 如何使用 C# 从 MS Project Rest api 读取纯文本?
- debian-jessie - Debian 10 上的 pdf2htmlEX 与 Drupal 一起使用
- c# - DoubleLinkedList C#删除最后两个元素
- python - 合并数据框的问题
- chart.js - ChartJs 工具提示高度选项不起作用