Реагировать - манипулировать DOM или использовать состояние?

Это скорее «теоретический» вопрос, который часто ставит меня в тупик в разных ситуациях и вариантах использования, я приведу простой пример, чтобы продемонстрировать это.

Допустим, у меня есть список из 10 кнопок. Каждый раз, когда я нажимаю кнопку, поверх нажатой кнопки появляется плавающее меню - в любой момент времени видно только одно меню. Предположим, что я не могу отобразить это плавающее меню внутри компонента кнопки, и я могу отобразить его только на родительском уровне кнопок (это означает, что это меню родственно этим кнопкам).

У меня есть 2 возможных варианта сделать это:

  1. Сохраняйте позицию x, y последней нажатой кнопки и отображайте меню в этой заданной позиции.
  2. Отобразите меню один раз и используйте «ref», чтобы напрямую переместить меню.

С одной стороны, первый подход кажется более «реактивным». С другой стороны, возможная реализация, о которой я могу думать, довольно уродлива (захват позиции выбранного элемента и сохранение ее в состояние, которое запускает защитник), и, более того, я не так уверен в повторном рендеринге всего контейнера только потому, что я нужно переместить небольшой кусочек.

Второй подход затрагивает DOM напрямую, используя ссылки. Хотя это возможно, выполнение манипуляций с DOM иногда кажется мне неприятным.

Есть ли лучший подход? Какой из 2 имеет больше смысла?

Любое предложение или мысли будут оценены! Спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
752
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Таким образом, если определенные элементы DOM, такие как a, не отличаются между изменениями, они не отображаются повторно, повторно отображаются только измененные элементы DOM. И если свойство элемента DOM изменяется, обновляется только свойство, а элемент DOM не перерисовывается.

<div color = "blue" /> 

к

<div color = "red" /> 

Весь элемент не уничтожается и не создается заново, изменяется только свойство.

Однако, если элемент в дереве узлов отличается от всего дерева узлов, оно уничтожается и создается заново.

<div />

к

<p>

Это называется примирением https://reactjs.org/docs/reconciliation.html

Таким образом, использование refs, безусловно, является более хакерским решением, поскольку это больше похоже на аварийный люк и напрямую манипулирует DOM.

Я бы определенно придерживался варианта 1, я думаю, что есть элегантное решение для описанного вами варианта использования, оно будет включать в себя просто добавление прослушивателя событий щелчка в componentDidMount и отслеживание положения щелчка таким образом.

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

Рекомендую для дальнейшего чтения https://overreacted.io/react-as-a-ui-runtime/

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

Получил ошибку при тестировании redux-saga с функциями задержки с помощью библиотеки Redux Saga Test Plan
Как использовать модель в одном корне в reactjs?
Как исправить поисковый фильтр React, который не обновляется при возврате
Реагировать - event.target возвращает innerText ранее щелкнутого элемента вместо текущего щелкнутого элемента
Реагировать на проблему с параметрами маршрутизатора dom
Как вызвать обратный вызов, предоставленный свойством рендеринга, из его родительского компонента, используя хуки между рендерингами
Неверный вызов ловушки. Хуки можно вызывать только внутри тела функционального компонента при применении стиля к базовому компоненту класса с помощью material-ui
Автоматически изменять размер выпадающего списка css, чтобы он соответствовал самому большому элементу
Firebase intellisense/автодополнение в проекте JavaScript React в VSCode
Как заставить onClick и href работать вместе?