警告:遇到两个具有相同键“[object Object]1”的子项

Warning: Encountered two children with the same key, `[object Object]1`

提问人:mai mohamed 提问时间:11/13/2023 更新时间:11/13/2023 访问量:38

问:

addItem 函数不起作用,它给出了该错误:

警告:遇到两个使用相同密钥的孩子。键应该是唯一的,以便组件保持其 跨更新的标识。非唯一键可能会导致子项 重复和/或省略 — 该行为不受支持,并且可能 在将来的版本中进行更改。[object Object]1

enter image description here

addItem() 位于 app.js 中

App.js:

import './App.css';
import React, {Component} from 'react';
import Items from './components/item/items'
import AddItem from './components/addItem/addItem'
import Total from './components/total/total'

class App extends Component {
  state = {
    items: [
      {id:1, product:'Pen', price:2},
      {id:2, product:'Book', price:10}
    ]
  }

  deleteItem = (id) => {
    let items = this.state.items
    let i = items.findIndex(item => item.id === id)
    items.splice(i, 1)
    this.setState({items: items})
  }

  
   addItem = () => {
  const { items } = this.state;
  const id = items.length ? items[items.length - 1] + 1 : 1;
  this.setState({ items: [...items, { id }] });
};
  
addItem2 = (item) => {
  this.state.items.length > 0 ? (
    item.id = this.state.items[this.state.items.length - 1].id + 1 
  ) : item.id = 1
  console.log(item.id)
  let items = this.state.items
  items.push(item)
  this.setState({items: items})
}

  render() {
    return (
      <div className="container">
        <h1>Product List React App</h1>
        <div className="table">
          <Items items={this.state.items} del={this.deleteItem} add={this.addItem}/>
          <AddItem add={this.addItem2}/>
          <Total items={this.state.items}/>
          
        </div>
      </div>
    )
  }
}

export default App;

项目.js:

import React from 'react';

const Items = (props) => {
    const {items, del,add} = props;
    let length = items.length
    const ListItem = length ? (
        items.map(item => {
            return(
                <div key={item.id} className="item">
                    <p  onClick={()=>add(item.id)}>+</p>
                    
                    <p>{item.product}</p>
                    <p>{item.price}</p>
                    <p className="delete" onClick={() => del(item.id)}>&times;</p>
                    
                </div>
            )
        })
    ) : (
        <div className="text">There are no items, Try to add some.</div>
    )
    return (
        <div>
            <div className="header item">
                <p>quantity</p>
                
                <p>Product</p>
                <p>Price</p>
                
                <p>Edit</p>
                
            </div>
           
            {ListItem}
        </div>
    )
}

export default Items

总.js:

import React from 'react';

const Total = (props) => {
    const {items} = props;
    let total = 0
    for (let i = 0; i < items.length; i++) {
        total += parseFloat(items[i].price)
    }
    return (
        <div>
            <p className="text">Total Price: {total}</p>
        </div>
    )
}

export default Total
JavaScript ReactJS 按钮

评论


答:

1赞 Krzysztof Krzeszewski 11/13/2023 #1

您的 addItem 函数中有一个错误。您访问的是整个对象,而不是其 id 属性。

const items = [
  {id:1, product:'Pen', price:2},
  {id:2, product:'Book', price:10}
];

// your id
const id = items.length ? items[items.length - 1] + 1 : 1;
console.log(id);
// should be 
const id2 = items.length ? items[items.length - 1].id + 1 : 1;
console.log(id2);

由于是一个对象而不是一个原始人, 当与数字连接时,它会转换为。items[items.length - 1][object Object]

像这样:

addItem = () => {
  const { items } = this.state;
  const id = items.length ? (items[items.length - 1].id + 1) : 1;
  this.setState({ items: [...items, { id }] });
};

评论

0赞 mai mohamed 11/13/2023
对不起,但它不起作用,它给了我同样的错误
0赞 Krzysztof Krzeszewski 11/13/2023
你能用你所做的更改来更新你的代码吗?它应该可以工作
0赞 mai mohamed 11/13/2023
我更新了它,但它不起作用
0赞 Krzysztof Krzeszewski 11/13/2023
我说的是你问题中的代码,如果它已更新,那么您在更新它时犯了错误,因为您仍然调用原始的 addItem 函数
0赞 mai mohamed 11/13/2023
它正在工作,但总计显示:楠