在Blazor中,如何在页面加载(事件名称)时调用函数



第一次进入Blazor。

在开始模板中,我看到btnCicked事件是如何工作的。

对于按钮事件,它是这样的:

<button class="btn btn-primary" @onclick="IncrementCount">Click me</button>
@code {
private int currentCount = 0;
private void IncrementCount()
{
currentCount++;
}
}

当我想调用IncementCount而不是点击按钮时,它是什么代码行

但在";加载页面事件";或者这个事件叫什么?

寻求帮助

有两种主要方法可以做到这一点,其中任何一种都可以。我倾向于选择第一种,但第二种也能完成任务。

第一种方法是在@code块中,您可以覆盖OnInitialized方法。我使用异步版本,因为你可以开始你的任务,让页面基础加载,然后它会在设置好后刷新。

@code {
void SomeStartupMethod()
{
// Do Some Work
}
Task SomeStartupTask()
{
// Do some task based work
return Task.CompletedTask;
}
protected override async Task OnInitializedAsync()
{
SomeStartupMethod();
await SomeStartupTask();
}

这将在页面加载上完成工作,就像填充数据的初始服务调用,有条件地填充列表,无论你需要做什么。顺便说一句,我发现的一个技巧是,如果你把await Task.Delay(1);放在OnInitializedAsync方法体的第一行,它将中断页面呈现的剩余执行,因此,当初始加载仍在后台处理时,您可以获得一个初始的响应页面。只是让你的页面更快响应的东西。

第二种方法是覆盖OnAfterRender方法,该方法允许页面1完全渲染,然后执行。它还有一个默认输入bool firstRender,可以用作数据加载和其他操作的条件。

protected override void OnAfterRender(bool firstRender)
{
// execute conditionally for loading data, otherwise this will load
// every time the page refreshes
if(firstRender)
{
// Do work to load page data and set properties
}
}

这个方法需要记住的一点是,每当Blazor引擎检测到需要刷新UI时,它都会执行,所以要明智地使用firstRender参数。

根据你需要做什么,不同的生命周期方法在不同的时间可能有用,还有一些我还没有提到。有关更多信息,请查看官方文档。仅仅使用文档提供的内容,我就可以自己走得更远,这个链接将让您开始了解生命周期方法。

希望这能有所帮助!

[Parameter]
public int StartValue { get; set; }
private int currentCount = 0;
protected override void OnInitialized() // = On Page Load
{   
currentCount = StartValue;
IncrementCount();
}
private void IncrementCount()
{
currentCount++;
}

或者,如果您不想要第一个StartValue,只需:

[Parameter]
public int StartValue { get; set; } = 0;
protected override void OnInitialized() // = On Page Load
{   
currentCount++;
}

如果您想在组件完成渲染后对其进行初始化(也许您想等待DOM加载(:

[Parameter]
public int StartValue { get; set; }
private int currentCount = 0;
protected override void OnAfterRender(bool firstRender) 
{   
if (firstRender)
{
currentCount = StartValue;
IncrementCount();
}
}
private void IncrementCount()
{
currentCount++;
}

使用OnInitializedAsync需要注意的一件重要事情是,事件可以触发多次。

根据您的应用程序,这可能不是您想要反复发射的东西。

// variable in your page or component
public bool Initialized { get; set; }
// if not initialized
if (!Initialized)
{
// Do your initializations
// This way it only runs once
Initialized = true;
}

另一种方式是在组件或页面的构造函数中

在这里,我有一个名为Index.razor的页面和名为Index_razor.cs的代码

在构造函数中

public void Index()
{
// Perform your initializations here
}

我需要:

  • 在我的blazor中通过onload运行javascript

通常你可能会有这样的东西:

<body onload="writeConsole()">

其中writeConsole()是JS文件中的一个函数。

我终于得到了下面的代码,我把它添加到了我的index.razor文件中。

@page "/"
@inject IJSRuntime JS;
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
<canvas id="mainCanvas" width="400" height="400"></canvas>
@code{
protected override void OnInitialized() 
{   

}
protected override void OnAfterRender(bool firstRender)
{
JS.InvokeVoidAsync("writeConsole");
JS.InvokeVoidAsync("initGrid");
}
}

您可以看到,我正在对JS文件中定义的两个不同的JS方法进行两次调用。

起初,我认为我需要重写的方法是OnInitialized(),但实际上是在页面完全"覆盖"之前;加载的";(所有DOM元素还不可用(,所以我使用OnAfterRender(bool firstRender),它的工作方式就像我使用原始的onload事件一样。

我正在调用的两个函数不接受任何参数,也不返回任何值,所以我使用InvokeVoidAsync()

相关内容

  • 没有找到相关文章

最新更新