Преждевременная сортировка списка в React Native - PullRequest
0 голосов
/ 20 ноября 2018

Я несколько озадачен тем, как определенный массив сортируется функцией редукса.У меня есть список сотрудников, которые мне нужно отсортировать по имени.

Например, у меня есть состояние редуктора по умолчанию:

сотрудников = [Нейт, Джон, Майкл]

На экране, где отображается этот объект, я делаю console.log, когда компонент смонтирован, и получаю:

[Нейт, Джон, Майкл]

Так вот, это становится странным.У меня есть функция onPress, которая переупорядочивает список в алфавитном порядке.Я также консоль регистрации значения списка на экране (до запуска действия), в действии (где происходит сортировка) и в редукторе.Console.log ДО запуска действий возвращает отсортированный список.

reorderList() {
  if(this.props.employees){
      console.log("SCREEN", this.props.employees);
      this.props.reorderList(this.props.employees);
  }
}

Возвращает:

ЭКРАН: [Джон, Майкл, Нейт]

Это как если бы действие происходило до console.log, но я не понимаю, как это было бы возможно, если бы я не понимал синхронность функций RN.

Вот функция внутри действия, котораясортирует список.Я поместил ту же функцию внутри редуктора, и журналы действий / экрана по-прежнему возвращают преждевременно отсортированный массив.

export const reorderList = (employees) => {
    console.log("ACTION", employees); // returns "ACTION: [John, Michael, Nate]"
    var items = employees;
    employees.sort(function(a, b){
        var nameA = a.name.toUpperCase();
        var nameB = b.name.toUpperCase();
        if (nameA < nameB) {
            return -1;
        }
        if (nameA > nameB) {
            return 1;
        }
        return 0;
    });
    return {
        type: "reorder_list",
        payload: items
    }
}

Кажется, будто я что-то неправильно понимаю в Redux?

1 Ответ

0 голосов
/ 21 ноября 2018

Скорее всего, вы являетесь свидетелем известного недостатка в JS (и других языках программирования).А именно, метод sort изменяет массив за this на месте и возвращает this.

Исправлено - скопировать массив в items и отсортировать его, оставив employees нетронутым:

const items = [...employees]
items.sort((a,b) => a.localeCompare(b) )

PS.Рекомендую поставить код сортировки в редуктор.

...