如何强制Blazor重新渲染组件

Pou*_*lad 4 razor asp.net-core blazor

我正在使用Blazor(客户端)构建一个简单的Web应用程序,需要让Blazor重新渲染该组件。有没有办法通知框架重新渲染?

在此Razor页面上,我有一个简单的复选框,显示用户是否向Web应用授予了一定的权限。

ShouldRender()总是返回True。当isGrantedfield设置True为时,该复选框不会呈现,并且保持未选中状态。

剃刀页面:

@page "/foo"
@inject IJSRuntime js

<input type="checkbox" disabled @bind="isGranted" /> Some Permission

@code {
  bool isGranted;

  protected override async Task OnInitAsync() {
    await js.InvokeAsync<object>(
      "foo.bar",
      DotNetObjectRef.Create(this),
      nameof(BarCallback)
    );
  }

  [JSInvokable]
  public void BarCallback(bool result) {
    Console.WriteLine($"BarCallback(result: {result})");
    isGranted = result;
  }
  protected override bool ShouldRender() {
    Console.WriteLine("Blazor is checking for re-rendering...");
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

JavaScript函数:

window.foo = {
  bar: (dotnetObjRef, callback) => {
    navigator.storage.persist()
      .then(result => {
        dotnetObjRef.invokeMethodAsync(callback, result)
          .catch(reason => console.warn('Failed to call .NET method.', reason));
      })
      .catch(reason => console.warn('Failed to get permission.', reason));
  }
}
Run Code Online (Sandbox Code Playgroud)

在Chrome控制台中的输出:

WASM: Blazor is checking for re-rendering...
WASM: BarCallback(result: True)
Run Code Online (Sandbox Code Playgroud)

.NET Core SDK: 3.0.100-preview6-012264

西装外套模板: Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview6.19307.2

Isa*_*aac 7

通常,您可以通过调用StateHasChanged方法来强制重新渲染。

为了使该应用程序正常工作,您应该将其放置StateHasChanged();在BarCallback方法的末尾...

您还应该在isGranted之前添加“ @”符号,如下所示: @bind="@isGranted"

希望这可以帮助。

  • 谢谢!但是,使用 `@bind="isGranted"` 或 `@bind="@isGranted"` 之间没有区别。他们都工作。 (4认同)