【问题标题】:blazor component not updating | core3.0blazor 组件未更新 |核心3.0
【发布时间】:2020-01-22 19:56:59
【问题描述】:

尝试使用最新模板生成的解决方案。

  • 有一个服务来保存字符串列表。
  • 在 MainLayout.razor 和 NavMenu.razor 中注入服务
  • 该服务具有简单的方法,即添加、删除、项目
  • 在 MainLayout 中,使用 OnInitializedAsync() 添加一些项目 喜欢关注

.

protected override async Task OnInitializedAsync()
    {
        await Task.Run(() =>
        {
            this.svc.Add("string one");
            this.svc.Add("string two");
        });
         await Task.Run(() => StateHasChanged());
    }
  • 在 NavMenu.razor 的 html 片段中,我很简单地尝试打印

    @svc.Items.Count

  • 使用上面的代码,我看不到计数得到更新/刷新, 我也可以在 MainLayout 中有另一个按钮处理程序来调用 svc.Add 方法,但计数未更新。

  • 仅当我尝试在 navMenu.razor 中有一些 btn 处理程序时,blazor 才会重新呈现自己

<button @onclick="SetCurrentTime"> Time </button>
    <h4>@time</h4>
        
    void SetCurrentTime()
            {
                time = DateTime.Now.ToLongTimeString();
            }

此问题的 github 存储库:(点击 AddString 并且计数器应该增加)https://github.com/pkaushik23/mycodeshares/tree/master/CheckRefreshBlazor

【问题讨论】:

  • Task.Run() 的东西很简单。您可能应该删除所有这些并重试。
  • 感谢@HenkHolterman,因为这是一个示例代码,但实际上我会从一些 api 调用中得到它。那里不需要 await/asyn stuf 吗?此外,由于我有图片中的服务,其他一些组件会调用服务上的 Add 方法,我希望我的导航栏组件显示更新的列表。
  • 客户端你没有线程,所以 Task.Run() 不能有用,它只能死锁。
  • 无复制。去创建一个minimal reproducible example 并确保它显示问题。
  • 谢谢,我还在学习。关于任务,我对这个docs.microsoft.com/en-us/aspnet/core/blazor/… 感到困惑。如果你知道我在哪里可以做 MRE,请你告诉我。

标签: blazor blazor-client-side


【解决方案1】:

您的NameService 应该通知更改。在Invoke component methods externally to update state了解它

对于您的服务代码,类似于:

public class StringService
{
    public event Func<string, Task> Notify;
    public List<string> Names { get; set; } = new List<string>();
    public void Add(string s)
    {
        this.Names.Add(s);
        if (Notify != null)
        {
            await Notify.Invoke(s);
        }            
    }
}

在您的组件上:

protected override void OnInitialized()
{
    this.svc.Notify += OnNotify;
}

public async Task OnNotify(string s)
{
    await InvokeAsync(() =>
    {            
        StateHasChanged();
    });
}

【讨论】:

  • 谢谢 Dani,请谅解。这意味着如果事件是从组件内引发的,那么“SynchronizationContext”会处理它,对吧?
  • 你知道为什么在 Index.razor 的 Add() 方法中调用“StateHasChanged()”与基于某些外部活动触发事件的效果不同吗? TIA
  • 我假设 stateHasChanged 只负责调用它的当前组件,并且不会冒泡以获得完整的层次结构。非常感谢你?
  • 由 Daniel Roth(MS Also .Net 团队)解释:github.com/aspnet/Blazor/issues/420#issuecomment-501385940
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-23
  • 2021-01-23
  • 2020-12-13
  • 1970-01-01
  • 2020-01-27
  • 1970-01-01
  • 2020-01-25
相关资源
最近更新 更多