在 Blazor 组件中使用 Javascript addEventListener

Cod*_*ewb 1 c# blazor blazor-server-side blazor-jsinterop

我有一个在服务器端呈现的 Blazor 组件。我想在里面有一些可折叠的div。然而,由于代码是服务器渲染的,因此不会执行 Javascript,因此这些部分不会崩溃。

这是我的文件中的代码script.js

var coll = document.getElementsByClassName("collapsible");
var i;

for (i = 0; i < coll.length; i++) {
    coll[i].addEventListener("click", function() {
        this.classList.toggle("active");
        var content = this.nextElementSibling;
        if (content.style.maxHeight){
            content.style.maxHeight = null;
        } else if(window.matchMedia("(max-width:1440px)")){
            // content.style.maxHeight = content.scrollHeight + "px";
            content.style.maxHeight = "20vh";
        } 
        else {
            content.style.maxHeight = "50vh";
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这是我的main.cshtml文件:

<component type="typeof(Main)" render-mode="Server" />

<script src="~/js/script.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

最后是我的Main带有可折叠部件的组件:

@using Microsoft.AspNetCore.Components;
@using Microsoft.AspNetCore.Components.Web;

<div class="collapsible">
    <label for="tutu">HEADER</label>
    <div id="mybtn" class="btn-rch"></div>
</div>

<div class="tutu content flex-column">
    <p>CONTENT HIDDEN IN COLLAPSE</p>
</div>

<div class="collapsible">
    <label for="tutu">HEADER</label>
    <div id="mybtn" class="btn-rch"></div>
</div>

<div class="tutu content flex-column">
    <p>CONTENT HIDDEN IN COLLAPSE</p>
</div>

<div class="collapsible">
    <label for="tutu">HEADER</label>
    <div id="mybtn" class="btn-rch"></div>
</div>

<div class="tutu content flex-column">
    <p>CONTENT HIDDEN IN COLLAPSE</p>
</div>

@code {

}
Run Code Online (Sandbox Code Playgroud)

如果我使用render-mode="Static"而不是render-mode="Server"它的工作原理,但由于我的组件内部将有事件对我来说是不可能的。例如,我如何使用 JSInterop 调用我的 JS 脚本来使我的 div 折叠?

MrC*_*tis 5

您可以在 Blazor 中完成这一切。下面是我认为您想要实现的目标的一个简单的工作示例。

这是一个可折叠的 div 组件。

CollapseDiv.razor

<div @onclick="Collapse" style="cursor:pointer;" >
    <h2>@Label</h2>
</div>
@if (!Collapsed)
{
    <div>@ChildContent</div>
}

@code {

    [Parameter] public RenderFragment ChildContent { get; set; }

    [Parameter] public RenderFragment Label { get; set; }

    bool Collapsed;

    void Collapse(MouseEventArgs e)
    {
        Collapsed = !Collapsed;
    }
}
Run Code Online (Sandbox Code Playgroud)

这是演示它的页面:

折叠剃刀

@page "/collapse"
<h3>Collapse Test Page</h3>

<CollapseDiv>
    <Label>I'm Collapsible</Label>
    <ChildContent>
        I'm the collapsed content!
    </ChildContent>
</CollapseDiv>
<br />
<br />
<CollapseDiv>
    <Label>I'm Collapsible Too</Label>
    <ChildContent>
        More collapsed content!
    </ChildContent>
</CollapseDiv>

@code {

}
Run Code Online (Sandbox Code Playgroud)

这里的关键是:忘记用 Javascript 操作 DOM,构建组件。

您应该能够采用它来满足您的需求。