1. Нашёл ошибку в функции addItem: отправлять в localStorage здесь следует элемент item, а не массив, конечно.
2. Однозначно, здесь можно использовать мощный хук useEffect. Однако, поскольку вопрос касался именно window.onload, оставлю здесь решение.
При перезагрузке страницы копировать массив items не нужно и бессмысленно. Необходимо объявить пустой массив
const storageItems = []
и добавить в него всё, что есть в localStorage:
for (let i = 0; i < localStorage.length; i++) {
storageItems.push(JSON.parse(localStorage.getItem(localStorage.key(i))));
}
и затем передать массив в state:
setItems(items);