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

Blazor Webassembly如何通过状态容器从子组件调用父级带参方法

Blazor WebAssembly 状态容器实现跨层级组件调用带参方法方案

1. 改造AppState状态容器

我们需要在状态容器中新增带int参数的事件、页码存储属性,以及对应的设值触发方法:

public class AppState
{
    public string MyMessage { get; private set; }
    public string MyMsgToChildren { get; private set; }
    // 新增:存储当前页码
    public int CurrentPage { get; private set; }

    public event Action OnChange;
    // 新增:带int参数的分页变化事件
    public event Action<int> OnPageChanged;

    public void SetMessage(string msg)
    {
        MyMessage = msg;
        NotifyStateChanged();
    }

    public void SetMessageToChildren(string msg)
    {
        MyMsgToChildren = msg;
        NotifyStateChanged();
    }

    // 新增:设置页码并触发分页事件
    public void SetCurrentPage(int page)
    {
        CurrentPage = page;
        OnPageChanged?.Invoke(page);
        NotifyStateChanged();
    }

    private void NotifyStateChanged() => OnChange?.Invoke();
}

2. 修改父组件订阅分页事件

父组件不需要对外暴露方法,只需要在初始化时订阅状态容器的分页变化事件,触发时自动调用TargetMethod即可,记得销毁时取消订阅避免内存泄漏:

@page "/State"
@inject AppState AppState
@implements IDisposable

<p>============================</p>
<h3>Parent</h3>
<p>send from child:<b>@AppState?.MyMessage</b>  </p>
<div class="col-sm-6">
    <button @onclick="SendMsgTochildren">Send To Children</button>
</div>
<ChildComponent></ChildComponent>
<Child2Component></Child2Component>

@code {
    public string MsgToChildren { get; private set; } = "Hi, Im your father - ";
    int i = 0;

    protected override void OnInitialized()
    {
        AppState.OnChange += StateHasChanged;
        // 新增:订阅分页变化事件,触发时调用TargetMethod
        AppState.OnPageChanged += TargetMethod;
    }
    public void Dispose()
    {
        AppState.OnChange -= StateHasChanged;
        // 新增:销毁时取消订阅
        AppState.OnPageChanged -= TargetMethod;
    }

    void SendMsgTochildren()
    {
        i++;
        AppState.SetMessageToChildren(MsgToChildren + i.ToString());
    }

    /* 该方法会在子组件修改页码时自动被调用 */
    void TargetMethod(int page) 
    { 
        // 这里写你原有的分页逻辑即可
    }
}

3. 修改子组件(分页组件)触发分页

子/孙组件不需要和父组件做任何绑定,只需要注入AppState,需要切换页码时调用SetCurrentPage方法传入目标页码即可:

@inject AppState AppState
@implements IDisposable

<p>============================</p>
<h3>#1 Child(分页组件)</h3>
<p>send from Father :<b>@AppState?.MyMsgToChildren</b>  </p>

<div class="col-sm-6">
    <button @onclick="SetMessage">Send To Parent</button>
    <!-- 示例:点击切换到第2页 -->
    <button @onclick="()=>ChangePage(2)">跳转到第2页</button>
</div>
<p>============================</p>

@code {
    protected override void OnInitialized()
    {
        AppState.OnChange += StateHasChanged;
    }
    public void Dispose()
    {
        AppState.OnChange -= StateHasChanged;
    }
    void SetMessage()
    {
        AppState.SetMessage("Message From Child #1");
    }

    // 新增:切换页码方法,后续你的分页组件点击页码时调用这个方法即可
    void ChangePage(int targetPage)
    {
        AppState.SetCurrentPage(targetPage);
    }
}

方案优势

  • 完全解耦:分页组件和父组件/表格组件没有直接依赖,不管嵌套多少层级都可以正常工作
  • 复用性高:所有需要分页的页面,只要订阅AppState的OnPageChanged事件即可复用同一个分页组件
  • 符合需求:全程基于状态容器实现,不需要使用ComponentParameter、EventCallback、CascadingValue等其他组件通信方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:30:01