Como renderizar o elemento cada vez que o estado é atualizado

Aug 21 2020

Estou tentando construir um visualizador de classificação usando React. No momento, estou implementando o bubblesort e quero ver meu array em cada estágio do tipo.

class Sorter extends Component {
    state = {
          array: [100,4,214,55,11,22,10,33],
    }
     bubblesorter = () => {
        let arr = this.state.array
        var len = arr.length,
        i, j, stop;
            for (i=0; i < len; i++){
                    for (j=0, stop=len-i; j < stop; j++){
                        if (arr[j] > arr[j+1]){
                            swap(arr, j, j+1);
                        } 
                        this.setState({array:arr})
                    }
                }   
    }

    render() {
        const array = this.state.array
        // console.log(array)
        return (
            <div>
                <h1>This is a sorter</h1>
                <div className="container">
                    {array.map((value, id) => (
                        <span>
                            <div className="bar" key={id} style={{height: value+"px"}}  >
                            </div>
                        </span>
                    ))}
                </div>
                <button onClick={this.bubblesorter}>Sort</button>
            </div>
        )
    }

Inicialmente:

Imediatamente após clicar em "classificar":

Embora eu esteja usando setState dentro do loop para cada iteração, só vejo a matriz final classificada. Gostaria de renderizar a matriz para cada etapa da classificação (e possivelmente usando um atraso de tempo). Mas não sou capaz de implementar isso.
Alguém pode ajudar em como modificar este código para implementar tal funcionalidade ... Obrigado

Respostas

2 yash Aug 21 2020 at 20:12

Ah, na verdade ele muda (o tempo de execução é tão rápido para os olhos detectarem) e você verá se definir algum atraso em seu loop.

Por exemplo:

bubblesorter = async () => {
    let arr = this.state.array
    var len = arr.length,
        i, j, stop;
    for (i = 0; i < len; i++) {
        for (j = 0, stop = len - i; j < stop; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(arr, j, j + 1);
            }
            // Added 1 second delay here.
            await new Promise(resolve => setTimeout(resolve, 1000));
            this.setState({ array: arr })
        }
    }
}