React Js:只更改已单击的table单元格的class

React Js: Only change the class of the table cell that has been clicked

我正在创建一个寻路应用程序。我希望用户能够在 A 点到 B 点之间绘制自己的墙。我只需要更改每个 table 单击的单元格的 class 。但是我只能更改每个 table 单元格的 class,无论单击哪个 table 单元格。我完全不知道该去哪里。理想情况下,用户将能够单击并拖过网格,而不必单击每个独立的 table 单元格。干杯:)

Grid.js

import React, { Component } from "react";

import Xnode from "./Xnode";
import Ynode from "./Ynode";

export class Grid extends Component {
  constructor(props) {
    super(props);
    this.state = {
      path: true,
      wall: false,
      Xactive: this.state,
      Yactive: this.state,
    };
  }
  
  render() {
    let rows = [];
    let columns = [];

    for (let i = 0; i < 60; i++) {
      columns[i] = (
        <td
          className={this.state.wall ? "wall" : "grid"}
          onClick={() => this.setState({ wall: true })}
          id={i}
          key={i}
        ></td>
      );
    }

    for (let i = 0; i < 25; i++) {
      rows[i] = (
        <tr id={i.toString()} key={i.toString()}>
          {columns}
        </tr>
      );
    }

    return (
      <div>
        <table className="grid">
          <tbody>{rows}</tbody>
        </table>
      </div>
    );
  }
}

export default Grid;

App.js


import './App.css';

import React from 'react';
import {
  BrowserRouter as Router,
  Route,
} from 'react-router-dom';

import './App.css';

import Grid from './components/Grid';

export default () => (
  <Router>
    <div >
        <Route exact path="/" component={Grid} />
</div>
  </Router>
  
);

CSS

 table.grid {
  margin: 80px auto;
  border: 5px solid #333;
  border-collapse: collapse; /* */
}

td.grid {
  width: 15px; height: 15px;
  border: 1.5px solid #333; /* */
}

td.wall {
  width: 15px; height: 15px;
  background-color: black;
  border: 1.5px solid #333; /* */
}

.node-x {
  background-color: mediumaquamarine ;
  border: 2px solid black;
  border-radius: 50%;
  width: 20px;
  height: 20px;
}

.node-y {
  background-color: red ;
  border: 2px solid black;
  border-radius: 50%;
  width: 20px;
  height: 20px;
}

因此,table 个单元格的每个 class 都取决于网格的状态,当单击任何 table 个单元格时,网格的状态会发生变化。在我看来 td 元素应该是它们自己的组件并且也有它们自己的状态。类似于:

class MyTD extends Component {
  constructor(props) {
    super(props);
    this.state = {
      isClicked: false
    }
  }

  render(){
    <td 
      onClick={() => {this.props.handleClick(); this.setState({isClicked: true});}}
      className={this.state.isClicked ? "wall" : "grid"}
    </td>
  }
}

然后在您的网格组件中:

//for loop
<MyTD key={i} handleClick={() => this.setState({wall: true})}/>

这是假设您需要您的子组件来更改父网格的状态。如果他们不这样做,并且点击只需要改变自己的状态,你甚至不需要传递点击处理程序。