react-native - 遇到两个具有相同键的孩子 - 索引不起作用
问题描述
请帮忙?这里有什么问题?我添加索引但仍有警告
{options.map((value, index ) => (
<SelectPicker.Item key={index} label={value} value={value} />
))}
解决方案
index
用作键是不好的做法。您可以选择以下任何选项来避免indexes
或Math.random()
提供键来响应或响应本机组件。
选项1
在使用列表呈现 UI 元素之前,自己为列表的前端创建静态 ID。
创建一个新数组,如下所示:
const optionsWithIds = options.map((item, index) => { ...item, id: index });
然后,像这样使用它:
{optionsWithIds.map((item, index ) => (
<SelectPicker.Item key={item.id} label={item.value} value={item.value} />
))}
选项 2
如果你的价值观是独一无二的,那应该是这样。只需将值分配为键。键应始终为字符串类型。如果 value 不是 type string
,则应使用 将其转换为 string .toString()
,但还要添加检查以查看 value 是否存在,否则尝试将 null 或 undefined 转换为 string 类型时会收到错误,应用程序将崩溃.
{options.map((value, index ) => (
<SelectPicker.Item key={value} label={value} value={value} />
))}
选项 3
创建您自己的密钥生成器函数。
let key = 0 // Make sure this variable is declared globally.
const getKey = () => {
key += 1
return key.toString()
}
export default getKey
用法:
import getKey from './getKey
{options.map((value, index ) => (
<SelectPicker.Item key={getKey()} label={value} value={value} />
))}
选项 4 仅当由于某种原因无法使用上述选项时,才使用以下选项。
将此调用的npm 模块添加nanoid
到您的项目中,并使用它而不是索引来生成唯一的随机密钥。但是,只有在您无法访问静态唯一键元素的情况下才使用 nanoid。如果您有例如:您从后端收到的 id,请始终尝试使用它。因为即使在重新渲染之后 id 也将保持静态(相同),这是首先使用键的全部意义。
用法:
import { nanoid } from 'nanoid'
// Your other code
<SelectPicker.Item key={nanoid()} label={value} value={value} />
选项 5
您还可以使用调用的这个npm 模块uuid
来实现与选项 3 相同的结果。
用法:
import { v4 as uuidv4 } from 'uuid';
{options.map((value, index ) => (
<SelectPicker.Item key={uuidv4()} label={value} value={value} />
))}
希望这可以帮助。
推荐阅读
- json - 将 JSON 数据作为外部表连接到 SQL Server
- javascript - FCM 通知适用于 Chrome,但不适用于 Firefox
- c# - ASP.NET CORE 的环境变量如何注入应用程序 (ASPNETCORE_*)?
- javascript - 在 TrustPilot 小部件中自定义 JS/CSS
- azure - 运行我的 ansible-playbook 时出现 SSL 握手错误
- javascript - 如何在每次页面加载后运行特定的 jquery 脚本?
- google-bigquery - 使用 StandardSQL 提取特定字符
- r - 只需要提取那些长度为 5 到 6 位的数字
- c# - 用于在 c# 中创建 AWS Lambda 函数的 Visual Studio 2013
- reactjs - 确保 dispatch 和 reducers 在 react dom 之前工作