#javascript #reactjs
#javascript #reactjs
Вопрос:
У меня есть функциональный компонент, в котором я запускаю эту функцию при нажатии кнопки:
const dineroAsignado = parseFloat((dependencia.porcentaje_asignado * presupuesto.cantidadPresupuesto / 100).toFixed(2)) 1000;
const centrosTrabajo = dependencias;
const index = centrosTrabajo.findIndex(ct => ct.id_centro_trabajo === dependencia.id_centro_trabajo);
centrosTrabajo[index].porcentaje_asignado = dineroAsignado * 100 / presupuesto.cantidadPresupuesto;
setDependencias(centrosTrabajo);
Все работает нормально, но компонент не выполняет повторный рендеринг при обновлении.
Я не могу понять, почему.
Не могли бы вы мне помочь? Спасибо!
Комментарии:
1. Мы обновляем состояние с
setState()
помощью , и это то, что обычно вызывает повторныйrender
рендеринг. Я не вижу, чтобы это вызывалось?2. Это функциональный компонент. setState — это последняя строка, setDependencias(centrosTrabajo).
3. ‘где я запускаю эту функцию при нажатии кнопки:’ — это не функция. пожалуйста, покажите полную функцию
Ответ №1:
Проблема
Вы изменяете ссылку на состояние вместо того, чтобы создавать новую и обновлять ее.
const centrosTrabajo = dependencias; // <-- state reference
const index = centrosTrabajo.findIndex(
(ct) => ct.id_centro_trabajo === dependencia.id_centro_trabajo
);
centrosTrabajo[index].porcentaje_asignado =
(dineroAsignado * 100) / presupuesto.cantidadPresupuesto; // <-- mutation!!
setDependencias(centrosTrabajo); // saved reference back in state
Решение
Создайте новую ссылку на массив для состояния. Самый простой способ — сначала скопировать массив. Вы также должны мелко скопировать элемент в новую ссылку на объект.
const centrosTrabajo = [...dependencias]; // <-- create new array reference
const index = centrosTrabajo.findIndex(
(ct) => ct.id_centro_trabajo === dependencia.id_centro_trabajo
);
centrosTrabajo[index] = { // <-- create new object and copy existing
...centrosTrabajo[index],
porcentaje_asignado: (dineroAsignado * 100) / presupuesto.cantidadPresupuesto,
};
setDependencias(centrosTrabajo); // <-- update state with new reference