Все дело в замыкании. Переданная в setInterval функция замыкает в себе переменную seconds в значении ноль. Интервал работает, но при каждом следующем вызове функции переменная seconds имеет прежнее значение.
В setSeconds нужно передать функцию, которая будет вызвана с актуальным значением seconds.
Вот так:
function App() {
const [ seconds, setSeconds ] = React.useState(0)
// старый вариант, не работает
const startTimer = () => {
setInterval(() => {
setSeconds(seconds + 1)
}, 1000)
}
// новый вариант, работает
const startTimer = () => {
setInterval(() => {
setSeconds((seconds) => {
return seconds + 1
})
}, 1000)
}
return (
<div>
<button onClick={startTimer}>start</button>
<h1>{seconds}</h1>
</div>
)
}