调用StateHasChanged后不重新呈现组件

时间:2020-03-01 13:37:49

标签: c# asp.net-core .net-core blazor

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

.flush() & os.fsync()

消息组件:

@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;
        }
    }
}

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

我怎么办?如何强制重新呈现消息组件?

1 个答案:

答案 0 :(得分:1)

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

我已解决了该问题-在调用NavigationManager.NavigateTo(“ some_page”)之后更改@body时,StateHasChanged()不会重新呈现消息组件。我尝试了在其他地方触发StateHasChanged()的地方,如果将其移到Message.razor,它会按预期工作。

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