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

Уместно ли определять некоторые UI элементы не путём отслеживания их

состояния в локальном стейте/сторе, а взаимодействуя с DOM? Вот пример: есть древовидная структура папок. Если в какой-либо дочерней папке (на любом уровне иерархии в дереве) имеется файл, то надо отображать индикатор, что папка не пустая у самой папки и у её родителей по цепочке, вплоть до корневого элемента. В нативном JS это можно сделать очень просто с помощью навешивания доп. классов, а дальше квери селектором смотреть имеющийся класс у потомка и навешивать всё эт дело заново, если файл удалили, или добавили в другой директории, НО в реакте же вся фишка в том, что ты должен работать с состояниями, а тут это не совсем удобно становится, т.к. при каждом удалении/добавлении файлов надо мурыжить массив заново, а т.к. это дерево, то без рекурсии при переборах никак не обойтись и отсюда вытекает вопрос: можно ли в реакте обращаться к DOM элементам напрямую, меняя отображение UI минуя стейт/стор, И насколько это вообще оправдано (просто не совсем понимаю, какая операция выходит более ресурсоёмкой: рекурсивная обработка массива с вложенностями или операции с DOM-деревом).

13 ответов

1 просмотр

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

Lastiqe-Adadurov Автор вопроса
Тимофей 🛴
Нет нельзя, скорее всего если хорошо подумать твою...

Да задача уже решена, я уже всё отобразил, а все "лампочки" хранятся в сторе. Просто задумался, мб как-то можно "удешевить" отображение UI не путём перебора этого массива, а повесить всю работу на браузер и пущай он в DOM дереве там роется и выдает всю вложенность с нужными мне путями до дочерних папок. Штош, увы(

Правильно написанная рекурсивная работа с деревом эффективнее, чем троганье за DOM. Ну и нельзя трогать DOM там, где работает реакт. Если уверен в себе и хочешь написать супер-оптимально, можешь сам рендерить и управлять домом, не создавая компонент реакта

Lastiqe Adadurov
Да задача уже решена, я уже всё отобразил, а все "...

Не он роется, а ты. И ты это делать будешь менее эффективно, чем реакт

Lastiqe Adadurov
Да задача уже решена, я уже всё отобразил, а все "...

В среднем эффективная работа с DOM дороже по ресурсам, чем числодробилка (какой является рекурсивный перебор дерева)

Lastiqe-Adadurov Автор вопроса
Ivan 🧑‍🚀
Правильно написанная рекурсивная работа с деревом ...

Не, такой вариант точно не подходит) Ну в целом я так и думал, что рыться в ДОМе не ставя в известность Реакт, в реакт-приложении - плохая идея.

Lastiqe-Adadurov Автор вопроса
Ivan 🧑‍🚀
В среднем эффективная работа с DOM дороже по ресур...

А что ты имел под правильно написанной? Я вот к примеру обычной рекурсивной функой и .map() методом внутри неё массив перебираю. Это сильно неэффективно?

Lastiqe Adadurov
А что ты имел под правильно написанной? Я вот к пр...

Смотреть надо. Я про разумное использование мемоизации и вызовов setState во избежание лишних рендеров

Реакт и создан что б не заморачиваться, теоретически можно с дом отработать эффективней чем реакт, но это неудобно и зачастую не нужно. (Явно не для того что дерево каталогов нарисовать, это тривиал)

Lastiqe-Adadurov Автор вопроса
Dmitriy Shuleshov
Реакт и создан что б не заморачиваться, теоретичес...

Да дело не в отрисовке и сложности. Я спрашивал про то, что менее ресурсоёмко && уместно при использовании реакта. Вариант с обращением к ДОМу неуместен, если компонент рендерится реактом, так что остается делать через реакт и состояния (собсна через него изначально и сделано)

Lastiqe-Adadurov Автор вопроса
Dmitriy Shuleshov
Я ответил на вопрос что менее ресурсоемко

На этот вопрос уже выше ответили, что рекурсивный перебор массива эффективней любого ковыряния в ДОМе.

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

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

Такой вопросец - есть функция function MySuperDuperConcat(const a: array of AnsiString): AnsiString; Как мне в её теле сделать вот так? Result:=Concat(a); А не грустный вариан...
notme
15
Есть какой-нибудь для Delphi/FPC T*Compression(Decompression)Stream на базе LZ4/Zstd/любой другой быстрый(и хорошо сжимающий) алгоритм А ещё лучше в pure pascal А ещё лучше од...
notme
48
type TObj = object procedure Init; virtual; end; TObj1 = object(TObj) procedure Init; override; end; procedure TObj1.Init; begin inherited; end; procedur...
Alexander 👋
29
А чем вам питонисты не угодили?😂
.
79
Вот смотрите у меня есть два стрима сейчас fs, cs: TStream; fs := TFileStream.Create('filename'); cs := TCompressionStream.Create(compression_level, fs); Я хочу сделать так: ...
notme
5
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
83
Можно ли загрузить скрипт py в бота чтобы он работал по нему? как это сделать?
huskadam #RCC Фанат? @hitlerpvp
13
Всем здравствуйте! Я хотел узнать сколько стоит средняя месячная зарплата у Electron js разработчиков? Мне очень это важно и нужно, плиз помогите узнать эту инфу! Для Джунио...
U.K.
10
Hello. Could you please help me with finding all coordinates within a radius using a spatial index, given that I have a table with coordinates? SET @lng = 37.57925; SET @lat ...
Rinchin G
8
free(NULL) это UB?
#
8
Карта сайта