gpt4 book ai didi

reactjs - 如何为 React 元素创建唯一的键?

转载 作者:行者123 更新时间:2023-12-03 12:55:57 27 4
gpt4 key购买 nike

我正在制作一个 React 应用程序,允许您创建列表并保存它,但 React 一直向我发出警告,称我的元素没有唯一的 key prop(元素 List/ListForm)。我应该如何为用户创建的元素创建一个独特的关键 Prop ?下面是我的 React 代码

var TitleForm = React.createClass({
handleSubmit: function(e) {
e.preventDefault();
var listName = {'name':this.refs.listName.value};
this.props.handleCreate(listName);
this.refs.listName.value = "";
},
render: function() {
return (
<div>
<form onSubmit={this.handleSubmit}>
<input className='form-control list-input' type='text' ref='listName' placeholder="List Name"/>
<br/>
<button className="btn btn-primary" type="submit">Create</button>
</form>
</div>
);
}
});

var ListForm = React.createClass({
getInitialState: function() {
return {items:[{'name':'item1'}],itemCount:1};
},
handleSubmit: function(e) {
e.preventDefault();
var list = {'name': this.props.name, 'data':[]};
var items = this.state.items;
for (var i = 1; i < items.length; i++) {
list.data.push(this.refs[items[i].name]);
}
this.props.update(list);
$('#'+this.props.name).remove();
},
handleClick: function() {
this.setState({
items: this.state.items.concat({'name':'item'+this.state.itemCount+1}),
itemCount: this.state.itemCount+1
});
},
handleDelete: function() {
this.setState({
itemCount: this.state.itemCount-1
});
},
render: function() {
var listItems = this.state.items.map(function(item) {
return (
<div>
<input type="text" className="list-form" placeholder="List Item" ref={item.name}/>
<br/>
</div>
);
});
return (
<div>
<form onSubmit={this.handleSubmit} className="well list-form-container">
{listItems}
<br/>
<div onClick={this.handleClick} className="btn btn-primary list-button">Add</div>
<div onClick={this.handleDelete} className="btn btn-primary list-button">Delete</div>
<button type="submit" className="btn btn-primary list-button">Save</button>
</form>
</div>
)
}
});


var List = React.createClass({
getInitialState: function() {
return {lists:[], savedLists: []};
},
handleCreate: function(listName) {
this.setState({
lists: this.state.lists.concat(listName)
});
},
updateSaved: function(list) {
this.setState({
savedLists: this.state.savedLists.concat(list)
});
},
render: function() {
var lst = this;
var lists = this.state.lists.map(function(list) {
return(
<div>
<div key={list.name} id={list.name}>
<h2 key={"header"+list.name}>{list.name}</h2>
<ListForm update={lst.updateSaved} name={list.name}/>
</div>
</div>
)
});
var savedLists = this.state.savedLists.map(function(list) {
var list_data = list.data;
list_data.map(function(data) {
return (
<li>{data}</li>
)
});
return(
<div>
<h2>{list.name}</h2>
<ul>
{list_data}
</ul>
</div>
)
});
var save_msg;
if(savedLists.length == 0){
save_msg = 'No Saved Lists';
}else{
save_msg = 'Saved Lists';
}
return (
<div>
<TitleForm handleCreate={this.handleCreate} />
{lists}
<h2>{save_msg}</h2>
{savedLists}
</div>
)
}
});

ReactDOM.render(<List/>,document.getElementById('app'));

我的 HTML:

<div class="container">
<h1>Title</h1>
<div id="app" class="center"></div>
</div>

最佳答案

您可以通过多种方式创建 unique keys ,最简单的方法是在迭代数组时使用索引。

示例

    var lists = this.state.lists.map(function(list, index) {
return(
<div key={index}>
<div key={list.name} id={list.name}>
<h2 key={"header"+list.name}>{list.name}</h2>
<ListForm update={lst.updateSaved} name={list.name}/>
</div>
</div>
)
});

无论您在何处循环数据,这里 this.state.lists.map ,可以传递第二个参数function(list, index) 也到回调,这将是它的 index值并且对于数组中的所有项目来说都是唯一的。

然后你就可以像这样使用它

<div key={index}>

您也可以在这里执行相同的操作

    var savedLists = this.state.savedLists.map(function(list, index) {
var list_data = list.data;
list_data.map(function(data, index) {
return (
<li key={index}>{data}</li>
)
});
return(
<div key={index}>
<h2>{list.name}</h2>
<ul>
{list_data}
</ul>
</div>
)
});

编辑

但是,正如用户 Martin Dawson 在下面的评论中指出的那样,这并不总是理想的。

那么解决办法是什么呢?

很多

  • 您可以创建一个函数来生成唯一的键/ID/数字/字符串并使用它
  • 您可以利用现有的 npm 软件包,例如 uuid , uniqid等等
  • 您还可以生成随机数,例如 new Date().getTime();并使用您正在迭代的项目中的某些内容作为前缀,以保证其唯一性
  • 最后,我建议您使用从数据库中获得的唯一 ID(如果您获得了的话)。

示例:

const generateKey = (pre) => {
return `${ pre }_${ new Date().getTime() }`;
}

const savedLists = this.state.savedLists.map( list => {
const list_data = list.data.map( data => <li key={ generateKey(data) }>{ data }</li> );
return(
<div key={ generateKey(list.name) }>
<h2>{ list.name }</h2>
<ul>
{ list_data }
</ul>
</div>
)
});

关于reactjs - 如何为 React 元素创建唯一的键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39549424/

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