|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
||||||
Blazor: запрет на рендеринг вложенного компонента12.01.2023, 12:46. Показов 2009. Ответов 12
Метки нет (Все метки)
Есть три своих компонента, которые в разметке можно использовать следующим образом:
Вопрос - можно ли как-то штатными средствами отключить для 'Items' и 'Item' процедуру рендеринга (и первую, и все последующие)? Но не через protected override bool ShouldRender() => false;, а как-то более основательно? Т.к. если отключать через 'ShouldRender', то и первая перерисовка всё равно происходит, и при всех последующих рендерах родительского компонента, фреймворк всё равно перебирает всех потомков и для каждого делает вызов 'ShouldRender', что пусть и незначительно, но всё же повышает общее время перерисовки.
0
|
||||||
| 12.01.2023, 12:46 | |
|
Ответы с готовыми решениями:
12
Blazor: нюансы реализации компонента
Как вызвать POST запрос из компонента Blazor? |
|
628 / 392 / 135
Регистрация: 06.03.2017
Сообщений: 1,469
|
|||||||||||
| 14.01.2023, 12:07 | |||||||||||
|
можно использовать директиву @code, в которой можно указать, что компонент не должен быть отрисован. Например, для компонента 'Items':
1
|
|||||||||||
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
|
| 15.01.2023, 01:44 [ТС] | |
|
Pilarentes,
Спасибо, но это не то (я там выше про это написал): 1. Если использовать '@if', то запускается и весь цикл рендеринга (ShouldRender, AfterRender), и сам процесс рендеринга шаблона. 2. Если использовать 'ShouldRender', который возвращает 'false', то рендеринг не выполняется, но фреймворк всё равно опрашивает компонент и вызывает для него 'ShouldRender' (каждый раз, хотя в этом нет никакой надобности, т.к. компонент не содержит никаких визуальных элементов).
0
|
|
|
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
|
|
| 15.01.2023, 13:03 | |
|
kotelok, сколько времени занимает этот опрос например для миллиона компонентов?
1
|
|
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
||
| 17.01.2023, 07:56 [ТС] | ||
|
В итоге есть два решения: 1. У компонента 'Container' при первом рендеринге установить в 'null' RenderFragment вложенного контента. Первый рендеринг для него всё равно отрабатывает, но последующие уже нет. 2. Вместо тех вложенных компонентов, которые нужны исключительно для предоставления данных родительскому компоненту, использовать обычные классы и коллекции их экземпляров. Однако, в разметке это выглядит не очень красиво и удобно.
0
|
||
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
|
| 17.01.2023, 19:55 [ТС] | |
|
В общем, первый способ работает даже лучше, чем ожидалось. Если занулить делегат 'RenderFragment', в котором "лежат" все вложенные компоненты, то при следующем рендеринге контейнера верхнего уровня, движок blazor это понимает, корректно диспозит экземпляры всех вложенных компонентов (с учётом всех уровней вложенности), более не пытается их рендерить и они становятся доступны для сборщика мусора.
В итоге и инициализирвоать компонент можно удобным способом прямо через разметку, и память/процессор не расходуются на мусорные экземпляры псевдо-компонентов на протяжении всего времени работы приложения.
0
|
|
| 30.01.2023, 20:45 | |
|
Не по теме: Я могу ошибаться, но использовать компоненты для хранения данных — так себе практика.
0
|
|
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
||||||||||||
| 30.01.2023, 23:34 [ТС] | ||||||||||||
Да, один из вариантов - сделать каждый 'MenuItem' полноценным маленьким компонентом, который отрисовывает себя в родительском контейнере. Однако, в этом случае сложнее управлять состоянием меню в целом, сложнее реализовывать навигацию при помощи клавиатуры. Ну и ещё это порождает существенное повышение затрат на рендеринг меню в целом, т.к. если весь рендеринг только в компоннете 'MainMenu', то это один цикл отрисовки (ShouldRender -> Render -> AfterRender) и обработка всего одного шаблона, внутри которого пара циклов и всё. А если каждый 'MenuItem' является полноценным компонентом, то при каждой перерисовке меню, blazor вынужден выполнять полный цикл перерисовки для всех MenuItem, входящих в меню. Кстати, то решение, которое я выше обозначил, на самом деле не рабтает, т.к. если занулить 'ChildContent', то движок фреймворка начинает вести себя странно. Например, после сборки мусора начинает с нуля пересоздавать экземпляры всех вложенных компонентов и снова инициализирует 'ChildContent' новым экземляром 'RenderFragment'. Так что единственно решение, которое на данный момент доступно, хоть и не очень удобно, но даёт именно нужный результат:
0
|
||||||||||||
|
Уважайте чужое время
75 / 23 / 8
Регистрация: 01.02.2013
Сообщений: 191
|
||
| 30.01.2023, 23:46 | ||
|
Можно даже без DI: немножко рефлексии и в клиентском коде абсолютно чисто, всего лишь интерфейс/атрибут на нужных элементах =)
0
|
||
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
||
| 31.01.2023, 14:35 [ТС] | ||
|
Однако, в силу особенностей Blazor, использовать его возможности нет. А потому остаётся лишь один вариант - описывать меню через какую-то модель и передавать в коллекцию 'Items' (второй пример в предыдущем сообщении).
0
|
||
|
Уважайте чужое время
75 / 23 / 8
Регистрация: 01.02.2013
Сообщений: 191
|
||
| 31.01.2023, 17:23 | ||
|
1
|
||
|
1338 / 918 / 264
Регистрация: 08.08.2014
Сообщений: 2,759
|
|
| 31.01.2023, 17:35 [ТС] | |
|
big1991,
Я даже отдалённо не понял, что именно вы предлагаете. Можете показать на примере, как это будет выглядеть в разметке?
0
|
|
|
Уважайте чужое время
75 / 23 / 8
Регистрация: 01.02.2013
Сообщений: 191
|
|||||||||||||||||||||
| 31.01.2023, 18:00 | |||||||||||||||||||||
|
Ну образно вроде такого:
А в клиентском коде:
В апи собсна атрибут вроде такого:
Разумеется, это сырая имплементация, можно сделать красивее и гибче, при желании. И вешать атрибут можно не на сущности, а на что угодно, для чего сможете имплементировать View. Добавлено через 4 минуты Чтобы избежать отстрела ног с категориями, их имена могут быть либо константами (не интуитивно), либо nameof() от доп.абстракций (громоздко). А атрибутом можно очень много вертеть и кастомизировать: например добавить признак того, что сущность является не только пунктом (или не пунктом) меню, но и категорией. Ну, я пользуюсь таким велосипедом для этих целей (очень лень описывать меню руками), мб Вам не зайдёт)
1
|
|||||||||||||||||||||
| 31.01.2023, 18:00 | |
|
Помогаю со студенческими работами здесь
13
QML. Не вызываются функции из вложенного компонента
Запрет ручного ввода для компонента DateTimeEdit Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|