【问题标题】:How can i navigate to another blazor page but without state reset我如何导航到另一个 Blazor 页面但没有状态重置
【发布时间】:2021-12-06 04:27:31
【问题描述】:

我有一个执行 while 循环并执行一些请求的脚本


<p>Result @Content</p>

private string Content;
public async Task StartAsync() 
{
    while(!taskCanel) {  
          Content = await webSocket.SendAsync(..); 
          StateHasChanged();
          await Task.Delay(15000);
    }
   
}

但是每当我使用导航栏切换另一个页面然后返回到此页面时,它都会重置所有内容,就像它创建我的剃须刀页面的新实例一样。

如何在不丢失所有状态和内容的情况下导航到页面?

【问题讨论】:

  • 它不会“重置”任何东西。 Web 应用程序中没有隐式存储。除非您明确存储,否则不会保留任何内容
  • @PanagiotisKanavos 创建一个 blazor 模板并运行它,然后在导航栏之间切换,您会看到它将所有内容重置为默认值
  • 同样,没有任何内容被重置,因为除非您明确保存,否则不会保留任何内容。每个导航本质上都会创建一个新表单。即使在 Windows 窗体应用程序中,关闭窗体并打开新窗体也不会保留旧窗体的状态,除非您明确将其保存在某处
  • @PanagiotisKanavos 在 winforms 中,您可以隐藏和显示表单,除 nvm 外,所有内容都将保留。我怎么能做一些东西而不是保留一切的navigationmanager?
  • 但你很少这样做......我希望。表单关闭按钮实际上关闭了表单,它并没有隐藏它。无论如何,在 Web 应用程序或 SPA 中,当您导航时,您将关闭旧页面并打开新页面。这些不是表格。如果您想保留信息,则必须存储它。

标签: c# asp.net-core blazor


【解决方案1】:

当您导航到另一个页面时,当前页面中的所有变量都应该被释放。这是标准程序。状态管理采用不同的方法。如果要保留当前页面的状态,则必须订阅全局对象中的更改并拉动更改 onInit 钩子或 onafterrender 钩子。还有更多用于状态管理的库。部分介绍here

【讨论】:

  • 好的,但是我怎样才能管理启动的任务呢?然后,当我切换页面时,我的 Content 属性总是会更新,就像我留在页面上时它不再更新一样
  • 您可以通过创建一个 blazor 模板进行尝试,然后执行循环以增加计数器而不是单击按钮,如果您然后单击导航栏另一个页面并返回,您会发现它不是仅当您再次更改标签时才会更新
  • 你想在这里实现什么?打开 WebSocket 连接并与当前组件同步实时数据?
  • 它应该是一个 websocket 聊天,但每次我导航到另一个页面时,它都会重置所有内容。那是唯一的问题。看起来 NavigateTo 创建了一个剃刀页面的新实例
  • 这应该是行为。如果您再次访问该页面,则应再次从服务器中提取数据。
【解决方案2】:

您需要将数据和演示文稿分开。您的数据、获取和管理数据的方式属于范围 DI 服务。您的 UI 通过注入访问此 DI 服务并显示来自该服务的信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-20
    相关资源
    最近更新 更多