стейте walls
const CtrlZFunc = useCallback((event) => {
if(event.ctrlKey && (event.which === 90 || event.keyCode === 90)) {
const lastEl = walls.length - 1
const tempArr = walls.slice(0, lastEl)
setWalls([])
return setWalls(walls => tempArr)
}
}, []);
Она как бы работает и эллемент действительно удаляется, вот только есть проблема с ним. Эллемент хоть и удалился, но useEffect у которого этот стэйт в зависимостях прописан — не отработал (если добавить эллемент в массив, то видно что эта функция отработала, просто useEffect почему то не стригерился на изменения ). Как это можно исправить?
ты не передал ему зависимость - поэтому он работает как аналог componentDidMount
В том что DrawLines() рабочий, я уверен
просто повесь обработчик на нужный елемент без useEff
Так у меня ctrl z и так без рефа обрабатывает, а на весь document, или я не так понля?
useEffect(() => { document.addEventListener("keydown", CtrlZFunc, false); return () => { document.removeEventListener("keydown", CtrlZFunc, false); }; }, [walls]) Вот так его обрабатывает
В том что эта часть работает — я уверен
попробуй просто walls.pop();
Пробовал. Та же фигня. Тут почему то он думает что стейт не изменился
Хотя по факту это не так
Он тут в теоррии 2 раза изменился
И через фильтер пробовал
а зачем ты сетиш пустой массив ?
Что б эффект отработал. Но ему почему то пофиг
просто попробуй setWals(walls.pop()), без return и []
walls.pop() если что возвращает удалённое значение из массива. Это даже в теоррии работать не будет. А так через pop я пробовал делать
Точняк
А может быть такое что эффект не тригериться именно из за того что это всё в каллбэк обёрнуто как то?
Блин, тогда у меня все идеи закончились :(
Если происходит рендер, а эффект не спрабатывает - значит зависимости не поменялись, все просто
Но если добавить эллемент в массив, то useEffect отрабатывает и можно видеть, что тот эллемент который должен был удалиться — удалился.
🤯
setWalls(walls => [...walls].slice(0, walls.length - 1) если ещё актуально slice мутирует
Актуально, спасибо, сейчс попробую)
[...walls] не нужно. slice не мутирует
да, я перепутал
setWalls(walls => walls.slice(0, walls.length - 1)
Спасибки, коротко и почти работает. Только эффект почему то так и не отработал
а покажи код юзефеект в зависимости кинул?
эффект должен отрабатывать на каждый рендер(если хотя бы deps не пустой масиив)
useEffect(() => { DrawLines() }, [walls])
Обсуждают сегодня