【问题标题】:How to insert component inside <td> on click点击时如何在 <td> 中插入组件
【发布时间】:2020-10-20 15:42:21
【问题描述】:

我在 td 标签中插入 React 组件时遇到问题。这个组件应该被插入到被点击的那个 td 中。

如您所见,每个 td 都有 onClick 事件监听器用于 checkPlayer 功能。此函数检查 sign state 的值,并取决于该值 X 组件或 O 组件将插入到该特定 td 中。

你们能帮我如何渲染这样的组件吗?目前的做法只写[object object]

我的目标 - 输出

<td>{<X />}</td>

X分量,O分量差不多

import React from 'react';

//styles
import './X.scss';

function X(){
    return(
        <div className="X">
            <p>X</p>
        </div>
    )
}

export default X;

App.js

function App() {
  const [sign,setSign] = useState(true)
  function checkPlayer(e){

    //1st player
    if(sign === true){
      e.target.innerHTML = <X />;
      
      setSign(false);
    }
      
    //2nd player
    if(sign === false){
      e.target.innerText = <O />;

      setSign(true);
    }
}

App.js 的 HTML 部分

  return (
    <div className="App">
      <div className="container">
        <table>
          <tbody>
            <tr>
              <td onClick={checkPlayer}></td>
              <td onClick={checkPlayer}></td>
              <td onClick={checkPlayer}></td>
            </tr>

            <tr>
              <td onClick={checkPlayer}></td>
              <td onClick={checkPlayer}></td>
              <td onClick={checkPlayer}></td>
            </tr>

            <tr>
              <td onClick={checkPlayer}></td>
              <td onClick={checkPlayer}></td>
              <td onClick={checkPlayer}></td>
            </tr>
          </tbody>
        </table>
      </div>
    </div>
  );
}

【问题讨论】:

  • 这种方法是非 React 的。相反,您要做的是 1) 将数组保持在存储九个字段(空白、X 或 O)的状态 2) 让 checkPlayer 更新数组(并将函数重命名为 handleClick 或类似的东西以指示它实际上是什么确实)3)使用基本的 React 列表渲染来渲染状态
  • 基本思路如下:codesandbox.io/s/dry-worker-zp695?file=/src/App.js(这显示了使用.map() 进行列表渲染以及如何更新多维数组)
  • 谢谢你,但我的反应没有那么远。我真的不明白你在那里做了什么
  • 必须有一些简单的方法..不要像你一样使用矩阵
  • 不,不是。不过,您可以使用一个包含九个元素的简单数组。 Tic Tac Toe 意味着您必须检查三排,矩阵使这变得更简单。

标签: javascript html reactjs


【解决方案1】:

给你。我玩过它,这应该给你一个好的方向。 (注意:您需要使用 [...values] 创建一个新数组,而不是引用旧数组,以便 UI 重新呈现)。

import React, {useState, useEffect} from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  const [sign,setSign] = useState(true);

  const [values, setValues] = useState([["", " ", " "],[" ", " ", " "],[" ", " ", " "]]);

  function updateValue(row, column){
      var newValue = [...values];
      newValue[row][column] = sign == true ? "X" : "O";
      setSign(!sign);
      setValues(newValue);
  }

  return (
      <div>
        <table>
          <tbody>
            <tr>
              <td onClick={() => updateValue(0,0)}>{values[0][0]}</td>
              <td onClick={() => updateValue(0,1)}>{values[0][1]}</td>
              <td onClick={() => updateValue(0,2)}>{values[0][2]}</td>
            </tr>

            <tr>
              <td onClick={() => updateValue(1,0)}>{values[1][0]}</td>
              <td onClick={() => updateValue(1,1)}>{values[1][1]}</td>
              <td onClick={() => updateValue(1,2)}>{values[1][2]}</td>
            </tr>

            <tr>
              <td onClick={() => updateValue(2,0)}>{values[2][0]}</td>
              <td onClick={() => updateValue(2,1)}>{values[2][1]}</td>
              <td onClick={() => updateValue(2,2)}>{values[2][2]}</td>
            </tr>
          </tbody>
        </table>
      </div>
  );
}

export default App;

【讨论】:

  • 非常感谢。你能解释一下这条线吗? newValue[row][column] = nextIsX == true ? “X”:“O”;我真的没有从 = nextIsX == true 得到那个? “X”:“O”;
  • ,我需要更多帮助
  • 您没有创建values 数组的深层副本,因此不会改变状态。像这样对 JSX 进行手工编码是一种不好的做法。请参阅我的codesandbox 了解正确的方法。
  • 这是一个浓缩为一行的“if”语句。 “条件?”真值“:”假值“
  • @ChrisG 确实有一个更简洁的版本。如果您不熟悉 .map,可能会更难理解。无论哪种方式,我都会查看他的版本,看看您是否可以遵循逻辑。好东西要知道。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 2016-11-04
  • 2021-01-06
  • 2016-06-24
相关资源
最近更新 更多