Форум программистов, компьютерный форум, киберфорум
React/ReactJS
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 723

Хуки в нерендерных компонентах

16.06.2024, 20:32. Показов 928. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.
Подскажите, пожалуйста, вот есть функциональный компонент сокет. Т.е. рендериться он не будет.
1. useState при изменении триггерит рендеринг- а здесь не будет ничего лишнего, что создаст лишние вычисления?
2. В какой компоненте хранить например очередь? Или тот же сокет?
В примере из инета в useState хранят.
JavaScript
1
const [session, setSession] = useState(null as unkown as Websocket);
Но не очень понятно: вот даже сокет - у него есть методы. И хз что там внутри. Может какой-то метод меняет сокет внутри, пишет свою информацию. Просто читаю, что state неизменяемый, меняется между рендерингами.
Ну и очередь - в нее добавляются и извлекаются элементы, т.е. меняется.
Сейчас думаю сокет в useState, а очередь в useRef.
Можно просто рассматривать для компонент без рендеринга useState как const, а useRef как let?
p.s. Нажал отправить и только заметил - надо было тему в react раздел.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.06.2024, 20:32
Ответы с готовыми решениями:

Хуки
Всем привет. Есть задача следующего рода Написать хуки для SVN. Pre-commit: проверяет формат комментария. Формат комментария...

Хуки
Добрый день! Не могу найти нормальной инфы про хуки. Совершенно ничего, только громоздкие примеры практически без пояснений. Может есть...

Хуки
Доброго времени суток. Господа, объясните мне темному и недалекому как использовать хуки. Вроде бы есть функция SetWindowsHookEx которая...

5
Эксперт JSЭксперт HTML/CSS
 Аватар для krvsa
3827 / 1664 / 429
Регистрация: 14.03.2022
Сообщений: 4,191
16.06.2024, 22:03
AndrSlav, что-то мне кажется, что у тебя в голове какая-то каша...

Начинай делать какие-то тестовые примеры. Так будет понятнее чего ты там мутишь.
Тебе ведь в соседней теме примеры привели... Видос обучающий показали...
0
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 723
17.06.2024, 15:08  [ТС]
Цитата Сообщение от krvsa Посмотреть сообщение
Начинай делать какие-то тестовые примеры. Так будет понятнее чего ты там мутишь.
Я вот и делаю, но постоянно непонятки.
Вот иначе вопрос сформулирую.
JavaScript
1
const [state, setState] = useState({a: "qwe"})
Функциональная компонента может рендериться, а может нет.
В случае рендеринга понятно, что при setState рендеринг. Здесь OK, понятно.
Но вот если без рендеринга.
JavaScript
1
const [state, setState] = useState([])
Вот я делаю state.push(9) - пушится как в обычный массив и сохраняется.
Так без рендеринга можно просто использовать state без setState?
Не понятны границы этого.
0
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,147
Записей в блоге: 14
17.06.2024, 15:53
Цитата Сообщение от AndrSlav Посмотреть сообщение
Вот я делаю state.push(9) - пушится как в обычный массив и сохраняется.
Так без рендеринга можно просто использовать state без setState?
это неправильное использование стейта, стейты как раз нужны чтобы их изменение вызывало перерисовку, т.е. менять с помощью специальной функции set и в случае ссылочных типов данных instanceof Object создавать новый instance объекта(immutable state), если нужно что-то хранить в переменной между рендерами, и менять эту переменную так чтобы не вызывать рендеры, используйте ref
1
71 / 59 / 14
Регистрация: 20.12.2013
Сообщений: 723
17.06.2024, 16:27  [ТС]
Цитата Сообщение от mr_dramm Посмотреть сообщение
стейты как раз нужны чтобы их изменение вызывало перерисовку
Так я же это все и написал.
Но в примере из инета вполне себе сохраняют сокет в useState, например. Я вот не знаю изменяется ли он или нет внутри, как влияют объявления коллбэков. Почему-то не в useRef сделано. Если компонент и его children не ренерятся, то вроде как без разницы получается внешне. Я видел все эти рекомендации, но useRef ведь тоже предполагает возможность передавать ссылку, т.е. в нагрузку под капотом что-то добавляется наверняка.
У useState еще плюс, что сразу есть сеттер, который можно выставить для доступа извне.

Добавлено через 20 минут
Пример из инета
Хотя здесь сокет сохраняется сеттером.
Но потом к объекту описываются коллбэки.
И вот как к этому относиться не очень понятно.
Почему не в useRef?
Или мы сам объект по сути напрямую не изменяем объявлением коллбэков?
Или правильнее сокет здесь сохранять в useRef?
0
Молодой техлид)
Эксперт JSЭксперт HTML/CSS
 Аватар для mr_dramm
1818 / 1056 / 329
Регистрация: 17.07.2021
Сообщений: 2,147
Записей в блоге: 14
17.06.2024, 21:53
Цитата Сообщение от AndrSlav Посмотреть сообщение
Хотя здесь сокет сохраняется сеттером.
Но потом к объекту описываются коллбэки.
И вот как к этому относиться не очень понятно.
автор использует стейт чтобы сначала удалить старые и добавить новые обработчики, так работает useEffect

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
useSession(
  onOpen: SessionConnectHandler,
  onMessage: SessionMessageHnalder,
  onClose: SessionDisconnectHandler
)
...
const [session, setSession] = useState(null as unkown as Websocket);
// ...
  const updateMessageHandler = () => {
    if (!session) return;
    session.addEventListener('message', onMessage);
    return () => {
      session.removeEventListener('message', onMessage);
    };
  };
//...
  useEffect(updateMessageHandler, [session, onMessage]);
Добавлено через 16 минут
Цитата Сообщение от AndrSlav Посмотреть сообщение
Или мы сам объект по сути напрямую не изменяем объявлением коллбэков?
стейт поменяется когда будет вызвана функция connect
JavaScript
1
2
3
4
5
6
7
8
9
10
  const connect = useCallback(
    (gameCode: string, name: string | null, playerId?: string) => {
      const uri = `${process.env.REACT_APP_SERVER_WS}?code=${gameCode}&${
        playerId ? `id=${playerId}` : `name=${name}`
      }`;
      const ws = new WebSocket(uri);
      setSession(ws);
    },
    []
  );
Цитата Сообщение от AndrSlav Посмотреть сообщение
Почему не в useRef? Или правильнее сокет здесь сохранять в useRef?
можно и через реф, еще можно сокет вынести за пределы хука если планируется использовать не больше одного соединения в приложении.

es модуль socket.js

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let socket = null 
export function useSession(onOpen, onMessage, onClose){
    const connect = useCallback((uri) => {
        if(socket ) {
           socket.removeEventListener('open', onOpen);
            socket.removeEventListener('message', onMessage);
            socket.removeEventListener('close', onClose);
            socket.close(1001)
            socket = null
        }
        socket = new WebSocket(uri);
        socket.addEventListener('open', onOpen);
        socket.addEventListener('message', onMessage);
        socket.addEventListener('close', onClose);
    }, [])
...
    return [connect, sendMessage, close];
}
это короче чем это

JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
export function useSession(
  onOpen: SessionConnectHandler,
  onMessage: SessionMessageHnalder,
  onClose: SessionDisconnectHandler
): SessionHook {
  const [session, setSession] = useState(null as unknown as WebSocket);
 
  const updateOpenHandler = () => {
    if (!session) return;
    session.addEventListener('open', onOpen);
    return () => {
      session.removeEventListener('open', onOpen);
    };
  };
 
  const updateMessageHandler = () => {
    if (!session) return;
    session.addEventListener('message', onMessage);
    return () => {
      session.removeEventListener('message', onMessage);
    };
  };
 
  const updateCloseHandler = () => {
    if (!session) return;
    session.addEventListener('close', onClose);
    return () => {
      session.removeEventListener('close', onClose);
    };
  };
 
  useEffect(updateOpenHandler, [session, onOpen]);
  useEffect(updateMessageHandler, [session, onMessage]);
  useEffect(updateCloseHandler, [session, onClose]);
 
  const connect = useCallback(
    (gameCode: string, name: string | null, playerId?: string) => {
      const uri = `${process.env.REACT_APP_SERVER_WS}?code=${gameCode}&${
        playerId ? `id=${playerId}` : `name=${name}`
      }`;
      const ws = new WebSocket(uri);
      setSession(ws);
    },
    []
  );
...
  return [connect, sendMessage, close];
}
просто некоторые слишком увлекаются фишками реакта, и забывают про js

кстати полный код можно посмотреть тут
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.06.2024, 21:53
Помогаю со студенческими работами здесь

Хуки
Здравствуйте. Возникла небольшая проблема, но что-то не соображу что я делаю не так. Буду благодарен за совет. Велосипедаю небольшую...

Хуки
Есть приложение, которые собирает все что нажимается на клаве. Сниффается все отлично, есть вывод в текстовый файл в формате: ___________...

Хуки мыши
Такая проблема, пытаюсь написать хук для мыши, вроде событие отлавливается, библиотека отлично подключается, но функция которая должна...

И снова хуки
Доброго времени суток ребят!Разбираюсь в реализации кейлоггера. Реально до последнего пытался сам разобраться и как считаю во многом...

Хуки, Windows
Хочу спросить по данным функциям: SetWindowsHookEx, SetWindowsHook. Что они делают вы должны знать. Хочу спросить у тех кто писал программы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru