微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据对状态数组变量的更改在 React 中重新渲染

如何解决如何根据对状态数组变量的更改在 React 中重新渲染

我正在尝试构建一个类似于以下内容的排序可视化工具:https://clementmihailescu.github.io/Sorting-Visualizer/ 使用 React。

为了在合并排序算法中的每一步处理更新画布,我尝试使用状态变量 yHeights(对应于每行的高度,进行排序)并在每次调用期间更新此变量的状态归并排序()。

但是,我遇到了一个无限循环,我相信是因为我没有保持 render() 方法“纯” - 比如,我在渲染方法期间更新状态。

如何重构此代码以在每次调用 mergesort() 期间正确更新画布绘图?我想我可以使用 getDerivedStateFromProps 来做到这一点,但我很难理解和实施使用 documentation

代码

//App.js
import logo from './logo.svg';
import './App.css';
import Controls from './Controls';
import Canvas from './Canvas';
import {useState} from 'react'

var xPositions = []

function getRandomInt(max) {
  return Math.floor(Math.random() * max);
}


function App() {

  const [yHeights,setyHeights] = useState([])

  function merge(left,right) {
    let sortedArr = []; // the sorted elements will go here
  
    while (left.length && right.length) {
      // insert the smallest element to the sortedArr
      if (left[0] < right[0]) {
        sortedArr.push(left.shift());
      } else {
        sortedArr.push(right.shift());
      }
    }
  
    // use spread operator and create a new array,combining the three arrays
    return [...sortedArr,...left,...right];
  }

  function mergeSort(arr) {
    setyHeights([arr])
    const half = arr.length / 2;
  
    // the base case is array length <=1
    if (arr.length <= 1) {
      return arr;
    }
  
    const left = arr.splice(0,half); // the first half of the array
    const right = arr;
    return merge(mergeSort(left),mergeSort(right));
  }

  const draw = context => {

  var arrHeights = []
  
  context.fillStyle = "rgb(0,0)";
  for (var i = 0; i < 100; i+=1) {
    const height = getRandomInt(500) 
    context.fillRect(i * 10,10,height);
    xPositions.push(i*10);
    arrHeights.push(height)
  }

  setyHeights(arrHeights);

  console.log(yHeights)

};

  return (
    <div className="App">
      <Controls />
      <Canvas draw={draw} numLines={100} />
    </div>
  );
}

export default App;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。