@vaskadogana
Frontend developer

Почему не обновляется props после unshift и dispatch?

есть такой код,
.then(function answer(answer){
        	let clients_info = answer.data;
        	<b>currentList.unshift(clients_info);</b>
        	store.dispatch({
        		type: 'GET_clients',
        		setAdminData: currentList
			})
    })

store обновляется однако рендера не происходит. (новые пропсы неприходят)
Если ставлю переменную без unshift, то рендер происходит.
например вот так
.then(function answer(answer){
        	let <b>clients_info</b> = answer.data;
        	currentList.unshift(clients_info);

        	store.dispatch({
        		type: 'GET_clients',
        		setAdminData: clients_info
			})
    })

Отсюда делаю вывод, что проблема не в конектах и т.п. А в массиве который возвращается из этой строки
currentList.unshift(clients_info);
визуально массив стал на элемент больше. Взял текущее состояние, добавил в начало массива элемент. сделал диспатч нового массива. Однако рендера не происходит.
Кто нибудь сталкивался?
  • Вопрос задан
  • 250 просмотров
Решения вопроса 1
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Взял текущее состояние, добавил в начало массива элемент. сделал диспатч нового массива.

Здесь кроется главная ошибка, вы "сделали диспатч", того же самого массива. Почему он стал новым? Не правда.

Т.е. вы возвращаете тот же самый объект (в js объекты передаются по ссылке), для react вьюхи ничего не изменилось, значит render вызывать не надо => ничего не происходит.

Попробуйте возвращать новый(!) массив, в вашем случае это:
setAdminData: [clients_info, ...currentList]

Либо чуточку понятнее, но вставляя в конец массива:
setAdminData: currentList.concat(clients_info)

Метод concat всегда возвращает новый массив.

Ну и чтобы стало совсем понятно в чем дело, попробуйте в консоли выполнить следующий код:
let arr1 = [1,2,3,4]
let arr2 = arr1
arr2.unshift(1)
console.log(arr1)

Вопросы: чему равен arr1? Почему? Будет ли arr1 === arr2, почему?
Еще вопросы: В каком случае react вызывает функцию render?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы