Я не проверял это, потому что не смог заставить вашу ссылку работать, но я предполагаю, что это потому, что вы испытываете "асинхронные изменения состояния". Из документов: Обновления состояний могут быть асинхронными
В вашем beginSelection
вы звоните updateSelection
, но я предполагаю, что состояние выбора еще не на самом деле обновляется при запуске этого кода. Простым решением является добавление второго параметра в ваш updateSelection
let updateSelection = (i, force) => {
if (selecting || force) {
setEnd(i);
}
}
, а затем вызов updateSelection(i, true)
из beginSelection
и endSelection
, но , а не из onMouseMove
. Вы также можете позвонить setEnd
напрямую с beginSelection
и endSelection
, если это проще. Обе альтернативы должны работать, это более или менее вопрос предпочтения.