- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在制作一个 Blazor 服务器端项目,我想制作一个点击后停用的按钮,但不使用 disabled
<button>
的属性.代码非常简单:
@functions {
LogInForm logInForm = new LogInForm();
bool IsDisabled;
SignInResult result;
protected override void OnInitialized()
{
IsDisabled = false;
}
async Task TryLogIn()
{
IsDisabled = true;
StateHasChanged();
result = await _LogInService.TryLogIn(logInForm);
Console.WriteLine("Logging status : " + (result.Succeeded ? "Sucess" : "Failure"));
IsDisabled = false;
StateHasChanged();
}
}
StateHasChanged
没有触发,但第二个确实重新呈现页面。通过进入 Debug模式并进入
StateHasChanged()
,它可以很容易地进行测试。方法。第二次调用时,它会在进入方法后停止在 HTML 代码上,但不是第一次。
Task.Delay
的解决方法或
Task.Run(...)
只是,因为它在这些线程和 UI 刷新线程之间存在竞争条件,所以它不是一个可靠的解决方案。我在
StateHasChanged()
上寻找答案通过使用诸如
PropertyChanged
之类的事件的行为或解决方法或
EventCallback
并将按钮作为子组件。
StateHasChanged()
仅在
await
之后触发组件的重新渲染对
Task
的操作.可以通过添加评论来轻松测试
result = await _LogInService.TryLogIn(logInForm);
线或改变
IsDisabled = ...
至
await new Task.Run(() => { IsDisabled = ...})
.我现在有一些解决方法,但我仍然想知道为什么这是一个功能。不应该
StateHasChanged()
任何操作后重新渲染?或者认为只有
async
操作(因此主要是服务器调用)可以更改 UI 中的某些内容?
最佳答案
Blazor 团队即将发布有关 StateHasChanged() 工作原理的文档。
你可以在这里跟踪它:https://github.com/aspnet/AspNetCore/issues/14591
就目前而言,我认为摘自 github 评论的这个解释是一个很好的解释:
Adding a call to StateHasChanged simply queues the component to be rendered. The renderer decides when the renders happen.
This can be triggered by 4 circumstances:
- Initial render where the bootstrap process triggers the initial render of the root component and all its children.
- An event, in which the component that handles the event automatically triggers a new render after the event, and potentially its children if it renders new children or change their parameters.
- As a result of calling StateHasChanged from an InvokeAsync call (marshalling back into the UI thread, essentially)
- As a result of the parent component changing the parameters for the child component, which happens as part of the diffing process when the renderer calls SetParametersAsync on the child component.
To be very clear, calling StateHasChanged only queues a Render for the component or "marks it as dirty".
It's the renderer the one that decides when and how to produce the renders. BuildRenderTree does not result in new rendered output, only in a new definition of the "V-DOM" for the component at the time it's being called.
Normally, a component gets rendered once per render batch (which is a collection of components that are rendered/diffed together and sent to the UI for update). There are only two situations in which a component renders more than once in a batch:
- You have a component that directly implements IComponent and calls RenderHandle.Render
- You have a circular dependency between a child and a parent component that might cause a parent to re-render as part of a children invoking some callback parameter from the parent as part of its initialization
关于c# - StateHasChanged() 重新渲染组件两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58932854/
我知道调用StateHasChanged()方法通知组件状态已更改,因此它应该重新渲染。 但是,我也看到了对 await InvokeAsync(StateHasChanged) 的调用。或 awai
这个问题在这里已经有了答案: Display wait or spinner on API call (7 个答案) 关闭 2 年前。 我使用 bool 属性在用户单击按钮后禁用它,这样单击就不会发
我正在学习 Blazor 组件,我想知道 StateHasChanged 会强制组件重新呈现所有自身还是仅重新呈现差异。智能感知报告指出 Notifies the component that its
看来StateHasChanged()仅在对任务执行等待操作后触发组件的重新渲染(找到 here)。 所以我只想使用 StateHasChanged用于重新渲染而不是使用 Task.delay或 Ta
我正在制作一个 Blazor 服务器端项目,我想制作一个点击后停用的按钮,但不使用 disabled 的属性.代码非常简单: @functions { LogInForm logInForm
我已阅读文章“3 Ways to Communicate Between Components in Blazor”并尝试这样做。我在@body 下有消息组件,并且必须更改@body 组件消息中的用户
我正在使用多个组件是我的应用程序每个都以有条件的方式呈现。是否有可能单独重新渲染特定组件? MyRazor.razor 文件, Second @if (renderOne) {
从任意线程调用 StateHasChanged() 是否安全? 让我给你一些背景。想象一个服务器端 Blazor/Razor Components 应用程序,您有: 从任意线程引发 BreakingN
当用户按下特定按钮时,我需要在按钮内显示动画并禁用它(调用的方法需要几秒钟才能完成)。这是我的html: @if (IsDownloadi
我的页面(组件)上有一个按钮,单击时会调用 Refresh() 方法。此方法然后调用 StateHasChanged(),但不会重新加载页面。 GetData() 正在调用外部 API 以从数据库加载
我有一个使用 Blazor InputFile 组件作为子组件的组件。 当我选择一个文件时,按预期调用 OnChange 处理程序。但是,如果我两次选择同一个文件,则不会再次调用 OnChange 处
我很难理解什么时候应该打电话 StateHasChanged()当 Blazor 拦截到某些内容发生更改时,必须重新渲染。 我创建了一个示例项目,其中包含一个按钮和一个名为 AddItem 的自定义组
在过去的几天里,我试图在我的 Blazor 应用程序中读取浏览器分辨率。我正在尝试这样做:[JSInvokable] Blazor Methode 由 JS 脚本调用。 1.我的问题是:宽度和高度仅在
我是一名优秀的程序员,十分优秀!