Blazor 在特定组件中包含 javascript 库
Blazor include javascript library in specific component
我的 Blazor 服务器端应用程序在 _Layout.cshtml
文件中包含几个 js / css 库。但是,在我的一个组件中,我想利用一组额外的 js / css 库来为该 specific 组件添加功能——我不希望这些库全局加载。
有没有一种 Blazor 原生的方法可以做到这一点?我看过很多帖子使用第三方库或某种 hack 来完成此操作(例如 https://github.com/mishelshaji/DynamicJavaScriptInBlazor),但它似乎应该得到原生支持。
使用 IJSRuntime 的延迟加载功能,您可以使用组件动态加载 JavaScript。
在这个组件中,我在 Razor Class 库中延迟加载脚本文件。
代码隐藏方法组件的相关部分:
public partial class Dialog : ComponentBase, IAsyncDisposable
{
private readonly Lazy<Task<IJSObjectReference>> moduleTask;
private DotNetObjectReference<Dialog> dotNetObjectReference;
...
public Dialog()
{
moduleTask = new(() => jsRuntime!.InvokeAsync<IJSObjectReference>(
identifier: "import",
args: "./_content/BlazorDialogs/dialogJsInterop.js")
.AsTask());
dotNetObjectReference = DotNetObjectReference.Create(this);
}
[Inject]
private IJSRuntime jsRuntime { get; set; }
...
public async ValueTask ShowDialogAsync()
{
var module = await moduleTask.Value;
await module.InvokeVoidAsync(identifier: "showDialog", dialogElement, dotNetObjectReference);
...
}
public async ValueTask CloseDialogAsync()
{
var module = await moduleTask.Value;
await module.InvokeVoidAsync(identifier: "closeDialog", dialogElement);
...
}
[JSInvokable]
public void OnDialogClosed()
{
...
}
public async ValueTask DisposeAsync()
{
if (moduleTask.IsValueCreated)
{
var module = await moduleTask.Value;
await module.DisposeAsync();
}
}
}
注意:OnDialogClosed
是从 JavaScript 调用的。
我的 Blazor 服务器端应用程序在 _Layout.cshtml
文件中包含几个 js / css 库。但是,在我的一个组件中,我想利用一组额外的 js / css 库来为该 specific 组件添加功能——我不希望这些库全局加载。
有没有一种 Blazor 原生的方法可以做到这一点?我看过很多帖子使用第三方库或某种 hack 来完成此操作(例如 https://github.com/mishelshaji/DynamicJavaScriptInBlazor),但它似乎应该得到原生支持。
使用 IJSRuntime 的延迟加载功能,您可以使用组件动态加载 JavaScript。
在这个组件中,我在 Razor Class 库中延迟加载脚本文件。
代码隐藏方法组件的相关部分:
public partial class Dialog : ComponentBase, IAsyncDisposable
{
private readonly Lazy<Task<IJSObjectReference>> moduleTask;
private DotNetObjectReference<Dialog> dotNetObjectReference;
...
public Dialog()
{
moduleTask = new(() => jsRuntime!.InvokeAsync<IJSObjectReference>(
identifier: "import",
args: "./_content/BlazorDialogs/dialogJsInterop.js")
.AsTask());
dotNetObjectReference = DotNetObjectReference.Create(this);
}
[Inject]
private IJSRuntime jsRuntime { get; set; }
...
public async ValueTask ShowDialogAsync()
{
var module = await moduleTask.Value;
await module.InvokeVoidAsync(identifier: "showDialog", dialogElement, dotNetObjectReference);
...
}
public async ValueTask CloseDialogAsync()
{
var module = await moduleTask.Value;
await module.InvokeVoidAsync(identifier: "closeDialog", dialogElement);
...
}
[JSInvokable]
public void OnDialogClosed()
{
...
}
public async ValueTask DisposeAsync()
{
if (moduleTask.IsValueCreated)
{
var module = await moduleTask.Value;
await module.DisposeAsync();
}
}
}
注意:OnDialogClosed
是从 JavaScript 调用的。