javascript - 你能在点击时只改变一个类吗?
问题描述
我正在尝试构建战舰项目,现在我生成了一个 10x10 的网格,如下所示:
但我希望每次点击一个框,它都会将颜色从青色变为黑色。我试过用一种useState
方法来做这件事,但它改变了所有的盒子。我希望在每次单击后一个一个地更改这些框
import React, { useEffect, useState } from "react";
import Ship from "../components/ShipGenerate.js";
import "../style/style.css";
function Grid(props) {
let grid = new Array(10);
let box = [];
const [active, setActive] = useState(true);
console.log(grid);
console.log(box);
for (let i = 0; i < grid.length; i += 1) grid[i] = new Array(10).fill(0);
const rnd = (r) => Math.trunc(Math.random() * r);
for (let l = 0; l < 40; l += 1) {
grid[rnd(10)][rnd(10)] = 1;
}
for (var x = 0; x < grid.length; x++) {
for (var y = 0; y < grid.length; y++) {
if (grid[x][y] === 0) {
box.push(
<div>
<div className="piece"></div>
</div>
);
} else {
box.push(
<div>
<div className="boom"></div>
</div>
);
}
}
}
return (
<div>
<div className="box">{box}</div>
</div>
);
}
export default Grid;
解决方案
您可以将整个网格用作状态。
然后,当您单击一个框时,您将x
和y
坐标传递给一个函数,该函数将单击的框从 0 翻转到 1 或反之亦然 - 类似于:
function Grid(props) {
const emptyGrid = new Array(10);
for (let i = 0; i < emptyGrid.length; i += 1) {
emptyGrid[i] = new Array(10).fill(0);
}
const [grid, setGrid] = useState(emptyGrid);
function togglePieceStatus(x, y) {
setGrid(currentGrid => {
const position = currentGrid[x][y];
currentGrid[x][y] = position === 0 ? 1 : 0;
return currentGrid;
});
}
const box = [];
for (var x = 0; x < grid.length; x++) {
for (var y = 0; y < grid.length; y++) {
const className = grid[x][y] === 0 ? 'piece' : 'boom';
box.push(
<div>
<div
className={className}
onClick={() => togglePieceStatus(x, y)}
></div>
</div>
);
}
}
return (
<div>
<div className="box">{box}</div>
</div>
);
}
推荐阅读
- android - 如何在 Android 中将双精度转换为货币格式
- autohotkey - AutoHotKey - 打开一个网站而不给它焦点
- c - 输出有不需要的回车和换行。如何在下面的程序中删除回车“\ r”?
- asp.net-mvc - 没有 API 密钥的 Google Maps API (ASP.NET MVC)
- if-statement - 使用 if else 语句返回
- vim - vim:快速修复窗口上的 grep/vimgrep 和错误:E499
- r - How can I manipulate categorical data for logistic regression?
- windows - Windows 应用程序损坏
- php - 如何在 WordPress 媒体附件页面上链接回父帖子?
- lti - 有没有办法在登录时启动 Canvas LMS 外部应用程序(插件)或在登录后立即显示在主屏幕上?