routing - 你能让 Blazor WebAssembly 使用导航更新组件吗?
问题描述
我一直在使用 Blazor WebAssembly 示例作为新应用程序的基础,并且运行良好。但我希望让 NavMenu 更有活力。
在这种情况下,我希望在 NavMenu 中有管理员/版主特定的选项,我试图在用户登录后添加这些选项。我目前正在使用 NavigationManager.NavigateTo(page, false) 在 Razor 页面之间切换。它实际上主要是一个 Razor 页面,因此登录和动态表在同一页面上,具体取决于应用程序是否具有令牌。
我使用 false 选项来确保它不会刷新整个页面,否则令牌将丢失。不过,我现在觉得奇怪的是,如果我单击 NavBar,它将更新 NavBar,显示新的管理选项,这很好。但我曾希望使用 NavigationManager.NavigateTo(page, false) 在代码中做同样的事情也会使导航栏更新。
我一直在看一些关于 Blazor 以及如何使用组件的视频和教程,但我仍然觉得如何在组件之间调用以及如何更新外部/父组件感到困惑。
我可以想出不同的方法,我可能可以让它工作,但我希望弄清楚正确的方法是什么,并遵循代码约定。我怀疑我错过了一些基本的方法来做这样的事情,即使我一直在研究这个。
我添加的代码
<li class="nav-item px-3">
<NavLink class="nav-link" href="counter">
<span class="oi oi-list-rich" aria-hidden="true"></span> Noter
</NavLink>
</li>
@if (ApiService.Token.HasValue)
{
<li class="nav-item px-3">
<NavLink class="nav-link" href="logout">
<span class="oi oi-list-rich" aria-hidden="true"></span> AdminStuff
</NavLink>
</li>
}
<li class="nav-item px-3">
<NavLink class="nav-link" href="logout">
<span class="oi oi-list-rich" aria-hidden="true"></span> Log ud
</NavLink>
</li>
解决方案
我找到了一种方法,但我怀疑它不是最好或最合适的方法。
我像这样创建了一个静态 EventManager:
public static class EventManager
{
public static List<Action> renderActions = new List<Action>();
public static void AddRenderAction(Action renderAction)
{
renderActions.Add(renderAction);
}
public static void TriggerRenderActions()
{
renderActions.ForEach(a => a.Invoke());
}
}
然后在 NavMenu.razor 组件的 OnInitialized 方法中添加固有的“StateHasChanged”方法:
protected override void OnInitialized()
{
EventManager.AddRenderAction(()=>StateHasChanged());
}
这样我就可以从任何地方调用 EventManager.TriggerRenderActions() 来运行所有添加的操作。
推荐阅读
- javascript - 如何使用 THREE.JS 从 xyz 中的点数组制作自定义形状?
- php - PHP如何模拟SIGPIPE?
- python - 如何在axis = 1处附加一维数组
- c - Windows 中的 `fprintf()` 和 `fscanf()` 是否需要以文本模式打开文件
- c# - 解密长字节数组
- ruby-on-rails - 耙中止!ActiveRecord::NoDatabaseError: FATAL: 数据库“appname_development”不存在
- java - JSON 到 XML,在 json 键中带有 @ 字符
- json - 我无法从数据库加载数据以显示 UIPickerView 的结果
- .net - Powershell winforms 保存默认后台状态
- c - Valgrind 报告无效的读取(和写入)但程序继续执行