如何在反应 js 中设置具有时间延迟的循环内的状态

玛雅克

我试图制作一个程序来可视化 ReactJS 中的冒泡排序,我正在尝试更新循环内数组的状态,但有一些延迟。但是数组的状态只更新一次。我不明白这有什么问题。这种更新反应状态的方式是错误的吗?

我正在更新 useEffect() 内部数组的状态,并通过“onClick”事件调用 bubbleSort()

import {useState, useEffect, useRef} from 'react'

function App() {

  let count = 0;
  const [array, setArray] = useState([])
  const barBoundary = useRef(null)

  useEffect(()=>{
    count = 0;
    setArray(generateArray(1,100,400))
  }, [])


  const generateArray = (min, max,l) => {
    return Array.from({length: l}, () => Math.floor(Math.random() * (max - min) + min));
  }

  const sleep = (milli) => {
    return new Promise(resolve => setTimeout(resolve, milli)
  }

  const bubbleSort = async (speed) => {
    let temp = [...array];
    let len = array.length;
    let checked;
    do {
        checked = false;
        for (let i = 0; i < len; i++) {
            if (temp[i] > temp[i + 1]) {
              
              let tmp = temp[i];
              temp[i] = temp[i + 1];
              temp[i + 1] = tmp;
              await sleep(10)
              setArray(temp)
              checked = true;   
            }
            
        }
    } while (checked);
  }

  return (
    <div className="App">
      
      <div className="container">
        <div className="navbar">
          <ul>
            <li><button onClick={()=> setArray(generateArray(1,100,700))}>Bubble Sort</button></li>
            <li><button onClick={()=>bubbleSort()}>Sort</button></li>
          </ul>
        </div>
        <div className="bar-container">
          <div className="bar-boundary" ref={barBoundary}>
            <div className="bars">
              {
                array.map(item => {
                  return(
                  <div className="bar" key={++count}
                    style={{
                      backgroundColor:"blue",
                      height:`${item}%`,
                    }}
                  >
                  </div>)
                })
              }
            </div>
          </div>
        </div>
      </div>
      
    </div>
  );
}

export default App;
阿米拉·塞纳德希拉

这就是问题所在,您的数组指的是同一个实例,并且不会重新渲染。temp数组创建一个新数组并设置状态。有效。

setArray([...temp])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

反应如何在反应js中找不到打印

如何在项目列表中设置 ref 反应 js?

如何在反应js中将对象添加到具有钩子状态的数组中

如何在反应 js 中以编程方式关闭引导模式

如何在反应 js 中映射以下 api 响应

如何在反应js中获得多个位置

如何在组件外部更新 Recoil.js 中的原子(状态)?(反应)

在这里反应js noob,如何在循环遍历带有其键的数组时更改状态对象的值

如何在JavaScript中设置时间延迟

我如何在反应中将状态传递给文件 app.js?

如何在反应js中将小时添加到输入时间值

如何在反应js中的FETCH PUT API中将json主体作为字符串传递

如何在Quill JS(反应羽毛笔)中创建撤消/重做按钮?

如何在编辑器中显示已保存的Draft-JS数据?(反应+流星)

如何在Vue.js中声明反应式属性

如何在反应中从 js 文件导出自定义 array.prototype 方法

如何在Vue.js中调整文本字段反应性

如何在Node.js服务器的反应中显示图像

如何在MySQL中获取具有时间限制的数据

如何在反应中“获取”

如何在反应中显示从addImg.js(子组件)到app.js(父组件)的输入框值

如何在每次执行循环时使用Javascript设置循环的时间延迟

如何在Vue.js中设置反应式窗口参数 window.innerWidth不起作用

如何使用 Vue js 使 Fabric js 具有反应性?

如何在反应中改变状态的值

如何在反应中传递状态?

如何在测试中更改反应状态

如何在反应中访问子状态?

如何在反应中更新状态对象?