You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何分离Razor组件中的音频元素?实现跨组件分位置调用

Blazor分离音频组件实现方案

1. 创建独立音频播放器组件

新建AudioPlayer.razor组件,将原音频元素封装进去,添加参数和播放控制方法:

<audio @ref="audioElement" controls>
</audio>

@code {
    private ElementReference audioElement;
    [Parameter] public string AudioUrl { get; set; }

    public async Task PlayAudio(string url)
    {
        AudioUrl = url;
        await audioElement.InvokeAsync("load");
        await audioElement.InvokeAsync("play");
    }
}

2. 改造CallComponent移除内部音频元素

删除CallComponent.razor里的<audio>标签,添加回调事件用于向父组件传递播放请求:

<tr>
    <td>
        <a @onclick="@(() => OnPlayAudio?.Invoke(Mp3.Url))"
           class="link-primary"
           role="button">
            @fileGroup.Key
        </a>
    </td>
</tr>

@code {
    [Parameter] public FileGroup fileGroup { get; set; } // 替换为你实际的文件组类型
    [Parameter] public Action<string> OnPlayAudio { get; set; }
}

3. 在Index.razor中集成组件

在需要展示音频的位置调用独立音频组件,同时处理CallComponent的播放回调:

<!-- 这里放置独立的音频组件,可自由调整位置 -->
<AudioPlayer @ref="audioPlayer" />

...
<tbody>
    @foreach (var fileGroup in GroupedAndSorted)
    {
        <CallComponent fileGroup="fileGroup" OnPlayAudio="HandlePlayAudio" />
    }
</tbody>
...

@code {
    private AudioPlayer audioPlayer;

    private void HandlePlayAudio(string url)
    {
        audioPlayer?.PlayAudio(url);
    }
}

这样改造后,音频组件只会被实例化一次,不会随循环重复创建,且可以放在页面任意位置,所有CallComponent的播放请求都会统一控制这个独立音频元素。

内容的提问来源于stack exchange,提问作者Addlon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 14:55:18