Durante la implementación de páginas o componentes Blazor en archivos .razor
, es relativamente frecuente encontrarse con casos en los que nos interesa reutilizar un bloque de código Razor en más de un punto.
Por ejemplo, observad el siguiente ejemplo:
<h1>Todo list</h1>
<h2>Pending tasks</h2>
<ul>
@foreach (TodoItem item in TodoItems.Where(i=>!i.IsDone).OrderBy(i=>i.Priority))
{
<li>@item.Task, owned by @item.Owner and created at @item.CreatedAt</li>
}
</ul>
<h2>Finished tasks</h2>
<ul>
@foreach (TodoItem item in TodoItems.Where(i=>i.IsDone).OrderBy(i=>i.DateFinished))
{
<li>@item.Task, owned by @item.Owner and created at @item.CreatedAt</li>
}
</ul>
En este componente, podemos ver claramente que estamos repitiendo los dos bloques de código encargados de mostrar los elementos de cada una de las listas, por lo que, si en el futuro quisiéramos cambiar la forma de mostrar un TodoItem
, tendríamos que modificar el interior de los dos bloques. Es frecuente en estos casos optar por crear un nuevo componente que se encargue de ello, por ejemplo, llamado TodoListItem
:
<li>@Item.Task, owned by @Item.Owner and created at @Item.CreatedAt</li>
@code {
[Parameter]
public TodoItem Item { get; set;}
}
De esta forma ya tendremos el código de renderización del TodoItem
centralizado y podremos simplificar el bloque anterior eliminando la duplicidad:
<h1>Todo list</h1>
<h2>Pending tasks</h2>
<ul>
@foreach (TodoItem item in TodoItems.Where(i=>!i.IsDone).OrderBy(i=>i.Priority))
{
<TodoListItem Item="item" />
}
</ul>
<h2>Finished tasks</h2>
<ul>
@foreach (TodoItem item in TodoItems.Where(i=>i.IsDone).OrderBy(i=>i.DateFinished))
{
<TodoListItem Item="item" />
}
</ul>
Aunque conceptualmente la solución que hemos implementado es correcta, introduce un problema en nuestra aplicación: por el mero hecho de querer evitar la duplicación de código, estamos introduciendo en la página un número indeterminado de componentes, lo cual podría afectar drásticamente a su rendimiento.
Por llevarlo al extremo, imaginad que esas listas tienen miles de elementos. En este caso, en nuestra página estaríamos introduciendo miles de componentes, con lo que esto implica:
- Deberían instanciarse miles de componentes (objetos).
- Deberían ejecutarse los eventos del ciclo de vida de cada componente al crearlos, inicializarlos, renderizarlos, etc.
- Mientras se encuentren en la página cada componente ocuparía memoria, ya sea en cliente (Blazor WebAssembly) o en servidor (Blazor Server).
Esto podría llegar incluso a hacer una página inutilizable, por lo que es importante disponer de otros métodos para crear y reutilizar bloques de código HTML sin necesidad de crear componentes. Esta es una de las utilidades de los render fragments.
Publicado por José M. Aguilar a las 8:05 a. m.
Etiquetas: blazor, blazorserver, blazorwasm, trucos
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- El filtro [ApiController] en ASP.NET Core MVC 2.1
José María Aguilar - Actualización de EF6.TagWith (versión 1.2.1)
José María Aguilar
.NET Core / .NET
- .NET 6: DateOnly y TimeOnly, las nuevas estructuras para almacenar fechas y horas aisladas
José Manuel Alarcón - Put a DPAD on that GC!
Maoni Stephens - Using the new PriorityQueue from .NET 6
Kristoffer Strube - Catching all the Requests while Testing with HttpClient
Adam Storr - Using C# Named Arguments to Declutter Complex Tests
Matthew Jones - Understanding the impact of Roslyn Analyzers on the build time
Gérald Barré - Controlling my Sinclair AC using .NET and C# (from Raspberry Pi)
Jiří Činčura - 5 Ways to Improve the Performance of C# Code for Free
Sasha Mathews - Introducing C# 10
Ken Bonny - Making the calculator thread-safe: Creating a Simple Moving Average calculator in C#
Andrew Lock - Solve For The Next DayOfWeek From DateTime
Khalid Abuhakmeh - POLAR - Creating a Virtual Machine in .NET
Paulo Zemek - My Favorite C# Features - Part 4: Project Structure
Jeffrey T. Fritz - Streaming JSON Objects (NDJSON) With HttpClient
Tomasz Pęczek - C# serialization with JsonSchema and System.Text.Json
Matthew Adams
Pues sí, que se dice pronto, pero hace unos días Variable Not Found cumplió quince años y, como cada aniversario, no quería faltar a la tradición de celebrarlo con vosotros.
Unas 800 semanas, 5.600 días (exceptuando vacaciones, que también las hay), intentando volcar por aquí parte de lo que voy viendo o descubriendo sobre esta profesión que tanto nos gusta. Esto ha dado para cerca de 1300 posts, que han sido consultados más de cuatro millones y medio de veces, y que cuentan con seguidores de todo el mundo, y seguimos fieles los mismos objetivos: aprender y echar una mano al que por aquí se acerque.
Y como de costumbre, aprovecharemos para comentar un poco qué tal fueron las cosas por aquí los últimos 365 días.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- ¿Dónde está la directiva @helper de Razor en ASP.NET Core?
José María Aguilar - Iterar con foreach sobre cualquier tipo de objeto con C#9
José María Aguilar
.NET Core / .NET
- A Simple Moving Average calculator: Creating a Simple Moving Average calculator in C#
Andrew Lock - Implement log monitoring with Seq and Serilog in .net Core
Gary Woodfine - C# 9: Value Objects and Simpler Code
Peter Vogel - Beginning to Make Testing with HttpClient Easier
Adam Storr - Building a supply chain attack with .NET, NuGet, DNS, source generators, and more!
Maarten Balliauw - The future of gRPC in C# belongs to grpc-dotnet
Jan Tattermusch - Covariance and Contravariance in C# Explained
Patrick Smacchia - C# Based Text Template Transformation Engine
Ryan S White - Add a README to Your NuGet Package
Christopher Gill - Experimental Dotnet Monitor Tool Now Fully Supported
David Ramel
Hace unos días pasaba a un amigo una instrucción de PowerShell para visualizar en tiempo real el contenido que iba añadiéndose al final de un archivo de log en Windows, y pensé que igual podía ser útil para alguien más, así que aquí va :)
El asunto es tan simple como abrir un terminal o consola PowerShell en la carpeta donde tengamos el archivo y ejecutar la siguiente orden:
Get-content log.txt -Tail 0 -Wait
A partir de ese momento, la consola quedará bloqueada e irá mostrando en tiempo real las últimas líneas añadidas al archivo:
Esta idea tan sencilla podría ser combinada en scripts que nos simplifiquen alguna tarea más; por ejemplo, si estamos en una carpeta con archivos de trazas de distintos días, es sencillo conseguir que se abra el fichero de log más reciente, de forma que no tengamos que introducir su nombre cada vez que queramos utilizarlo:
# File: ViewLog.ps1
$file = Get-ChildItem -Filter *.txt | Sort-Object LastAccessTime -Descending | Select-Object -First 1
if($file)
{
Get-content $file -Tail 0 -Wait
}
¡Espero que os sea útil!
Publicado en Variable not found.
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- El nuevo tipo de retorno ActionResult<T> en ASP.NET Core 2.1
José María Aguilar - Cómo tomar el control en el momento de la instanciación de componentes Blazor con IComponentActivator
José María Aguilar
.NET Core / .NET
- .NET Framework 4.5.2, 4.6, 4.6.1 will reach End of Support on April 26, 2022
Jamshed Damkewala - How to create project templates in .net core
Gary Woodfine - LINQ: Beware of deferred execution
Sam Walpole - C# 9 Record: Compiler Created ToString() Code can Lead to Stack Overflow and Worse
Peter Huber - Scheduling tons of orchestrator functions concurrently in C#
Chris Gillum - Read and Write Excel Spreadsheets With C#
Khalid Abuhakmeh - Convert SVG files to PNG or JPEG using .NET
Gérald Barré - Implementing Floyd-Warshall algorithm for solving all-pairs shortest paths problem in C#
Oleg Karasik - Using the Win32 Api in a C# program with C#/Win32
Bruno Sonnino - Survey Reveals Bigger C# Community, Most and Least Popular Uses
David Ramel - Some more C# 9 - Red Hat Developer
Tom Deseyn - How To Change the Behavior of a C# Record Constructor
Christian Findlay - Nullable Reference types in C# – Best practices
Damir Arh - .NET 6 LINQ Improvements
Jonathan Allen - Some scenarios for deserializing a JSON to a type with read-only properties by "System.Text.Json"
Jsakamoto - C#: Make your delegates asynchronous from synchronous delegates
Anthony Giretti - What's the Top App Model Used by .NET Developers?
David Ramel