在 Blazor 中,重新渲染时可以重用组件实例。例如,只要
id
url 路径参数发生更改(通过单击链接或以编程方式导航或使用浏览器后退按钮),以下页面组件实例就会被重用,而无需重新初始化:
@page "/data/{id:int}"
<h1>Data of @Id</h1>
<p>Data: @_data</p>
<p><NavLink href="@("data/"+(Id+1))">Next</NavLink></p>
@code {
[Parameter]
public int Id { get; set; }
private int? _currentlyLoadedId;
private string _data = "";
protected override async Task OnParametersSetAsync()
{
// This check seems hacky...
if (Id != _currentlyLoadedId)
{
// The parameter must have been changed.
_data = await LoadAndSetData(Id);
_currentlyLoadedId = Id;
}
}
private async Task<string> LoadAndSetData(int id)
{
// Simulate a server request
await Task.Delay(2000);
return "Demo data for ID " + id;
}
}
对于这样一个看似常见的问题,这种方法似乎有点冗长/老套。将离散命令式逻辑(例如将数据加载到渲染周期)绑定似乎从根本上是错误的方法......
没有内置方法可以评估
id
参数是否在不同的渲染周期之间真正发生了变化。此外,调用 OnParametersSetAsync
方法的次数没有限制,因为可能有 许多渲染通道具有相同的参数(由于我的组件或潜在父组件中的其他逻辑)。
这应该如何在 Blazor 中完成(或者我猜在任何 SPA 中)?
组件不会被重用:没有页面更改(页面就是一个组件),因此渲染器没有理由修改渲染树。您所拥有的只是参数更改,因此只有
OnParametersSet{Async}
被调用。
是的,你的逻辑是正确的。这是使用
ComponentBase
的方法。仅当值发生变化时才获取数据。
您还希望将“加载数据之类的逻辑”与什么联系起来?
调用
方法的次数没有限制OnParametersSetAsync
正确,如果参数是引用对象,则非常正确。但问题是什么?请参阅我对最近一个问题的回答。 https://stackoverflow.com/a/77676270/13065781