简体   繁体   English

无法在 React.js 中使用 useState 进行渲染

[英]Unable to render using useState in React.js

I am using reactjs to create a sorting algorithm visualizer.After the function bubblesort is called, useState updates the list thus triggering a re-render.But the new list is not injected to the dom.我正在使用 reactjs 创建排序算法可视化工具。在调用 function 冒泡排序后,useState 更新列表,从而触发重新渲染。但新列表未注入 dom。 The implementation is done using (functional components) and some hooks.实现是使用(功能组件)和一些钩子完成的。 -A newbie in react - 一个新手在反应

Below is the code snippet下面是代码片段

import React, { useEffect, useState } from 'react';


const ArrayBars = ()=>{

const [list, setlist] = useState([]);


function BubbleSort(){
    let arr=list
    for(var i=0;i<arr.length-1;i++){
        for(var j=i+1;j<arr.length;j++){
            if(arr[i] > arr[j]){
                let temp = arr[i];
                arr[i]=arr[j];
                arr[j]=temp;
            }
        }
    }
    setlist(arr)
}


    // Generate an array:
    function generatearray(){
        const sliderValue=document.getElementById('slide').value;
        const arr = []
        for(let i=0;i<sliderValue;i++){
            const Bar_height = Math.floor(Math.random() * (760 - 400 + 1) ) + 400;
            arr.push(Bar_height);
        }
        setlist(arr);
    }

    return(
        <div>
            <div className="header mt-4 p-3 mb-3">
                <div className="slider">
                    <label>array Size :</label>
                    <input type="range" min="10" max="100" id="slide" ></input>
                    <button type="button" className="btn btn-success" onClick={generatearray}>Generate array</button>
                </div>
                <div className="btns">
                    <button type="button" className="btn btn-outline-info p-3" onClick={BubbleSort}>Bubble Sort</button>
                    <button type="button" className="btn btn-outline-info p-3">Selection Sort</button>
                    <button type="button" className="btn btn-outline-info p-3">Insertion Sort</button>
                    <button type="button" className="btn btn-outline-info p-3">Merge Sort</button>
                    <button type="button" className="btn btn-outline-info p-3">Quick Sort</button>
                </div>
            </div>
            <div className="array px-5 d-flex justify-content-center">
                {                   
                    list.map((height,idx)=>{
                        return(
                            <div id={idx} className="bars" style={{height:`${height}px`}}></div>
                        )
                    })
                }

            </div>
        </div>
    )
}

export default ArrayBars;

You are mutating the list state object and saving it back into state, so the list array reference never changes and React bails on rerendering.您正在改变list state object 并将其保存回 state,因此list数组引用永远不会更改,并且 React 会在重新渲染时保释。

Shallow copy it first, then update it.先浅拷贝,再更新。

function BubbleSort(){
    let arr = [...list]; // <-- shallow copy state array
    for (let i = 0; i < arr.length - 1; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] > arr[j]) {
                let temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
    setlist(arr)
}

Fun fact: You can swap two array elements in a single line using array destructuring assignment.有趣的事实:您可以使用数组解构赋值在一行中交换两个数组元素。

[arr[j], arr[i]] = [arr[i], arr[j]];

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM