reactjs - 即使在从字符串生成散列后也出现唯一键警告
问题描述
我尝试了多种方法,但我的想法已经用完了。我无法摆脱警告“列表中的每个孩子都应该有一个唯一的“关键”道具”。我正在显示表单验证的错误消息。
<Alert variant="danger" id="shopFormErrorsAlert" className={hasError?"visible":"invisible"}>
{Object.keys(shopFormErrors).map((objKey, index) => {
return (
<ul id={objKey}>
{shopFormErrors[objKey]['error'] && Object.keys(shopFormErrors[objKey]['errorMsg']).map((hash) => {
return (
<li id={hash}>{shopFormErrors[objKey]['errorMsg'][hash]}</li>
)
})}
</ul>
)
})}
</Alert>
我引入了哈希(基于内容创建)作为数组键来克服警告
nObj[fieldName]['errorMsg'] = []
var id
var i; // creating a unique id to over come unique 'key' warning
for (i = 0; i<errors[fieldName].length ; i++){
id = 'i' + hashCode(errors[fieldName][i]);
nObj[fieldName]['errorMsg'][id] = errors[fieldName][i]
}
nObj[fieldName]['error'] = true
nObj[fieldName]['className'] = 'inputRequired'
生成的html
<div role="alert" id="shopFormErrorsAlert" class="fade visible alert alert-danger show">
<ul id="pincode">
<li id="i-1650524308">The pincode field is required.</li>
<li id="i-557689933">The pincode must be a number.</li>
</ul>
<ul id="email">
<li id="i16726618">The email must be a valid email address.</li>
</ul>
</div>
解决方案
您必须为map()
. 在这种情况下,将key
prop 添加到ul
:
<ul id={hash} key={index}>
<li key={`${index}_li`}>...</li>
</ul>
请注意,我已在此处添加index
,但您可以使用任何唯一键(hash
如果它是唯一的,则更好)。
来自文档:
React 会改变每个孩子,而不是意识到它可以保持
<li>Duke</li>
和<li>Villanova</li>
子树完整。这种低效率可能是一个问题。为了解决这个问题,React 支持一个 key 属性。当孩子有键时,React 使用键将原始树中的孩子与后续树中的孩子进行匹配。例如,在我们上面的低效示例中添加一个键可以使树转换高效:
<ul> <li key="2015">Duke</li> <li key="2016">Villanova</li> </ul> <ul> <li key="2014">Connecticut</li> <li key="2015">Duke</li> <li key="2016">Villanova</li> </ul>
推荐阅读
- python-3.x - 如何将一维张量转换为图中的标量值?
- typescript - 为什么这个 TypeScript 详尽的开关检查不起作用?
- android - 浓缩咖啡“与所选视图不匹配”用于回收站视图
- azure-ad-b2c - 为 SaaS 多租户应用程序提供客户品牌的登录体验
- c++ - ns-3 日志记录 - 输出没有日志
- java - 如何通过spring boot批处理JdbcBatchItemWriter()将java Char插入MariaDB CHAR(1)
- linux - 如何提供“每个客户”隔离的 linux 环境(低成本/自动化/可扩展)
- angular - 如何在登录页面上禁用面包屑
- flutter - 如何将字符串用作对象或类
- rust - 如何从 image::ImageBuffer 到 actix_web::HttpResponse