You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React JS中如何为匹配随机数的选中元素动态添加类名

宾果游戏匹配选中数字追加类名实现方案

你不需要手动操作DOM来添加类名,直接基于React状态驱动视图,在渲染时动态拼接类名即可,具体实现步骤如下:

  • 首先修正现有代码的语法问题:原numbers.map的回调参数未加括号,正确写法应为numbers.map((number, index) => (...)),否则会抛出语法错误。
  • 渲染每个数字行时,判断当前遍历的数字是否存在于已选数字列表selectedNumbers中,若存在则追加自定义的选中状态类名;如果需要给最新摇出的数字加特殊高亮,额外判断当前数字是否等于chosen状态值即可。
  • 优化选号逻辑的状态更新写法,避免闭包导致拿到旧状态值、生成重复随机数的问题。

修正后的面板渲染代码

{numbers.map((number, index) => {
  // 校验当前数字是否已被选中
  const isSelected = selectedNumbers.includes(number);
  // 校验是否为最新摇出的数字(不需要特殊样式可以删掉这行)
  const isLatestChosen = chosen === number;
  // 拼接行元素类名
  const rowClass = [
    'bingo-grid__row',
    isSelected ? 'bingo-grid__row--selected' : '',
    isLatestChosen ? 'bingo-grid__row--latest' : ''
  ].filter(Boolean).join(' ');

  return (
    <div className={rowClass} id={index + 1} key={index}>
      <div className={className}>
        <div className="bingo-ball">
          <div className="bingo-ball__text">{number}</div>
        </div>
      </div>
    </div>
  )
})}

上述代码里的bingo-grid__row--selected、bingo-grid__row--latest是自定义类名,你可以替换成自己实际需要的类名,只要在CSS里写好对应样式就能实现选中高亮效果。

优化后的选号逻辑

原选号逻辑直接读取外部selectedNumbers值做循环判断,在多次快速触发选号时可能因为闭包拿到旧状态生成重复数字,改成函数式更新更稳妥:

const [chosen, setChosen] = useState(null);
const [selectedNumbers, setSelectedNumbers] = useState([]);
const chooseNumber = () => {
  let randomNum;
  setSelectedNumbers(prevSelected => {
    do {
      randomNum = Math.floor(Math.random() * 75) + 1;
    } while (prevSelected.includes(randomNum));
    setChosen(randomNum);
    return [...prevSelected, randomNum];
  });
};

注意:React场景下不要用document.querySelector、getElementById这类原生API手动给元素加类名,状态变化时组件会自动重渲染,动态拼接的类名会自动同步到DOM上,手动操作DOM反而容易出现状态和视图不同步的问题。

内容的提问来源于stack exchange,提问作者breking bed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:48:20