Я новичок, чтобы отреагировать, поэтому я не уверен, что здесь не так ... Я пытаюсь создать структуру полей ввода 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')
);



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Здесь нужно переместить свойство ключ:
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 в цикле. Также одна строка ???
По-видимому, у меня есть 3 поля ввода из первой строки и 1 поле ввода из второй строки
@AkshayKishore, я добавил в свой ответ раздел редактирования.
@AkshayKishore, все в порядке, не беспокойся. Удачи друг :)
for( let i=props.key*3;i<(props.key+3);i++)Вы уверены, что это работает?