При том, как ваш код написан в настоящее время, myArray
- это отдельный экземпляр пустого массива в каждом рендере. Это означает, что эффект всегда запускается, так как зависимости всегда менялись!
Это может показаться странным, но рассмотрим следующий фрагмент кода:
const a = [];
const b = [];
console.log(a === b); // false
Простейшим решением этой проблемы было бы либо перенести запасную логику в эффект:
const MyComponent = ({ myArray }) => {
console.log("infinite rendering");
const [prop, setProp] = useState([]);
useEffect(
() => {
setProp(myArray ? myArray.map(x => x + 1) : []);
},
[myArray]
);
return <div />;
};
Или убедитесь, что один и тот же пустой массив всегда используется по умолчанию:
const empty = [];
const MyComponent = ({ myArray = empty }) => {
console.log("infinite rendering");
const [prop, setProp] = useState([]);
useEffect(
() => {
setProp(myArray.map(x => x + 1));
},
[myArray]
);
return <div />;
};