Выпуск анимации пользовательского интерфейса на основе изменений состояния редуктора - PullRequest
0 голосов
/ 07 октября 2019

Я строю react проект для визуализации insertion sort с использованием redux. Я использую react-redux для создания и обработки actions. Однако проблема в том, что в моем алгоритме insertionSort я отправляю действие updateArray каждый раз, когда изменяется сортируемая array. Я поместил print операторы внутри редуктора и увидел, что состояние фактически изменилось и действие было отправлено правильно, однако мой фактический array не рендерится повторно. Я поместил prints внутри функции render() соответствующего компонента пользовательского интерфейса и увидел, что он вызывается только один или два раза, а не каждый раз, когда редуктор получает действие. Я несколько раз пытался реструктурировать свой код и читал о похожих проблемах, которые были у людей, но их ответы мне не помогли.

Я просто структурировал это неправильно? Разве я не должен использовать диспетчеризацию каждую секунду или около того для обновления моего массива?

У меня есть файл main.js, который используется для визуализации компонентов пользовательского интерфейса, включая мой массив:

class Main extends React.Component {
     setArray = () => {
         this.props.setArray(50, window.innerHeight / 1.4)
     startSort = () => {
         this.props.startSorting(this.props.algorithm, this.props.array)
     }
     render() {
         let { array} = this.props
         return (
             <div>
                 <Navbar
                     startSort={this.startSort}
                     setArray={this.setArray}
                 />
                 <MainWrapper>
                     <Row />
                 </MainWrapper>
             </div>
              )
          }
      }
 const mapStateToProps = state => {
    return {
         array: state.array,
      }
  }

 const mapDispatchToProps = dispatch => {
     return {
         setArray: (length, height) => {
              let array = Array.from({ length: length }, () =>
              Math.floor(Math.random() * height))
              dispatch(setArray(array))
         },
         startSorting: (algorithm, array) => {
              var doSort
              if (algorithm == 'insertionSort') {
                  doSort = insertionSort
               }
              doSort(array, dispatch)
       }
     }
  }

Мой фактический массив генерируется с помощью Row.js

class Row extends React.Component {
    generateNodes(array) {
        var elements = []
        array.forEach((value, index) => {
            elements.push(
                <CenteredColumn>
                    <ArrayNode idx={index} value={value} />
                </CenteredColumn>
            )
        })
        return elements
        }
    render() {
        let { array } = this.props
        console.log('UPDATED ARRAY: ' + array)
        var arrayElements = this.generateNodes(array)
        return <RowWrapper>{arrayElements}</RowWrapper>
    }
}

const mapStateToProps = state => {
    return {
        array: state.array
    }
}

И, наконец, мой фактический алгоритм находится в insertionSort.js, в который я импортирую свои действия изих редукторы и передать в диспетчерскую функцию от main.js:

function delayedInsertion(array, dispatch) {
let n = array.length
var i = 0
function loop() {
    setTimeout(function() {
        var temp = array[i]
        var j = i - 1
        while (j >= 0 && array[j] > temp) {
            array[j + 1] = array[j]
            j--
        }
        array[j + 1] = temp
        // console.log('ARRAY: ' + array)
        dispatch(updateArray(array))
        i++
        if (i < n) {
            loop()
        }
    }, 200)
}
loop()
console.log('DONE')
}

1 Ответ

0 голосов
/ 11 октября 2019

Кажется, что вы изменяете свое состояние.

Вы передаете this.props.array своему действию doSort, и, как я правильно понимаю вашу идею, вы просто вызываете delayedInsertion из этого действия (выне опубликовал исходный код этого действия). Но в delayedInsertion вы изменяете переданный массив, когда меняете позиции своих элементов, здесь:

while (j >= 0 && array[j] > temp) {
   array[j + 1] = array[j]
   j--
}
array[j + 1] = temp

Вам необходимо выполнить неизменное изменение массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...