【问题标题】:React for loops反应循环
【发布时间】:2017-06-15 02:25:56
【问题描述】:

我正在学习 JavaScript / React。我正在尝试为 react 网站上的井字游戏示例创建一个简单的 for 循环,但到目前为止它一直存在问题。奇怪的是,有几个地图示例,但没有 for 循环示例。

无论如何,对于以下内容:

function Row(props){
  function renderSquare (i) {
    return <Square key={i} value={props.squares[i]} onClick={() => props.onClick(i)} />;
  }
  const columns = 3;
  let ss = [];
  for(var a = 0, i = props.counter * columns; a < 3; a++, i++){
    //Test Code
  }
  return (
    <div className="board-row">
      {ss}
    </div>
  );
}

当我替换“测试代码”时,这是可行的

ss.push(renderSquare(i));

但这失败了

ss.push(<Square key={i} value={props.squares[i]} onClick={() => props.onClick(i)}/>);

第二个选项失败,因为它没有创建“单独的” onClick 元素。如何使失败的示例工作?


更新 #1

Sample

更新 #2 我按照@Matthias247 的建议将 var 更改为 let ,现在它可以工作了:D

function Row(props){
  function renderSquare (i) {
    return <Square key={i} value={props.squares[i]} onClick={() => props.onClick(i)} />;
  }
  const columns = 3;
  let ss = [];
  for(let a = 0, i = props.counter * columns; a < columns; a++, i++){
    ss.push(<Square key={i} value={props.squares[i]} onClick={() => props.onClick(i)}/>);
    //ss.push(renderSquare(i));
    //console.log(i);
  }
  return (
    <div className="board-row">
      {ss}
    </div>
  );
}

【问题讨论】:

    标签: javascript reactjs for-loop


    【解决方案1】:

    我认为问题在于您将i 捕获到元素和onClick 闭包中。您在 for 循环期间更改 i,但最终所有插入的元素都相同 -> props.counter + 3

    要修复它,您需要为每个元素创建一个所有捕获值的唯一实例。这正是您使用 renderSquare 方法所做的,该方法在函数体内创建了一个新的 i 实例,该实例现在被元素捕获。

    编辑:

    使用let 绑定(每次迭代都会创建一个新的变量实例)也可以:

    for (let a = 0, i = props.counter; a < 3; a++, i++) {
        ss.push(<Square key={i} value={props.squares[i]} onClick={() => props.onClick(i)}/>);
    }
    

    【讨论】:

    • 不幸的是, let 不起作用。我会尝试发布我的示例。
    • 我理解理论,但不确定如何实现它。
    • 它不起作用,因为您没有将 i 移入循环并使其成为 let 绑定。这意味着您仍然只有一个 i 对象实例和每次迭代的新对象。您只将 a 更改为 let 绑定。如果您完全使用我发布的代码,那么它可以工作。
    • 哇,谢谢。第一次 var vs let 有所作为。
    猜你喜欢
    • 2022-01-23
    • 2021-11-11
    • 2018-02-02
    • 2017-10-18
    • 1970-01-01
    • 2018-05-16
    • 2021-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多