【问题标题】:React.js, Each child in a list should have a unique "key" prop. how to fix if key is already givenReact.js,列表中的每个孩子都应该有一个唯一的“关键”道具。如果已经给出密钥,如何解决
【发布时间】:2022-07-22 15:49:13
【问题描述】:

我收到警告 Warning: Each child in a list should have a unique "key" prop.。我对反应的理解是,当你传递给一个新组件时,你给它一个道具的 ID,我正在这样做,但我仍然收到这个警告。在我的代码中,我有一些用于设置表数据状态的虚拟数据,即

const DumData = 
    {   id: 1,
        UserGroup:[
    {
        id: "1",
        Name: "Dax Johnson",
        AddressLine: "82 Mahu road",
        Email: 'DaxIng@Gmail.co.nz',
        ContactNumber: "02791743",
        Zip: '8801',
        Notes: 'His dog is swag',
        Animals: [
                {   id: "1",
                    PatientID: "23",
                    AnimalName: 'SwagDog',
                    Species: "Canine",
                    Breed: "Dog",
                    Gender: "Male",
                    DOB: "",
                    Vists: [{
                        id:1 ,
                        time: 'October 31st 2021'
                    },
                    {
                        id:2 ,
                        time: 'October 21st 2021'
                    }]
                },
                { id: '2',
                AnimalName: 'CoolCat',
                Species: "Feline",
                Breed: "Cat",
                Gender: "Female",
                DOB: "",
                Vists: [{
                    id:1 ,
                    time: 'March 4th 2021'
                }]
                }
                ],
    },
    {
        id: "12",
        Name: "Willam McDonald",
        AddressLine: "2 Wacky Ave",
        Email: 'WILLIAM@hotmail.co.nz',
        Zip: '8661',
        ContactNumber: "033777300",
        Notes: 'His cat is cool',
        Animals: [
              { 
              id: "1",
              PatientID: "23",
              AnimalName: "Molder",
              Species: "Feline",
              Breed: "Cat",
              Gender: "Female",
              DOB: "2008",
              Vists: [{
                id:1 ,
                time: 'February 4th 2022'
            }]
            }
            ],


      },    
      {
        id: "3",
        Name: "Oscar Issac",
        AddressLine: "2 Wacky Ave",
        Email: 'Oscar@hotmail.co.nz',
        Zip: '7041',
        ContactNumber: "0279000",
        Notes: 'His cat is cool',
        Animals: [
              { 
              id: "1",
              PatientID: "23",
              AnimalName: "Cool cat",
              Species: "Feline",
              Breed: "Cat",
              Gender: "Female",
              DOB: "2008",
              Vists: [{
                id:1 ,
                time: 'June 24th 2021'
            }]
              }
              ],
      }    ]
    
    };

然后是const [tableData, settableData] = useState(DumData);

我创建了一个名为 Hometable 的组件表,我将 tableData 和 key id 传递给它

<div className='Hometable-div'>
                <Hometable
                    data={tableData}
                    key={tableData.id}
                ></Hometable>
            </div>

然后我映射数据,使其显示在 Hometable 组件的表中。像这样

function Hometable(props) {
    var OwnerName;
    var Animalname;
    var breed;

    return (
      <div className='table-container'>
          <table>
              <thead>
                  <tr>
                      <th>Owner</th>
                      <th>Animal Name</th>
                      <th>Type/Breed</th>
                      <th>Vist Time</th>
                  </tr>
              </thead>
              <tbody>
              {props.data.UserGroup.map((person) => (
                    OwnerName = person.Name,
                    person.Animals.map((Animal) => ( 
                        Animalname = Animal.AnimalName,
                        breed = Animal.Breed,
                        Animal.Vists.map((vist) => (
                            <tr>
                                <td>  <i class="bi bi-person-fill"></i> {OwnerName} </td>
                                <td> {Animalname}</td>
                                <td> {breed} </td>
                                <td> {vist.time} </td>
                            </tr>
                        )) 
                    )) 
                ))}

                <tr>
                  <td className='footer'> 
                      
                      </td>
                      <td className='footer'> 
                          
                      </td>
                      <td className='footer'>
                          
                          </td>
                      <td className='footer'>
                          <button className='TableButton'> Page 1</button>
                      </td>
                  </tr>
              </tbody>
          </table>

      </div>
    );
  }
  
  export default Hometable;

我知道我没有使用 Hometable 中的键值,所以如果有人可以帮助我解决此警告,这可能是一个简单的解决方法?

【问题讨论】:

    标签: javascript reactjs


    【解决方案1】:

    尝试在代码中传递密钥

    {props.data.UserGroup.map((person) => (
                        OwnerName = person.Name,
                        person.Animals.map((Animal) => ( 
                            Animalname = Animal.AnimalName,
                            breed = Animal.Breed,
                            Animal.Vists.map((vist, index) => (
                             // or visit.id if available
                                <tr key={index}>
                                    <td>  <i class="bi bi-person-fill"></i> {OwnerName} </td>
                                    <td> {Animalname}</td>
                                    <td> {breed} </td>
                                    <td> {vist.time} </td>
                                </tr>
                            )) 
                        )) 
                    ))}
    
    

    建议使用来自数据源的键,例如 visit.id。最后的手段应该是使用索引。更多信息可以阅读here

    【讨论】:

    • 太棒了,谢谢你!我不明白你为什么认为你可以解释?
    • 根据文档reactjs.org/docs/lists-and-keys.html#keys,它有助于识别哪些项目已更改、添加或删除,因此会发出警告。选择键的最佳方法是使用一个字符串,该字符串在其兄弟项中唯一标识一个列表项。大多数情况下,您会使用数据中的 ID 作为键。当您没有用于渲染项目的稳定 ID 时,您可以使用项目索引作为键作为最后的手段。
    • 使用索引作为键是一种反模式,阅读这篇文章robinpokorny.medium.com/…
    • @nassimmiled 没错,它是一种反模式,这就是为什么我建议首先使用 visit.id 并链接文档。
    • 更新了答案中的一些细节。
    【解决方案2】:

    尝试使用此代码:

    function Hometable(props) {
        var OwnerName;
        var Animalname;
        var breed;
    
        return (
          <div className='table-container'>
              <table>
                  <thead>
                      <tr>
                          <th>Owner</th>
                          <th>Animal Name</th>
                          <th>Type/Breed</th>
                          <th>Vist Time</th>
                      </tr>
                  </thead>
                  <tbody>
                  {props.data.UserGroup.map((person) => (
                        OwnerName = person.Name,
                        person.Animals.map((Animal) => ( 
                            Animalname = Animal.AnimalName,
                            breed = Animal.Breed,
                            Animal.Vists.map((vist,index) => (
                                <tr  key={index}  >
                                    <td>  <i class="bi bi-person-fill"></i> {OwnerName} </td>
                                    <td> {Animalname}</td>
                                    <td> {breed} </td>
                                    <td> {vist.time} </td>
                                </tr>
                            )) 
                        )) 
                    ))}
    
                    <tr>
                      <td className='footer'> 
                          
                          </td>
                          <td className='footer'> 
                              
                          </td>
                          <td className='footer'>
                              
                              </td>
                          <td className='footer'>
                              <button className='TableButton'> Page 1</button>
                          </td>
                      </tr>
                  </tbody>
              </table>
    
          </div>
        );
      }
      
      export default Hometable;
    

    【讨论】:

      【解决方案3】:

      在我看来:

      const array = [...];
      ...
      const new_array_for_props = array.map(function(arr, index){
         <target_comp props_01={arr.props_01} key={index} />
      });
      

      子组件(target_comp)不必要地使用props.key。

      【讨论】:

        猜你喜欢
        • 2021-02-19
        • 1970-01-01
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 2019-08-21
        • 2021-09-23
        • 1970-01-01
        相关资源
        最近更新 更多