reactjs - 每秒更新一次反应状态
问题描述
我正在尝试制作一个排序算法可视化工具,并且我坚持每秒渲染新状态。
这是我所做的,我有一个bubbleSort
对数组执行冒泡排序的函数,当用户单击按钮开始时调用
const bubbleSort = () => {
setSorting(true)
console.log(sorting)
let attemp = 10
let temp = 0
let counter = 1
while(attemp > 0){
attemp = 0
for (let i = 0; i < data.datasets[0].data.length - 1; i++) {
if(data.datasets[0].data[i] > data.datasets[0].data[i+1]){
const newBars = data
var interval = setInterval(() => {
setData(swap(newBars, i, i + 1));
}, 500 * i * counter)
}
}
counter++
}
//clearInterval(interval)
}
交换功能
const swap = (arr, i, j) => {
console.log(i, j)
let temp = arr.datasets[0].data[i];
arr.datasets[0].data[i] = arr.datasets[0].data[j];
arr.datasets[0].data[j] = temp;
return arr
}
我的数据有这个形状
const sortData = {
labels: ['','','','','','','','','','','','','','','','','','','','','','','','',''],
datasets: [
{
label: `${sortNames[sort]} sort`,
backgroundColor: [
chartColors.default,
chartColors.default,
chartColors.default,
chartColors.default
],
borderWidth: 1,
hoverBackgroundColor: '#fff',
hoverBorderColor: '#0a2ea9',
barPercentage:1,
data: [65, 59, 80, 81, 56, 70, 72, 89, 23, 11, 4, 92, 87, 84, 50, 57, 59, 44, 49, 39, 35, 32, 0]
}
]
}
ps:我试过用setTimeout来做,同样的事情发生了。排序是 bieng 执行的,但似乎setData
没有执行,因为下面的代码只执行一次
useEffect(() => {
console.log('updated')
}, [])
谁能告诉我我错过了什么。
解决方案
您需要传递第二个参数,useEffect
如果第二个参数的值发生更改,这将导致触发。
useEffect(() => {
console.log('updated')
}, [data])
推荐阅读
- r - 对于一列中的指定值,查找另一列中值的变化幅度,对于每个 ID
- sql - 使用数组过滤结果的数据库 SQL 查询
- python - Softmax 在 MNIST 爆炸梯度上从头开始
- docker - docker stop 不遵守 stop_grace_period
- c# - Kendo MVC - 为特定工具提示设置自定义样式
- javascript - JAVASCRIPT-我的 FOR 循环只执行一次
- javascript - TinyMCE 编辑器不会调整大小
- r - R中的二值化异常值
- javascript - onscroll 在移动设备上不起作用,也尝试过 ontouchmove(在 React 挂钩中工作以实现无限滚动)
- c# - 创建后写入新的文本文件