如何停止执行通过使用 ReactJS 中的另一个按钮单击按钮触发的功能?
How to stop execution of a function which is triggered by a button click using another button in ReactJS?
我有一个 ReactJS 应用程序,其中 buttonA 是 运行 函数 onClick,并且该函数内部有一个 for 循环。我想打破另一个函数的 for 循环 onclick。
这两个按钮的可见性是使用 states 控制的。每当我们单击 roll dice btn 时,它都会隐藏自己并显示 stop bet btn 并且 stop bet btn 应该 onclick 停止执行在 Roll dice 的 onclick 中声明的 runbets 函数。我想要与 Primedice.com 相同的功能。
const [stopBet, setStopBet] = useState(false);// this is the state declaration for reference
<button
type="button"
className={`text-md font-bold bg-btn1 text-white px-28 py-3 rounded ${
disableClick && "hidden"
}`}
id="rollBtn"
onClick={() => {
const runBets = () => {
for (let i = 0; i < 10; i++) {
if (stopBet) {
console.log("enable click");
document
.getElementById("rollBtn")
.removeAttribute("disabled");
setDisableClick(false);
setStopBet(false);
break;
}
}
};
// To prevent spamming of bets
setDisableClick(true);
console.log("disable click");
document
.getElementById("rollBtn")
.setAttribute("disabled", "true");
runBets();
}}>
Roll Dice
</button>
<button
type="button"
className={`text-md font-bold bg-btn1 text-white px-28 py-3 rounded ${
!disableClick && "hidden"
}`}
id="rollBtn"
onClick={() => {
setStopBet(() => {
console.log("stop bet");
return true;
});
}}>
Stop Bet
</button>
如果您使用 useState
,则会出现问题,状态更新和组件重新呈现时会出现延迟。与此同时,循环可以继续,这是你不希望的。
我建议你用 useRef
试试这个,它不会重新渲染整个组件并完成你的工作。
const bool = useRef(false); // Replace the useState line with this.
onClick(() => bool.current = true); // Replace the stop logic with this.
if (bool.current) // Replace the if condition with this.
break;
我还建议,对于某些问题,您可以在沙盒中克隆您想要的内容,这样更容易真正看到您想要的内容或 UI 中正在发生的事情。
我认为你应该在这里使用 useMemo 而不是 useState,因为你不想在组件重新渲染时更改数据
我有一个 ReactJS 应用程序,其中 buttonA 是 运行 函数 onClick,并且该函数内部有一个 for 循环。我想打破另一个函数的 for 循环 onclick。 这两个按钮的可见性是使用 states 控制的。每当我们单击 roll dice btn 时,它都会隐藏自己并显示 stop bet btn 并且 stop bet btn 应该 onclick 停止执行在 Roll dice 的 onclick 中声明的 runbets 函数。我想要与 Primedice.com 相同的功能。
const [stopBet, setStopBet] = useState(false);// this is the state declaration for reference
<button
type="button"
className={`text-md font-bold bg-btn1 text-white px-28 py-3 rounded ${
disableClick && "hidden"
}`}
id="rollBtn"
onClick={() => {
const runBets = () => {
for (let i = 0; i < 10; i++) {
if (stopBet) {
console.log("enable click");
document
.getElementById("rollBtn")
.removeAttribute("disabled");
setDisableClick(false);
setStopBet(false);
break;
}
}
};
// To prevent spamming of bets
setDisableClick(true);
console.log("disable click");
document
.getElementById("rollBtn")
.setAttribute("disabled", "true");
runBets();
}}>
Roll Dice
</button>
<button
type="button"
className={`text-md font-bold bg-btn1 text-white px-28 py-3 rounded ${
!disableClick && "hidden"
}`}
id="rollBtn"
onClick={() => {
setStopBet(() => {
console.log("stop bet");
return true;
});
}}>
Stop Bet
</button>
如果您使用 useState
,则会出现问题,状态更新和组件重新呈现时会出现延迟。与此同时,循环可以继续,这是你不希望的。
我建议你用 useRef
试试这个,它不会重新渲染整个组件并完成你的工作。
const bool = useRef(false); // Replace the useState line with this.
onClick(() => bool.current = true); // Replace the stop logic with this.
if (bool.current) // Replace the if condition with this.
break;
我还建议,对于某些问题,您可以在沙盒中克隆您想要的内容,这样更容易真正看到您想要的内容或 UI 中正在发生的事情。
我认为你应该在这里使用 useMemo 而不是 useState,因为你不想在组件重新渲染时更改数据