I'm building a sorting algorithm visualizer, and in my return, I'm creating divs to represent vertical bars, in animatedBubbleSort() I'm swapping values in the state array on a timeout, the array IS being sorted, but what I expected to happen was that the .map function would be re-rendered each time the state is changed with updateArray(). But the .map function does not re-fire at all.
import React, { useState } from "react";
import "../styles/App.css";
import { Header } from "./Header";
export default function SortingVisualizer(props) {
const LOWER_BOUND = 5;
const UPPER_BOUND = 200;
const ARRAY_SIZE = 200;
const [array, updateArray] = useState(fillArrayWithRandomValues);
// returns a random number between bounds inclusive
function randomNumberBetweenBounds() {
return Math.floor(Math.random() * UPPER_BOUND) + LOWER_BOUND;
}
// fills array with random values
function fillArrayWithRandomValues() {
let tempArray = [];
for (let i = 0; i < ARRAY_SIZE; i++) {
tempArray.push(randomNumberBetweenBounds());
}
return tempArray;
}
function animatedBubbleSort() {
let tempArr = array;
let len = tempArr.length;
for (let i = 0; i < len; i++) {
for (let j = 0; j < len; j++) {
if (tempArr[j] > tempArr[j + 1]) {
let tmp = tempArr[j];
tempArr[j] = tempArr[j + 1];
tempArr[j + 1] = tmp;
setTimeout(() => {
updateArray(tempArr);
}, 300 * i);
}
}
}
}
return (
<div>
<Header bubbleSort={animatedBubbleSort} />
<div className="array-container">
{array.map((value, idx) => {
return (
<div
style={{ height: `${value * 2}px` }}
className="array-bar"
key={idx}
></div>
);
})}
</div>
</div>
);
}
It's because you're using the index of the elements in the array as the key. React uses key
to decide which elements to rerender; because your keys are always in the same order, React won't update anything. Try:
{array.map((value) => {
return (
<div
style={{ height: `${value * 2}px` }}
className="array-bar"
key={value}
></div>
);
})}
See https://reactjs.org/docs/lists-and-keys.html#keys for more, specifically the following:
We don’t recommend using indexes for keys if the order of items may change. This can negatively impact performance and may cause issues with component state. Check out Robin Pokorny’s article for an in-depth explanation on the negative impacts of using an index as a key. If you choose not to assign an explicit key to list items then React will default to using indexes as keys.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With