第一次进入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()
。