Кнопка в ReactJS вызывает функцию только после второго нажатия, никакого эффекта после первого нажатия

#javascript #reactjs

#javascript #reactjs

Вопрос:

Я создаю простое приложение для визуализации алгоритмов сортировки в ReactJS. Вот моя функция:

 const [HeightsArray, setHeightsArray] = useState([]);
const [Array, setArray] = useState(ArrayList(HeightsArray));
  
  const randomize = ()=>{
    const randomList = RandomHeightsList(ArrayLength);
    setHeightsArray(randomList);
    setArray(ArrayList(HeightsArray));
}
  

Функция RandomHeightsList просто возвращает массив случайных чисел.

 const RandomHeightList = (ArrayLength)=>{
    let randomHeightsArray = [];
    while (randomHeightsArray.length<ArrayLength){
        let randomHeight = Math.round(Math.random()*350);
        randomHeightsArray.push(randomHeight);
    }
    return randomHeightsArray;
  

Функция ArrayList создает массив элементов (divs), где каждый элемент имеет соответствующую высоту из заданного массива высот, как показано ниже:

 const ArrayList = (heightsArray) => {
    let array = [];
    for (let i=0; i<heightsArray.length; i  ){
        array.push(ArrayElement(heightsArray[i]));
    }
    return (
        <div className="array-list">
            {array}
        </div>
    )
}
  

Наконец, элемент массива — это просто div с некоторой высотой.

 const ArrayElement = (height) => {
    const baseTop = 300;
    let top = baseTop-height;
    let styleObject = {height: height, top: top};
    return (
        <div className="array-element" style={styleObject}>
        </div>
    )
}
  

Теперь вот моя простая кнопка:

 <button className="randomize-button" onClick={randomize}>Randomize</button>
  

Когда я нажимаю кнопку в первый раз, ничего не происходит, массив не рандомизируется. Однако после этого она работает хорошо. Если я нажимаю кнопку во второй раз, она становится случайной. Если я нажимаю на нее в третий раз, она снова рандомизируется, как и должно быть. Это не имеет никакого эффекта в первый раз. Любая помощь была бы оценена.

Комментарии:

1. Откуда вы получаете ArrayList и что он делает? Кроме того, как вы отображаете выходные данные?

2. Спасибо за вопрос, я отредактировал вопрос, чтобы предоставить дополнительные спецификации. Выходные данные отображаются в виде одной единственной строки divs на html-странице, где каждый div имеет некоторую высоту, соответствующую компоненту ArrayElement

Ответ №1:

Проблема в этих строках в вашей randomize функции:

 setHeightsArray(randomList);
setArray(ArrayList(HeightsArray));
  

Вы устанавливаете значение HeightsArray и используете его сразу, но оно не будет обновлено до следующего рендеринга.
Итак, вам нужно изменить вторую строку на:

 setArray(ArrayList(randomList));