gpt4 book ai didi

c# - 组件在调用 StateHasChanged 后不会重新渲染

转载 作者:行者123 更新时间:2023-12-05 03:55:06 25 4
gpt4 key购买 nike

我已阅读文章“3 Ways to Communicate Between Components in Blazor”并尝试这样做。我在@body 下有消息组件,并且必须更改@body 组件消息中的用户操作

@inject ClientMessage clientMessage
@inherits LayoutComponentBase
@using Site.Shared.Components

<div class="sidebar">
<AdminMenu />
</div>

<div class="main">
<div class="content px-4">
@Body
</div>
<Message/>
</div>

@code
{
protected async Task ChangeState()
{
await InvokeAsync(StateHasChanged);
}

protected override void OnInitialized()
{
clientMessage.MsgChange += ChangeState;
}
}

消息组件:

@inject ClientMessage clientMessage
<div style="@(IsVisble ? "display:block" : "display:none")" class="@MsgClass" role="alert">
@if (clientMessage != null)
{
@clientMessage.Message
}
</div>

@code {

public bool IsVisble
{
get
{
if (string.IsNullOrEmpty(@clientMessage.Message))
{
return false;
}

return true;
}
}

public string MsgClass
{
get
{
if (clientMessage == null)
{
return string.Empty;
}

string msgClass;

switch (clientMessage.MsgType)
{
case EMsgType.Info:
msgClass = "alert alert-info";
break;
case EMsgType.Success:
msgClass = "alert alert-success";
break;
case EMsgType.Warning:
msgClass = "alert alert-warning";
break;
case EMsgType.Error:
msgClass = "alert alert-danger";
break;
case EMsgType.NoMsg:
default:
msgClass = string.Empty;
break;
}

return msgClass;
}
}
}

消息类

public class ClientMessage
{
public event Func<Task> MsgChange;

public ClientMessage(string msg, EMsgType msgType)
{
this.Message = msg;
this.MsgType = msgType;
NotifyStateChanged();
}

public void SetMsg(string msg, EMsgType msgType)
{
this.Message = msg;
this.MsgType = msgType;
NotifyStateChanged();
}

public string Message { get; set; }

public EMsgType MsgType { get; set; }

private void NotifyStateChanged()
{
if (MsgChange != null)
{
MsgChange.Invoke();
}
}
}

ClientMessage 类由 DI 作为单例注入(inject)。如果我在 @body 组件中调用 SetMsg(newMsgm, msgType) 然后调用 ChangeState() 方法但没有任何反应,我的意思是组件没有重新渲染。如果我改用“InvokeAsync”使用“Invoke”我有一个错误“当前线程未与 Dispatcher 关联。在触发渲染或组件状态时使用 InvokeAsync() 将执行切换到 Dispatcher。”。如果我重新加载页面,我可以看到消息。

我做错了什么以及如何强制重新呈现消息组件?

最佳答案

我解决了这个问题。也许它会帮助某人。

我定位了问题 - 当调用 NavigationManager.NavigateTo("some_page") 后 @body 被更改时 StateHasChanged() 不会重新呈现消息组件。我尝试了可以​​触发 StateHasChanged() 的不同位置,如果我将它移至 Message.razor,它就会按预期工作。

better to read the documentation at the beggining比文章:)

关于c# - 组件在调用 StateHasChanged 后不会重新渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60475661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com