参数更新后 Blazor 页面未重新呈现

Posted

技术标签:

【中文标题】参数更新后 Blazor 页面未重新呈现【英文标题】:Blazor page not rerendering after parameter updated 【发布时间】:2019-09-12 12:21:45 【问题描述】:

我开始使用新的 ASP.NET 核心 Web 应用和 blazor 客户端模板 (3.0.0-preview4-19216-03)。

为了向现有的Counter.razor 页面添加状态,我添加了以下类:

public class GlobalCounter

    private int _count;
    public int Count
    
        get => _count;
        set
        
            if (_count == value) return;

            _count = value;
            CounterChanged.Invoke(this, new CounterChangedEventArgs(_count));
        
    

    public GlobalCounter(int initialCount = 0)
    
        _count = initialCount;
    

    public event EventHandler<CounterChangedEventArgs> CounterChanged;


public class CounterChangedEventArgs : EventArgs

    public int Count  get; 
    public CounterChangedEventArgs(int count)
    
        Count = count;
    

Startup.cs 中,ConfigureServices 方法中添加了以下内容:

public void ConfigureServices(IServiceCollection services)

    var counter = new GlobalCounter();
    services.AddSingleton(counter);

接下来我将要注入的单例添加到Counter.razor 页面中:

@inject GlobalCounter _counter;

还在页面的@functions处添加了如下代码:

protected override async Task OnInitAsync()

    currentCount = _counter.Count;
    _counter.CounterChanged += CounterChanged;
    await Task.CompletedTask;


void CounterChanged(object sender, CounterChangedEventArgs args)

    currentCount = args.Count;


void IncrementCount()

   _counter.Count++;

到目前为止,它按预期工作,离开页面或重新加载将保留旧计数。

接下来,我调整了 index.razor 以注入计数器并显示点击次数。

@page "/"
@inject GlobalCounter _counter;

<h1>Hello, world!</h1>

Welcome to your new app.

<SurveyPrompt Title="How is Blazor working for you?" />

You pressed the counter @totalCount times.

@functions 
    private int totalCount = 0;

    protected override async Task OnInitAsync()
    
        totalCount = _counter.Count;
        _counter.CounterChanged += CounterChanged;
        await Task.CompletedTask;
    

    void CounterChanged(object sender, CounterChangedEventArgs args)
    
        totalCount = args.Count;
    

这也可以按预期工作。按计数器页面上的“点击我”按钮并导航回索引页面,将显示正确的计数。

我的问题来了,一旦我将&lt;Counter /&gt; 页面添加为index.razor 中的组件,按下“点击我”按钮将更新组件内的计数,但不会更新索引页上显示的文本。

是否需要显式调用来重新呈现依赖组件或页面之间的某些特定绑定?

【问题讨论】:

【参考方案1】:

在 index.razor 中试试这个:

void CounterChanged(object sender, CounterChangedEventArgs args)

    totalCount = args.Count;

    StateHasChanged();

你必须告诉 Blazor 组件的状态已经改变,她应该重新渲染。

顺便提一下,Counter 组件中的值会自动更新,因为在触发“单击我”按钮的单击事件后,Blazor 会调用 StateHasChanged 方法。在引发任何事件类型的事件后,会自动调用 StateHasChanged 方法...

【讨论】:

以上是关于参数更新后 Blazor 页面未重新呈现的主要内容,如果未能解决你的问题,请参考以下文章

西装外套 |炽热 | RadioGroup \ Radio:更新数据上下文后重新渲染页面元素

从 JavaScript 渲染 Blazor 组件 - 如何在组件渲染后从 JavaScript 更新 Blazor 组件参数

加载新页面后未呈现文本 - JQuery Mobile

定时器停止更新页面的 Blazor Server 问题

Blazor 组件在 StateHasChanged() 之后未更新

Blazor 服务器端 SPA:重新加载组件后的组件状态