Рендеринг массива объектов в React

Я новичок, чтобы отреагировать, поэтому я не уверен, что здесь не так ... Я пытаюсь создать структуру полей ввода 3x3. Это то, что я придумал

function Square(prop){
    return (<input type = 'text' class='w-25'  style = "display:inline-block">${prop.key}</input>);
}

function Row(props){
    const row =[];
    for( let i=props.key*3;i<(props.key+3);i++){
        row.push(<Square key  = {i}/>);
    }
    return (row);
}

class Box extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            squares: Array(9).fill(null),
            xIsNext: true,
        };
    }
    render(){
        let board =[];
        for( let i=0; i<3;i++){
            board.push(<div><Row key = {i} /></div>);
        } 
        return (board);
    }
} 
ReactDOM.render(
    <Box />,
    document.getElementById('root')
  );

Но я получаю сообщение об ошибке

Warning: Each child in an array or iterator should have a unique "key" prop.

Что касается моего Dom, 3 строки были отрисованы как

Any help would be greatly appreciated

ОБНОВИТЬ

Попробовав несколько ответов, приведенных ниже, я получил одну строку из 4 полей ввода ... хотя я указал только 3 в цикле. Почему это может кто-нибудь объяснить, и я указал еще 2 строки. Это новый код.

function Square(prop){
    return (<input type = 'text' id = {prop.value} value = {'x'}></input>);
}

function Row(props){
    const row =[];
    for( let i=props.value*3;i<(props.value+3);i++){
        const val = `${i}input`;
        const key = `${i}square`;
        row.push(<Square key  = {key} value = {val}/>);

    }
    return (row);
}

class Box extends React.Component{
    constructor(props){
        super(props);
        this.state = {
            squares: Array(9).fill(null),
            xIsNext: true,
        };
    }
    render(){
        let board =[];
        for( let i=0; i<3;i++){
            const key = `${i}row`;
            board.push( <Row  key = {key} value = {i}/>);
            console.info(i)
        } 
        return (board);
    }
} 
ReactDOM.render(
    <Box />,
    document.getElementById('root')
  );
for( let i=props.key*3;i<(props.key+3);i++) Вы уверены, что это работает?
omri_saadon 01.11.2018 15:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
90
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Здесь нужно переместить свойство ключ:

board.push(<div key = {i}><Row /></div>);

Поскольку key должен быть во внешнем элементе каждого элемента в массиве

Вы должны использовать ключ в родительском элементе т.е. div в вашем примере:

for( let i=0; i<3;i++){
  board.push(<div key = {i}><Row /></div>);
}

Кстати, вы можете просто использовать:

for( let i=0; i<3;i++){
  board.push(<Row key = {i} />);
}

Лучше всего использовать некоторую строку вместо присвоения числового значения, чтобы она не конфликтовала с другим ключом элемента:

for( let i=0; i<3;i++){
  board.push(<Row key = {'row-'+i} />);
}
Ответ принят как подходящий

Ключевой атрибут должен быть в первом элементе итерации, который является элементом div:

board.push(<div key = {i}><Row /></div>);

Также обратите внимание, что эта строка for( let i=props.key*3;i<(props.key+3);i++) может не работать для вас, так как больше нет ключевой опоры.

Вы можете изменить его на: for( let i=0;i<3;i++)

Обратите внимание, что это Антипаттерн для использования индекса в качестве ключа.

a key is the only thing React uses to identify DOM elements. What happens if you push an item to the list or remove something in the middle? If the key is same as before React assumes that the DOM element represents the same component as before. But that is no longer true.

Взял от Эта среда - индекс как ключ - это антипаттерн.

Обновлено:

Добавлен пример кода, который должен работать за вас.

Обратите внимание, что я удалил компонент Row, поскольку он кажется лишним.

Я не понял, зачем вам две петли for? Вам нужно 9 входов или 3 входа?

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';

function Square(props) {
  return (<input type='text' id = {props.key} value = {props.value}></input>);
}

class Box extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      squares: Array(9).fill(null),
      xIsNext: true,
    };
  }
  render() {
    let board = [];
    for (let i = 0; i < 3; i++) {
      const key = `${i}row`;
      board.push(<Square key = {key} value = {i} />);
      console.info(i)
    }
    return (board);
  }
}
ReactDOM.render(
  <Box />,
  document.getElementById('root')
);

Спасибо, но теперь я получаю одну строку из 4 полей ввода. Обратите внимание, почему я получаю 4, когда ive указал только 3 в цикле. Также одна строка ???

Akshay Kishore 01.11.2018 22:05

По-видимому, у меня есть 3 поля ввода из первой строки и 1 поле ввода из второй строки

Akshay Kishore 02.11.2018 06:35

@AkshayKishore, я добавил в свой ответ раздел редактирования.

omri_saadon 02.11.2018 09:43

@AkshayKishore, все в порядке, не беспокойся. Удачи друг :)

omri_saadon 02.11.2018 10:09

Другие вопросы по теме