Blazor,怎么不断获得当前窗口宽度?

原学程将引见Blazor,若何赓续取得以后窗心严度?的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

Blazor,怎么不断获得当前窗口宽度? 教程 第1张

成绩描写

我想在剃须刀页里中如许做:

@if (currentwidth<x)
{
le code
}
else
{
 le other code
}

我已添减了Java剧本文件,并将其衔接到1个适用法式办事,该适用法式办事在我取得动态严度(我尝试了该严度)时便可任务。

js:

export function getCurrentWidth() {

 return window.addEventListener("resize", () => {
  window.innerWidth;
 });

}

UtilityService办法:

public async Task<double> GetCurrentWidth() 
  {
var m = await GetModule();
var result = await m.InvokeAsync<double>("getCurrentWidth");
return result;
  }

Razor文件:

double width;

 protected async override Task OnInitializedAsync()
 {
  width = await utilityService.GetCurrentWidth();
 }

是以,成绩是我不克不及从OnInitailzedAsync挪用它,由于该函数只触收1次,所以我须要1个赓续检讨GetCurrentWIdth()办法的函数去检讨调剂年夜小。

在Blazor中有甚么其余办法不妨做到这1面,或许我不妨应用甚么办法/提早感谢。

推举谜底

起首我想指出,您能够不用应用Java剧本/C#代码去处理您的成绩。假如您想要操纵html中的实质,这么您最佳应用css。但是我会让您本身决议的。

然则,假如您确切须要如上所述的窗心严度,这么我修议您向窗心注册1个侦听器(便像您曾经做过的这样),并让该侦听器挪用1个DotNet函数。应用动态办法完成这1面异常轻易,但是关于组件去说,这能够会有面辣手,由于您必需传播以后对于象的对于象援用。

[JsInvokable]指导此办法不妨从Java剧本挪用,这许可从Java剧本事宜侦听器到DotNet停止通讯。

CSharpFromJs.razor.cs

using Microsoft.AspNetCore.Components;
using Microsoft.JSInterop;
using System.Threading.Tasks;

public partial class CSharpFromJS
{
 private DotNetObjectReference<CSharpFromJS> _objectReference;
 public int WindowWidth { get; set; }


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

 protected override void OnInitialized()
 {
  _objectReference = DotNetObjectReference.Create(this);
 }

 protected override async Task OnAfterRenderAsync(bool firstRender)
 {
  if (firstRender)
  {
await InitWindowWidthListener();
  }
 }

 [JSInvokable]
 public void UpdateWindowWidth(int windowWidth)
 {
  WindowWidth = windowWidth;
  StateHasChanged();
 }

 private async Task InitWindowWidthListener()
 {
  await JSRuntime.InvokeVoidAsync("AddWindowWidthListener", _objectReference);
 }

 public async ValueTask DisposeAsync()
 {
  await JSRuntime.InvokeVoidAsync("RemoveWindowWidthListener", _objectReference);
  _objectReference?.Dispose();
 }
}

CSharpFromJs.razor

@implements IAsyncDisposable

<h一>Window width: @WindowWidth</h一>

Java剧本

// Manages the registered event listeners so they can be disposed later
let windowEventListeners = {};

function AddWindowWidthListener(objReference) {
 let eventListener = () => UpdateWindowWidth(objReference);
 window.addEventListener("resize", eventListener);
 windowEventListeners[objReference] = eventListener;
}

function RemoveWindowWidthListener(objReference) {
 window.removeEventListener("resize", windowEventListeners[objReference]);
}

function UpdateWindowWidth(objReference) {
 objReference.invokeMethodAsync("UpdateWindowWidth", window.innerWidth);
}

您独一须要留意的是组件被开释时。您应当增除DisposeAsync函数中已注册的处置法式,以保证它们没有会仍被注册以避免内存泄露。

This link能够会供给1些有闭怎样应用它的更佳解释,但是它们出有说明有闭处理处置法式的部门。

留意:这只实用于.net五及更低版原,由于在此之前组件还没有完成IAsyncDisposable。假如出于某种缘由您正在应用较早的版原,您不妨应用IDisposable挪用它。但是这能够会招致逝世锁,是以我没有修议您如许做。

佳了闭于Blazor,怎样赓续取得以后窗心严度?的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。