gpt4 book ai didi

javascript - react 独特的关键 Prop

转载 作者:搜寻专家 更新时间:2023-11-01 05:04:13 25 4
gpt4 key购买 nike

我知道这个问题有很多答案,但我找不到能完全解决我的问题的答案。我收到以下错误:警告:数组或迭代器中的每个子项都应该有一个唯一的“键” Prop 。检查 QuestionItem 的渲染方法。有关详细信息,请参阅 https://fb.me/react-warning-keys。

我正在为组件设置 key ,但我无法让警告消失。

主要成分:

renderData() {
return this.state.data.map((data) => {
return (
<QuestionItem key={data._id} data={data} delete={this.deleteItem} edit={this.editItem} />
)
})
}

问题项组件:

import React, { Component, PropTypes } from 'react';
import Card from 'material-ui/lib/card/card';
import CardActions from 'material-ui/lib/card/card-actions';
import CardHeader from 'material-ui/lib/card/card-header';
import CardMedia from 'material-ui/lib/card/card-media';
import CardTitle from 'material-ui/lib/card/card-title';
import FlatButton from 'material-ui/lib/flat-button';
import CardText from 'material-ui/lib/card/card-text';
import Delete from 'material-ui/lib/svg-icons/action/delete';
import ModeEdit from 'material-ui/lib/svg-icons/editor/mode-edit';
import IconButton from 'material-ui/lib/icon-button';
import Button from '../UI/Button';

class QuestionItem extends Component {

renderTags() {
return this.props.data.tag.map((tag) => {
return (
<FlatButton label={tag} />
)
})
}

renderCompany() {
return this.props.data.company.map((company) => {
return (
<FlatButton label={company} />
)
})
}

edit = () => {
this.props.edit(this.props.data);
}

delete = () => {
this.props.delete(this.props.data._id);
console.log(this.props.data._id);
}

render() {
return (
<Card style={{margin: 50}}>
<CardTitle title={this.props.data.text} />
<CardText>
{this.props.data.answer}
</CardText>
<CardActions>
{ this.renderTags() }
{ this.renderCompany() }

<IconButton onClick={this.delete} style={{float: 'right'}}>
<Delete />
</IconButton>
<IconButton onClick={this.edit} style={{float: 'right'}}>
<ModeEdit />
</IconButton>
</CardActions>
</Card>
)
}
}

export default QuestionItem;

我在这里错过了什么?

最佳答案

那么您需要注销 data._id 并验证它们都是唯一的。或者你可以这样做:

renderData() {
return this.state.data.map((data, index) => {
return (
<QuestionItem key={index} data={data} delete={this.deleteItem} edit-{this.editItem} />
);
});
}

正如另一个答案所指出的,其他对 map 的调用也需要将 key 属性设置为唯一值。

所以这些:

renderTags() {
return this.props.data.tag.map((tag) => {
return (
<FlatButton label={tag} />
)
})
}

renderCompany() {
return this.props.data.company.map((company) => {
return (
<FlatButton label={company} />
)
})
}

应该变成:

renderTags() {
return this.props.data.tag.map((tag, index) => {
return (
<FlatButton key={index} label={tag} />
);
});
}

renderCompany() {
return this.props.data.company.map((company, index) => {
return (
<FlatButton key={index} label={company} />
);
});
}

请注意,我们使用的是 index,它是数组索引。它基本上就像 SQL 中的合成标识符。如果您实际渲染的内容已经具有唯一标识符,那么最好使用它们!例如,标签的 key 属性可以只是标签——字符串本身。 key 属性支持多种类型:

react - nodes-and-elements :

键:字符串 | bool |编号 |空,

因此,如果您的标签是唯一的(我希望它们是但显然不想假设),您可以这样做:

renderTags() {
return this.props.data.tag.map((tag) => {
return (
<FlatButton key={tag} label={tag} />
);
});
}

你可能会考虑做一些像 (tag || '').toLowerCase().replace(' ', '_') 这样的事情,但是我认为 React 已经在那里做了一些操作(除了潜在的字符大小写)。所以只传递标签本身应该是好的!如果您没有运行删除它的版本(我认为 0.15 删除了它),您可以检查 DOM 以查看 data-reactid。 React 开发人员工具可能会让您使用 0.15 检查 key 。

更新

我不推荐使用数组索引作为key。它会导致细微的错误。要查看实际效果,请创建一个对象数组,使用数组索引渲染它们,然后通过删除第二个元素来改变数组(并确保 React 再次渲染)。现在索引不对应于相同的对象。我的建议是始终将键设置为唯一值。在开发过程中,最好在找到 key 之前不要设置 key ,而不是使用数组索引,因为控制台上的错误会提醒您在部署/提交更改之前修复此问题。

关于javascript - react 独特的关键 Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35782782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com