当前位置: 首页 > 面试题库 >

React-使用循环创建嵌套组件

元阳荣
2023-03-14
问题内容

我对React有一点问题。我无法使用for循环创建嵌套组件。我想做的是创建一个表的9个单元格,然后创建3行,每行3个单元格,然后将3行安装在一起并创建9x9的电路板。

假设我想得到类似的东西,但是使用循环

class Board extends React.Component {     
renderSquare(i) {
    return <Square value={this.props.squares[i]} onClick={() => this.props.onClick(i)} />;
}

render(){    
    return(
        <div>
            <div className="board-row">
                {this.renderSquare(0)}
                {this.renderSquare(1)}
                {this.renderSquare(2)}
            </div>
            <div className="board-row">
                {this.renderSquare(3)}
                {this.renderSquare(4)}
                {this.renderSquare(5)}
            </div>
            <div className="board-row">
                {this.renderSquare(6)}
                {this.renderSquare(7)}
                {this.renderSquare(8)}
            </div>
        </div>
    );        
}

}

我搜索了几个小时的其他问题,我认为我的代码几乎是正确的,但没有呈现我想要的内容。我只会得到一张白纸。

这是我的代码:

class Board extends React.Component {

renderSquare(i) {
    return <Square value={this.props.squares[i]} onClick={() => this.props.onClick(i)} />;
}

createCells(i){
    if(i%3){return;}
    var index = this.fillN(Array(i)); //index=[0,1,2,3,4,5,6,7,8]
    var cells = [];
    index.forEach(function(i){
        cells.push(() => {
            return(
                <div>
                    {this.renderSquare(i)}
                </div>
            );
        });
    });
    return cells;
}

createRows(cells){
    var index = this.fillMod3(Array(3)); //index=[0,3,6]
    var rows = []
    index.forEach(function(i){
        rows.push(() => {
            return(
                <div>
                    {cells[i]}
                    {cells[i+1]}
                    {cells[i+2]}
                </div>
            );
        });
    });
    return rows;
}

render(){    
    var cells = this.createCells(9);
    var rows = this.createRows(cells);
    var board = [];
    var index = this.fillN(Array(1));

    index.forEach(function(row){
        board.push(() => {
            return(
                <div>{row}</div>
            );
        });
    })

    return(
        <div>
            {board[0]}
        </div>
    );        
}

我总是在屏幕上看到这样的东西:

<Board>
  <div> /*empty*/ </div>
</Board>

我想澄清一下,我确定该组件(板)与之交互的其余代码没有问题。

我是反应新手,如果someoane可以帮助我,我将非常感激。对不起,我英语不好

EDIT1:以下 marklew 示例,我应该能够做这样的事情

    render(){   
    var index1 = this.fillN(Array(3)); //index1=[0,1,2]
    var index2 = this.fillN(Array(3)); //index2=[0,1,2]

    return(
        <div>
            {index1.map((e1,i1) => {
                return(
                    <div key={i1} className="board-row">
                        {index2.map((e2, i2) => {
                            return(
                                <p key={i2+10}>
                                    {this.renderSquare(i2)}
                                </p>
                            )
                        })}
                    </div>
                )    
            })}
        </div>
    );

}

但这并不能满足我的要求。我只得到一个包含9个单元格的列,并且这些单元格是相同的对象。我不明白为什么。(我知道这是相同的对象,因为在创建此类对象时我为其分配了一个句柄函数onClick:

<Board 
     onClick={(i) => this.handleClick(i)} //handleClick just draws a X in the cell
     />

我同时将X淹没在3个单元格中

EDIT2:我达成了一个解决方案:

render(){   
    var index1 = this.fillMod3(Array(3));

    return(
        <div>
            {index1.map((e,i) => {
                return(
                    <div key={i} className="board-row">
                        {this.renderSquare(e)}
                        {this.renderSquare(e+1)}
                        {this.renderSquare(e+2)}
                    </div>
                )    
            })}
        </div>
    );

}

}

但不是我想要的。我甚至希望为实习生renderSquare(i)函数提供另一个循环。


问题答案:

要在JSX中呈现元素列表,您可以执行以下操作:

render() {
    return <div>
        {
            [1,2,3].map ( (n) => {
                return this.renderSquare(n)
            })

        }
    </div>;
}

只需将您的组件数组包装到{}JSX中即可。

为了澄清一点,这是相同的逻辑:

return <div>
    {
        [
            <h1 key="1">Hello 1</h1>,
            <h1 key="2">Hello 2</h1>,
            <h1 key="3">Hello 3</h1>
        ]           
    }
</div>;

请注意,每次渲染组件数组时,都必须提供一个keyprop,如此处所示。

另外,如果只想在渲染函数中打印行值,则应替换:

index.forEach(function(row){
    board.push(() => {
        return(
            <div>{row}</div>
        );
    });
})

与:

index.forEach( (row, index) => {
    board.push(<div key={index}>{row}</div>)
})

或者,然而,更换forEachpush使用map

board = index.map( (row, index) => <div key={index}>{row}</div> )

编辑 我使用您的代码作为基础用9x9板创建了一个提琴:https :
//jsfiddle.net/mrlew/cLbyyL27/(您可以单击单元格将其选中)



 类似资料:
  • 问题内容: 我有一段代码,但是我想提高性能。我的代码是: matrix2是4维np数组,而matrix1是2d数组。 我想通过使用np.tensordot(matrix1,matrix2)加快此代码的速度,但是后来我迷路了。 问题答案: 您可以只使用jit编译器 您的解决方案一点也不差。我唯一更改的是索引和变量循环范围。如果您有numpy数组和过多的循环,则可以使用编译器(Numba),这确实很简

  • Python 不仅支持 if 语句相互嵌套,while 和 for 循环结构也支持嵌套。所谓嵌套(Nest),就是一条语句里面还有另一条语句,例如 for 里面还有 for,while 里面还有 while,甚至 while 中有 for 或者 for 中有 while 也都是允许的。 当 2 个(甚至多个)循环结构相互嵌套时,位于外层的循环结构常简称为 外层循环或 外循环,位于内层的循环结构常简

  • 这是我的代码。我遇到的问题是,我希望将HP在我的PHP代码中的数字转换为我的HP HTML代码,以及与Cylinder相同的内容。我已经想好了其他的东西,但说到这一部分我就卡住了

  • 本文向大家介绍MATLAB嵌套循环,包括了MATLAB嵌套循环的使用技巧和注意事项,需要的朋友参考一下 示例 可以嵌套循环,以在另一个迭代任务中执行迭代任务。考虑以下循环: 我们使用2个迭代器来显示abc和中元素的所有组合1:m,从而得出: 我们还可以使用嵌套循环来组合每次要完成的任务和几次迭代中要完成的任务: 这里我们要计算所有的斐波那契数列,但是n每次只显示第一个元素,所以我们得到 我们可以做

  • 嵌套循环就是在一个循环中还有一个循环,内部循环在外部循环体中.在外部循环的每次执行过程中都会触发内部循环,直到内部循环执行结束.外部循环执行了多少次,内部循环就完成多少次.当然,不论是外部循环或内部循环的break语句都会打断处理过程. 例子 10-19. 嵌套循环 1 #!/bin/bash 2 # nested-loop.sh: 嵌套的"for" 循环. 3 4 out

  • 3.4.4 嵌套循环 为了实现复杂的算法,控制结构可以相互嵌套,即一个控制结构处于另一个控制结构的 内部。前面我们见过 if 结构的嵌套,现在我们讨论循环的嵌套。 先考虑“一维”数据结构——由简单数据值构成的列表,为了遍历列表以处理其中数据, 我们需要一个循环。例如用一个循环来计算列表中所有数据之和: >>> a = [1,2,3,4,5] >>> sum = 0 >>> for i in a: