169 похожих чатов

Привет всем! Есть функция что убирает последний эллемент массива в

стейте 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 почему то не стригерился на изменения ). Как это можно исправить?

31 ответов

10 просмотров

ты не передал ему зависимость - поэтому он работает как аналог componentDidMount

Пользователь-610f4 Автор вопроса

В том что DrawLines() рабочий, я уверен

просто повесь обработчик на нужный елемент без useEff

Пользователь-610f4 Автор вопроса

Так у меня ctrl z и так без рефа обрабатывает, а на весь document, или я не так понля?

Пользователь-610f4 Автор вопроса

useEffect(() => { document.addEventListener("keydown", CtrlZFunc, false); return () => { document.removeEventListener("keydown", CtrlZFunc, false); }; }, [walls]) Вот так его обрабатывает

Пользователь-610f4 Автор вопроса

В том что эта часть работает — я уверен

попробуй просто walls.pop();

Пользователь-610f4 Автор вопроса

Пробовал. Та же фигня. Тут почему то он думает что стейт не изменился

Пользователь-610f4 Автор вопроса

Хотя по факту это не так

Пользователь-610f4 Автор вопроса

Он тут в теоррии 2 раза изменился

Пользователь-610f4 Автор вопроса

И через фильтер пробовал

а зачем ты сетиш пустой массив ?

Пользователь-610f4 Автор вопроса

Что б эффект отработал. Но ему почему то пофиг

просто попробуй setWals(walls.pop()), без return и []

Пользователь-610f4 Автор вопроса

walls.pop() если что возвращает удалённое значение из массива. Это даже в теоррии работать не будет. А так через pop я пробовал делать

Точняк

Пользователь-610f4 Автор вопроса

А может быть такое что эффект не тригериться именно из за того что это всё в каллбэк обёрнуто как то?

Нет

Пользователь-610f4 Автор вопроса

Блин, тогда у меня все идеи закончились :(

Если происходит рендер, а эффект не спрабатывает - значит зависимости не поменялись, все просто

Пользователь-610f4 Автор вопроса

Но если добавить эллемент в массив, то useEffect отрабатывает и можно видеть, что тот эллемент который должен был удалиться — удалился.

Пользователь-610f4 Автор вопроса

🤯

setWalls(walls => [...walls].slice(0, walls.length - 1) если ещё актуально slice мутирует

Пользователь-610f4 Автор вопроса

Актуально, спасибо, сейчс попробую)

[...walls] не нужно. slice не мутирует

да, я перепутал

setWalls(walls => walls.slice(0, walls.length - 1)

Пользователь-610f4 Автор вопроса

Спасибки, коротко и почти работает. Только эффект почему то так и не отработал

а покажи код юзефеект в зависимости кинул?

эффект должен отрабатывать на каждый рендер(если хотя бы deps не пустой масиив)

Пользователь-610f4 Автор вопроса

useEffect(() => { DrawLines() }, [walls])

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта