我正在尝试使用mui doc中给出的现有代码(自定义钩子):
<Root>
<div {...getRootProps()}>
<Label {...getInputLabelProps()}>Tags</Label>
<InputWrapper
ref={setAnchorEl}
className={focused ? "focused" : ""}
>
{value.map((tag: string, index: number) => (
<StyledTag key={tag} label={tag} {...getTagProps({ index })} />
))}
<input {...getInputProps()} />
</InputWrapper>
</div>
{groupedOptions.length > 0 ? (
<Listbox {...getListboxProps()}>
{(groupedOptions as typeof tags).map((option, index) => (
<li key={index} {...getOptionProps({ option, index })}>
<span>{option}</span>
<CheckIcon fontSize="small" />
</li>
))}
</Listbox>
) : null}
</Root>
首先,我得到了丢失关键 prop 的警告。将key={index}
插入到<li>
中后,如下所示:<li key={index} {...getOptionProps({ option, index })}>
。点击输入搜索栏后,我收到以下新警告:
如何解决这个问题?
1条答案
按热度按时间wxclj1h51#
谢谢你的帮助,这是解决方案。
问题在于nextjs如何呈现其组件。长话短说,这是由于在自动完成组件中对从迭代创建的元素设置不正确的
key
。虽然这很乏味,但您必须明确地声明所有元素(包括所有子元素)的UNIQUE键。这个问题是我在这个Post中解决的问题的一个小小的变化。唯一的区别是,这一次迭代的元素有嵌套的元素。
比如说
虽然它没有嵌套元素,
如果您没有嵌套元素,我前面的解决方案就足够了,您只将键设置到顶部元素。就像我说的,所有元素都应该有键,所有键都应该是唯一的。所以注意到我是如何通过添加1000或2000来创建一个“伪”唯一密钥的?您应该实现一个逻辑来生成唯一键,因此仅仅使用索引是不够的,因为子元素需要一种方法来获取唯一键。
此外,您应该始终将
key={index}
放在跨页(如{...getOptionProps({ option, index })}
)之后,以便它看起来像<li {...getOptionProps({ option, index })} key={index}>
。这样,新设置的关键点将覆盖由跨页设置的关键点。1.正确放置钥匙(特别是在展开后)
1.将键放置到迭代中的所有元素(如子元素)
这里是你的问题的完整代码。关注我所做的修改和评论。复制粘贴到您的本地机器上并运行它,它的工作。如果你还有什么问题,请告诉我。