双向绑定和后台更新不重新渲染组件

Posted

技术标签:

【中文标题】双向绑定和后台更新不重新渲染组件【英文标题】:Two-way binding and background update does not re-render component 【发布时间】:2021-04-07 13:33:59 【问题描述】:

我有一个 Blazor 服务器端项目,其中有一个自定义组件,它使用视图模型绑定到 inputbase 复选框。

如果我通过单击按钮更改视图模型,一切正常。 但是,如果我通过更多“背景”来更改视图模型,例如 GRPC 推送消息,则不会重新渲染 inputbase 复选框。

【问题讨论】:

【参考方案1】:

只要更改的原因与 UI 相关,例如单击按钮、字段中的输入更改等,在大多数情况下,渲染周期都会由 Blazor 启动。

但是,如果原因是更嵌套的东西,例如计时器或完成的异步调用,您可以在组件中使用方法 StateHasChanged 来触发新的渲染周期。

正如评论中提到的,在 UI 线程之外调用此方法时可能会有缺点。 await InvokeAsync(StateHasChanged) 有助于缓解问题。此外,它几乎是异步的,这更像是 Blazor 的“服务器化”。

【讨论】:

根据您调用它的时间和方式,最好使用await InvokeAsync(StateHasChanged); - 这将是 1) 与所有服务器端 blazor 一样异步 2) 将在上下文中运行该方法主(UI)线程,所以它有效果,否则如果调用者在另一个线程上,它甚至可能抛出。 感谢@rdmptn 指出这一点。我已经更新了答案。

以上是关于双向绑定和后台更新不重新渲染组件的主要内容,如果未能解决你的问题,请参考以下文章

前端面试被问到,vue实现数据双向绑定,原理是什么

Vue原理-双向绑定

Vue3的双向绑定是如何实现的

为啥双向绑定组件在 Svelte 中更新两次?

vue是如何避免重复渲染的?

原生js实现数据双向绑定