Мне пришлось реализовать нечто подобное, я начинаю с инициализации переменной с именем isMounted
.
Устанавливается на true
, когда компонент монтируется, и false
, когда компонент монтируется.
Перед вызовом setImgDimens
необходимо проверить, смонтирован ли компонент. Если нет, она не будет вызывать функцию и, следовательно, не будет обновлять состояние.
const SomeComponent = (props) => {
const isMounted = React.createRef(null);
useEffect(() => {
// Component has mounted
isMounted.current = true;
if(isMounted.current) {
setImgDimens(arr);
}
return () => {
// Component will unmount
isMounted.current = false;
}
}, []);
}
Редактировать : это ответ, который работал для меня, но для чего он Стоит, мне пришлось переместить переменную isMounted
в вне функции SomeComponent
, чтобы она работала Кроме того, вы можете просто использовать обычную переменную вместо createRef
для создания ссылки и т. Д. c.
В принципе, для меня сработало следующее:
let isMounted;
const SomeComponent = (props) => {
const setImgDimens = (arr) => {
arr.forEach((arrItem, i) => {
if (arrItem.imgPath) {
const uri = `/path/to/${arrItem.imgPath}`;
Image.getSize(uri, (width, height) => {
if (isMounted) { // Added this check.
setArr((currArr) => {
const newWidth = imgWidth;
const ratio = newWidth / width;
const newHeight = ratio * height;
currArr = currArr.map((arrItem, idx) => {
if (idx === i) {
arrItem.width = newWidth;
arrItem.height = newHeight;
}
return arrItem;
});
return currArr;
});
}
});
}
});
};
useEffect(() => {
isMounted = true;
setImgDimens(arr);
return () => {
isMounted = false;
}
}, []);
};