Blazor:如何触发刷新或获取逻辑?

问题描述 投票:0回答:1

在 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 中)?

asp.net parameters blazor rendering reload
1个回答
0
投票

组件不会被重用:没有页面更改(页面就是一个组件),因此渲染器没有理由修改渲染树。您所拥有的只是参数更改,因此只有

OnParametersSet{Async}
被调用。

是的,你的逻辑是正确的。这是使用

ComponentBase
的方法。仅当值发生变化时才获取数据。

您还希望将“加载数据之类的逻辑”与什么联系起来?

调用

OnParametersSetAsync
方法的次数没有限制

正确,如果参数是引用对象,则非常正确。但问题是什么?请参阅我对最近一个问题的回答。 https://stackoverflow.com/a/77676270/13065781

© www.soinside.com 2019 - 2024. All rights reserved.