【发布时间】:2021-04-07 13:33:59
【问题描述】:
我有一个 Blazor 服务器端项目,其中有一个自定义组件,它使用视图模型绑定到 inputbase 复选框。
如果我通过单击按钮更改视图模型,一切正常。 但是,如果我通过更多“背景”来更改视图模型,例如 GRPC 推送消息,则不会重新渲染 inputbase 复选框。
【问题讨论】:
我有一个 Blazor 服务器端项目,其中有一个自定义组件,它使用视图模型绑定到 inputbase 复选框。
如果我通过单击按钮更改视图模型,一切正常。 但是,如果我通过更多“背景”来更改视图模型,例如 GRPC 推送消息,则不会重新渲染 inputbase 复选框。
【问题讨论】:
只要更改的原因与 UI 相关,例如单击按钮、字段中的输入更改等,在大多数情况下,渲染周期都会由 Blazor 启动。
但是,如果原因是更嵌套的东西,例如计时器或完成的异步调用,您可以在组件中使用方法 StateHasChanged 来触发新的渲染周期。
正如评论中提到的,在 UI 线程之外调用此方法时可能会有缺点。 await InvokeAsync(StateHasChanged) 有助于缓解问题。此外,它几乎是异步的,这更像是 Blazor 的“服务器化”。
【讨论】:
await InvokeAsync(StateHasChanged); - 这将是 1) 与所有服务器端 blazor 一样异步 2) 将在上下文中运行该方法主(UI)线程,所以它有效果,否则如果调用者在另一个线程上,它甚至可能抛出。