Run/Hide 从数据库中获取数据时加载微调器

Run/Hide spinner loading when fetching data from database

我从大数据库中获取数据,第一个查询需要大约 10-12 秒才能使用网格视图获取我的数据 - 我将 Blazer 与实体一起使用。

我想在加载数据时显示微调器,并且在获取所有数据后应停止或隐藏微调器。不管微调器的位置如何。

这是我的 CSS:

.loader {
    display: none;
    top: 50%;
    left: 50%;
    position: absolute;
    transform: translate(-50%, -50%);
  }
  
  .loading {
    border: 2px solid #ccc;
    width: 60px;
    height: 60px;
    border-radius: 50%;
    border-top-color: #1ecd97;
    border-left-color: #1ecd97;
    animation: spin 1s infinite ease-in;
  }
  
  @keyframes spin {
    0% {
      transform: rotate(0deg);
    }
  
    100% {
      transform: rotate(360deg);
    }
  }

这是我的 js 函数:

spinner: function(){
        document.getElementsByClassName("loader")[0].style.display = "block";

HTML :

<div class="col-auto offset-5">


        <button class="btn btn-info " @onclick="GetTags" style="width: 175px;">Get Tags</button>
   <div class="loader">
  <div class="loading">
  </div>
</div>
    </div>

这是我的 blazor 方法,它从数据库中获取数据并调用 js 方法 'spinner'

public async Task GetTags()
    {
        await JSRuntime.InvokeVoidAsync("myMap.spinner");
        AllTags = await Task.Run(() => tagsService.Map(InputRadius, SelectedTimeDate, Long, Lat));
        

    }

当前结果是,当我单击 GetTags 按钮时,该按钮转换为微调器并且仍在加载,即使数据已完全收集。

我确实认为我做错了什么,但我不知道那是什么。

有什么提示吗?

您首先需要更新 JavaScript 以包含一个 hide 和一个 show 函数,或者包含一个 parameter 来指明是哪个。

我还建议使用 querySelector 而不是 getElementsByClassName,因为您想使用唯一或第一个 .loader 元素。

spinner: {
    show: function() {
        document.querySelector(".loader").style.display = "block";
    },
    hide: function() {
        document.querySelector(".loader").style.display = "none";
    }
}

然后在您的 Blazor 代码中:

public async Task GetTags()
{
    await JSRuntime.InvokeVoidAsync("myMap.spinner.show");
    //Your code that takes time to execute
    await JSRuntime.InvokeVoidAsync("myMap.spinner.hide");
}