我实际上是在尝试Blazor WebAssembly。
除了一件事,一切都正常。
我的想法是我想共享同一组件来创建或编辑项目。
该组件的名称是CreateOrEdit.razor,我有两条路线:
@page "/master/maker/create"
@page "/master/maker/{id:int}"
ID被捕获并存储在属性中:
[Parameter]
public int Id { get; set; }
我还有一个getter属性来确定我们是否在编辑或创建页面上。
public bool IsEditPage { get => Id > 0; }
并用于这样的视图
@if (IsEditPage)
{
<Button Clicked="OnEditButtonClicked"
Color="@(m_EditMode ? Color.Danger : Color.Primary)" Class="mb-2">
@(m_EditMode ? "Save" : "Edit")
</Button>
<Row>
<Column ColumnSize=" ColumnSize.Is2" Class="my-auto">
<span>ID</span>
</Column>
<Column ColumnSize="ColumnSize.Is8">
<span>@Id</span>
</Column>
<Column ColumnSize="ColumnSize.Is2"></Column>
</Row>
}
else
{
<Button Clicked="OnCreateButtonClicked" Color="Color.Danger" Class="mb-2">Create</Button>
}
如果处于编辑模式,则将获得该项目的ID,并显示“编辑”按钮。然后,如果单击“编辑”按钮,则可以编辑表单上的元素。“编辑”按钮更改并变为“保存”。然后将数据发送到API。
在创建模式下,显示“保存”按钮。只需单击它即可将数据发送到API。我计划添加验证,但问题不在这里。
问题如下:
假设我们先导航到编辑页面“ localhost / master / maker / 1”,然后导航到创建页面“ localhost / master / maker / create”(如果我们创建一个项目并重定向到编辑页面,问题是相同的然后); 该组件没有重新渲染,因为它共享相同的组件。此外,不会再次调用OnInitializedAsync()方法。我不想用相同的代码分隔两个组件,也不想再次强制加载,因为我在IoC上有一些作用域服务用于数据缓存。
有人能帮我吗 ?
这不是错误。OnInitialized/OnInitializedAsync
被调用一次,因为组件被重用,不再创建。要初始化参数,您应该使用OnParametersSet/OnParametersSetAsync
。每次在渲染组件之前调用它们。微软文档[1]中对此进行了描述:https : //docs.microsoft.com/zh-cn/aspnet/core/blazor/components/lifecycle? view=aspnetcore- 3.1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句