1) Object.keys() -- возвращает массив ключей объекта. [0] -- выбирает первый элемент этого массива
2) Это коллбэк, метод вызывается сразу после обновления стейта. Почитай документацию Реакта в разделе про setState и аргументы его вызова
3) Читай про деструктуризацию. Это деструктуризация аргумента, который приходит в функцию. В данном случае, стандартного объекта event. Аналогично:
onClick = event => {
const shift = event.target.dataset.shift;
...
}
4) См пункт 2
5) Потому что нужно не просто вызвать функцию по клику, а ещё и передавать ей аргумент i . Но вот конкретно такая реализация - плохая практика