Как обработчик события ref в реакции сохраняется между рендерингами?

В ответ, если у вас есть ссылка, и вы прикрепляете событие DOM, используя

ref.current.onclick = eventHandler

Я понимаю, что response гарантирует, что ref будет содержать ссылку на элемент DOM, но как обработчик событий на узле DOM сохраняется между повторными отрисовками, когда узел DOM может измениться.

Думаю, это издевается над поведением document.getElementById('bla').addEventListener(...). Изменяющейся частью будет в основном контент внутри этого элемента dom.

Sinan Yaman 07.04.2021 08:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
36
2

Ответы 2

Потому что при каждом повторном рендеринге React регенерирует обработчик и присоединяет его к новому узлу DOM.

Вы бы написали такой компонент:

export default function App() {
  return (
    <button
      onClick = {(e) => {
        console.info(e.target);
      }}
    >
      button
    </button>
  );
}

И каждый повторный рендеринг может заставить React выполнить что-то вроде этого:

// Call `App` as a funtion
// Every thing inside the `App` funtion body will be executed again
// So you get a new onClick handler inside the funtion which will be attach to the new DOM node
const element = App();

render(element);

Что касается Ref, то он похож. Когда вы вызываете useRef, вы получаете такой объект: { current: null }

// `ref` is passing to the component on every re-render
// `ref` object dose not change on every re-render, but it's property `current` will be assigned with the new DOM node.
<button ref = {ref}>button</button>

Это чрезвычайно упрощенный код, который не отражает того, как на самом деле работает React, но в нем есть смысл.

Я думаю, что ваша точка зрения верна для обработчиков в реквизите .. но я говорил даже о прикреплении к ref.current, как упоминалось в вопросе

ashish singh 07.04.2021 08:50

Вроде недоразумение. Когда узел DOM изменяется, ваш обработчик событий не сохраняется. Это ответственность только вашего кода. Но узел DOM не меняется с каждым рендером. React сравнивает возвращенный результат с предыдущим и решает, какие узлы DOM необходимо заменить.

Если вы хотите использовать собственное событие, вы должны обязательно подключать и отсоединять обработчик событий при каждом изменении узла.

const rootChanged = useCallback(element => element.addEventListener(type, listener),[]);

// ...

<div ref = {rootChanged} key = {someVolatileKey}>
  // ...
</div>

Когда key изменится, например, React создаст новый узел для корневого элемента.

Другие вопросы по теме