我正在使用Blazor(客户端)构建一个简单的Web应用程序,需要让Blazor重新渲染该组件。 有没有办法通知框架重新渲染?
在此Razor页面上,我有一个简单的复选框,用于显示用户是否向Web应用授予了一定的权限。
ShouldRender()
始终返回True
。将isGranted
字段设置为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;
}
}
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));
}
}
Chrome控制台中的输出:
WASM: Blazor is checking for re-rendering...
WASM: BarCallback(result: True)
.NET Core SDK:3.0.100-preview6-012264
Blazor模板:Microsoft.AspNetCore.Blazor.Templates::3.0.0-preview6.19307.2
答案 0 :(得分:3)
通常,您可以通过调用StateHasChanged方法来强制重新渲染。
要使该应用正常工作,您应将StateHasChanged();
放在BarCallback方法的末尾...
您还应该在isGranted之前添加“ @”符号,例如:@bind="@isGranted"
希望这会有所帮助。
答案 1 :(得分:2)
只需从输入控件中删除disabled
,它就会起作用。更改:
<input type="checkbox" disabled @bind="isGranted" />
作者:
<input type="checkbox" @bind="isGranted" />
查看您的代码在blazorfiddle上的工作