Единственная цель useEffect состоит в том, что он добавляет слушателя, когда компонент монтирует, и удаляет его, когда компонент размонтируется
Состояние постоянно обновляется, потому что вы добавили EventListener в DOM, который будет постоянно слушать событие, которое здесь "изменение размера", и пока событие запускается, оно будет обновлять функцию обратного вызова,