Встречный вопрос: почему вы решили, что должно быть иначе? Код, который бы доставал данные из localStorage и клал их в todos, где он, почему его нет? Должен быть, например:
const [ todos, setTodos ] = useState(() => {
let todos = null;
try {
todos = JSON.parse(localStorage.getItem('todos'));
} catch (e) {};
return Array.isArray(todos) ? todos : [];
});
Уверен, здесь вы ждёте, что добавляемый объект окажется в localStorage:
setTodos([
...todos,
{
id: Date.now(),
complete: false,
title: value,
},
]);
localStorage.setItem("todos", JSON.stringify(todos));
Этого происходить не будет (ну, пока ещё что-то не добавите, и это "ещё что-то" тоже попадёт в localStorage не сразу). Вы не понимаете, что происходит при вызове setTodos. Откройте документацию и разберитесь. Сохранение в localStorage следует делать через useEffect:
useEffect(() => {
localStorage.setItem('todos', JSON.stringify(todos));
}, [ todos ]);