javascript - 首次单击时获得空白数组?
问题描述
我遇到了一个 Reactjs 问题。App.js 文件中提到了该问题。请调查一下。最初所有按钮都是白色的,不可点击,一段时间后我怎么能改变那里的颜色。我应该使用useEffect
钩子还是其他方式。我没有随机获取按钮的索引来更改它们的颜色和isDisable
.
三种按钮
- 白色:最初所有按钮都是白色的,不可点击。
- 红色:从白色按钮中随机出现一个按钮将变为红色且可点击。
- 蓝色:单击的按钮。单击红色按钮后颜色将变为蓝色且不可单击。
当所有白色按钮变为蓝色时,在屏幕中央弹出自定义弹出窗口,图标为“你赢了游戏……!!!”
我正在尝试下面的代码来随机更改按钮颜色,但失败了。
const changeColorHandle = () => {
const rand = Math.floor(Math.random() * 4);
btnArray.map((i, k) => {
if (i.index === rand) {
return ([...btnArray, { color: 'red', isDisable: false }])
}
return [...btnArray]
})
console.log(rand)
};
useEffect(() => {
if (btnArray.length > 0) {
setTimeout(() => {
changeColorHandle()
}, 2000);
}
}, [btnArray])
任何人都可以在这里解决这个问题。并告诉我我在哪里做错了。
谢谢。
解决方案
您不想真正弄乱新的反应钩子的一件事是它们并没有真正同步应用更改,这样有时您可能会有一点延迟。
我认为这不是问题所在,但您可以使用更有效的代码来解决问题:)
代码沙箱在这里
更改了行的原始片段在这里:
import React, { useState } from "react";
import Button from "./Button";
const Game = () => {
const [buttonValue, setButtonValue] = useState(0);
const [btnArray, setBtnArray] = useState([]);
const handleChange = e => {
setButtonValue(parseInt(e.target.value, 10));
};
const onClickHandle = () => {
const tmpArray = [];
for (let i = 0; i < buttonValue; i++) {
tmpArray.push({ color: "white", isDisable: true });
}
setBtnArray(tmpArray);
};
const changeColorHandle = () => {
alert("clicked");
};
(rest is ok )
如您所见,buttonValue
被删除,而 的工作onClick
只是根据输入的实际值生成一个新数组。
用户使用输入值不会有任何问题,因为btnArray
只有在他单击按钮后才会呈现 :) (由完成的状态更改触发的呈现setBtnArray()
编辑:一个不错的添加可能是作为字符串摆脱,buttonValue
因为您可以对其使用数学运算,而不是来回使用字符串转换
推荐阅读
- regex - 如何在 IntelliJ IDEA 中指定正则表达式方言?
- docker - 当我不想编辑的 Tomcat Docker 映像不作为 ROOT 运行时,如何写入 ROOT 拥有的目录?
- sql - 如何将要分隔的列表、数组或字符串作为参数传递给 redshift
- amazon-web-services - aws ec2 ssh 错误:`ssh:连接到主机 x 端口 22:操作超时`
- python - 在 DO 服务器上的 django 生产中进行 api 请求调用时,我得到了 429 状态,但是从本地主机运行时没有发生此类错误
- azure-hdinsight - HDInsight:Hive Metastore - 架构版本 2.1.2?
- php - TypeError:无法在字符串“lastUpdateCheck 1599160669280”上创建属性“lastUpdateCheck”
- javascript - Vue.js 定义 lodash 需要 "this._"
- javascript - MaterialUI 自动完成 - 选择选项时避免清除输入文本过滤器
- python - 从基于列的数组中返回多数加权投票