Enfocando un elemento en Blazor

· 2 min de lectura

Después de trabajar en el juego Wordlzor que hice recientemente, necesitaba agregar una funcionalidad bastante simple: enfocar todo el juego al ingresar.

Esto debía hacerse porque el usuario podía escribir en el juego y no solo usar el teclado en pantalla.

archivo Javascript

Para hacer esto, tenemos que crear un archivo Javascript llamado app.js que contendrá una función

window.FocusElement = (element) => {
    element.focus();
};

Una vez hecho esto, debemos incluir el script en el archivo index.html:

<script src="js/app.js"></script>

Componente Blazor

Una vez que hemos inicializado el script, necesitamos encontrar un elemento en el que enfocarnos, por lo que en cualquiera de nuestros componentes, debemos hacer referencia a ese elemento a un objeto.

Entonces, en nuestro componente Blazor, agreguemos un div con el Propiedad @ref:

<div @ref=@elementToFocus tabindex="0" >
    This is my focus component
</div>

Luego, en la lógica del componente, puede tener la propiedad como ElementReference:

/// <summary>
/// Reference to element
/// </summary>
private ElementReference elementToFocus;

Inyectando JSInterop

Ahora, para poder llamar a la función que tenemos en nuestro archivo Javascript, necesitamos usar JSInterop.

Primero que nada debemos inyectarlo en un componente con la siguiente sintaxis:

[Inject]
public IJSRuntime JSRuntime { get; set; }

Con el servicio inyectado, ahora podemos llamar a cualquiera de los métodos que tiene, como InvokeVoidAsync, que llamará a la función:

public async Task Focus()
{
    // Focus when initializing
    await JSRuntime.InvokeVoidAsync("window.FocusElement", elementToFocus);
}

Y cuando llamas a la función Focus(), se enfocará en el elemento que creamos, obviamente puedes refactorizar y pasar el elemento en sí como parámetro.

Si quieres ver cómo lo implementé, mira el código fuente de Wordlzor, lo usé para alertas y enfoque al cerrar el modal de instrucciones.