javascript - ComponentDidUpdate 中的无限循环
问题描述
我需要从俄语翻译成西班牙语,并在我的 React 状态下更改一些信息。为了实现它,我编写了一个名为“translateHelper”的函数,如下所示:
translateHelper() {
let type = this.state.tipo;
switch(type) { //translating
case 'Проектор':
type = 'Proyector';
break;
case 'Манифестор':
type = 'Manifestador';
break;
case 'Генератор':
type = 'Generador';
break;
case 'Манифестирующий генератор':
type = 'Generador Manifestante';
break;
case 'Рефлектор':
type = 'Reflector';
break;
}
if (this.state.sexo === 'female' && type !== 'Generador Manifestante') { //changes depending on sex
type = type + 'a'
}
else if (this.state.sexo === 'female' && type === 'Generador Manifestante') {
type = 'Generadora Manifestante'
}
this.setState({ //updating state
tipo: type
})
}
当我尝试从 ComponentDidUpdate 调用此函数时出现问题。它抛出错误说:“超过最大更新深度”。据我了解,这发生在 ComponentDidUpdate 中的无限循环之前。但是我不明白它在哪里,因为我设置了如下所示的中断条件:
componentDidUpdate(prevProps, prevState) {
if (prevState.tipo !== this.state.tipo) { //my condition
this.translateHelper();
}
}
我该如何解决?
解决方案
Indeed 是在您的componentDidUpdate
方法中引起的,当translateHelper
被调用时,它会修改state
,导致再次调用它,依此类推,因为没有停止机制。prevState.tipo !== this.state.tipo
检查没有做任何事情,你应该检查是否this.state.tipo
不在,那Spanish
是你应该只运行的时候translateHelper
。因为你一直在提供你第一次翻译的结果:
Проектор -> Proyector -> Proyectora -> Proyectoraa -> Proyectoraaa
编辑:
由于单词的数量是有限的,你可以做的是检查单词是否已经翻译,如果已经翻译,你不需要再次翻译对吗?例如:
const translatedWords = ['Proyector', 'Proyectora', ... ]
componentDidUpdate(prevProps, prevState) {
const isTranslated = translatedWords.includes(this.state.tipo);
if (!isTranslated) {
this.translateHelper();
}
}
推荐阅读
- spring - java.io.FileNotFoundException:类路径资源:AbstractCouchbaseDataConfiguration.class] 无法打开,因为它不存在
- c# - C# FlatBufferBuilder 从 Stream 创建字符串
- android - 为什么 android:colorBackground 在某些设备上不起作用?
- asp.net - ASP .NET 表单和提交
- sql-server - MS SQL - 在特定行之前/之后获取
- postgresql - MSSQL msdb.dbo.sp_start_job 的 PostgreSQL 等效项是什么?
- php - Pusher Echo 未在多个刀片文件中返回响应
- vaadin - 将 Java 集合字段绑定到 Vaadin Fusion 复选框组
- c# - Angular 使用本地 AD (Active Directory) 所以我们在 C# Web API 端获取用户
- python - 使用字符串作为 DataFrame(cursor.fetchall(),columns 的列定义