【问题标题】:Conditional div with blazor server带有 Blazor 服务器的条件 div
【发布时间】:2021-10-21 14:02:55
【问题描述】:

这是我想做的:

@if (condition)
{
  <div class="test">
}
<span class="test2">...</span>
@if (condition)
{
  </div>
}

这不起作用,因为 Blazor 编译器认为 div 永远不会关闭。

所以我需要这样做:

@if (condition)
{
  <div class="test">
        <span class="test2">...</span>
  </div>
}
else
{
   <span class="test2">...</span>
}

它工作正常,但我的跨度有很大的代码冗余。

我怎样才能正确地做到这一点?

请注意 div 和 span 是示例。实际上,我的代码更大。

谢谢

【问题讨论】:

  • 你能把class设置成条件而不是div吗?使用空白类渲染 div 不会导致问题?
  • 不,我不能。如果实际上有多行代码,则 div 是一个示例。
  • 回答后看到您的评论,我添加了第二种可能性。如果这些都不起作用,则可能值得进一步扩展您问题中的示例。
  • 也许你应该把它分解成单独的组件。我知道这是一个简单的例子,但更详细地说明你为什么要首先这样做会很好。
  • [礼貌] 你可能不喜欢这种语法,但它就是这样工作的。如果您想要更紧凑的代码,请直接创建类文件并使用 RenderFragmentBuilder 构建 RenderFragment。我同意这可能有点冗长......但是......

标签: razor blazor blazor-server-side


【解决方案1】:

您看到的实际上是 Razor 语法问题,而不是 Blazor 问题。这个question and answer 盖好了。

因此,您可以执行第一个示例中尝试执行的操作,但还有其他方法可以解决该问题,至少其中一种是 Blazor 特定的(毫无疑问):

使class 有条件

您可以将class 本身设置为有条件的,而不是尝试不呈现div

因此,您可以在页面的 code 部分声明一个属性:

@code {

    string myClass = "";

    protected override void OnInitialized()
    {
        if (condition) 
        {
            myClass = "whatever";
        }
    }

}

然后在你的剃须刀中使用它:

<div class='@myClass'> 
    <span class="test2">...</span>
</div>

这样跨度只在页面上一次。

将通用代码拆分成单独的组件

另一种方法是将公共部分(在这种情况下为跨度)制作成一个单独的组件,然后有条件地渲染该组件:

@if (condition)
{
    <div class="test">
        <YourComponent />
    </div>
}
else
{
    <YourComponent />
}

这对于您示例中的 span 来说可能有点过头了,但在新组件将替换多行代码的地方更有意义。

【讨论】:

  • 我想使用一个组件,但我需要为此创建一个附加文件...
  • @Bob5421,抱歉,没有关注你,额外文件有问题吗?我在答案中添加了指向另一个问题的链接,提供了更广泛的背景信息。
猜你喜欢
  • 2019-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多