首页 > 其他分享 >Blazor 组件通信

Blazor 组件通信

时间:2024-12-09 15:09:58浏览次数:5  
标签:set get NET 通信 组件 Blazor public

Blazor组件通信

组件概述

前提知识:

  1. 组件概述
  2. ASP.NET Core Razor 组件

微软官方文档中关于组件的说明如下:

组件 是内置到 .NET程序集.NET C#类组件类 通常以Razor标记页的形式编写。

② Blazor中的 组件 正式称为Razor组件,非正式地称为Blazor组件

Razor 是一种语法,用于将HTML标记与专为提高开发人员工作效率而设计的C#代码结合在一起。

组件 在内存中以浏览器文档对象模型(DOM)的形式存在,这种形式被称为呈现树,用于以灵活高效的方式更新UI。

组件通信

前提知识:

  1. 组件参数
  2. 级联值和参数
  3. 事件处理

组件参数

组件参数将数据传递给组件,使用组件类中的公共C#属性 [Parameter]特性 进行定义。

代码说明: ParameterChild组件通过组件参数的方式从ParameterParent组件接收TitleBody的值。

代码示例:(提示:以下代码改编于微软官方文档 ASP.NET Core Razor 组件 - 组件参数

PanelBody.cs

public class PanelBody
{
    public string? Text { get; set; }
    public string? Style { get; set; }
}

ParameterChild.razor

<h1>This is a child component.</h1>

<div>
    <div>@Title</div>

    <div style="font-style:@Body.Style">
        @Body.Text
    </div>
</div>

@code {
    [Parameter]
    public string Title { get; set; }

    [Parameter]
    public PanelBody Body { get; set; }
}

ParameterParent.razor

@page "/parameter-parent"

<h1>This is a parent component.</h1>

<ParameterChild Title="Set by Parent"
                Body="@(new PanelBody(){Text = "Set by Parent.", Style = "italic"})" />

级联值和参数

① 级联值和参数提供了一种可将数据沿组件层次结构从祖先组件向下流向任意数量的后代组件的方法。
② 不同于组件参数,级联值和参数不需要对使用数据的每个后代组件分配特性。
③ 级联值和参数还允许组件在组件层次结构中相互协调。

级联参数通过CascadingValue组件和[CascadingParameter]特性来实现:

  • CascadingValue组件:用于在组件树种向下传递数据
  • [CascadingParameter]特性用于在子组件种接收通过CascadingValue组件传递的数据

常用方式

代码说明:TitleBody的参数值沿组件层次结构从ParameterParent组件向下流动到ParameterChild组件

代码示例:(提示:以下代码改编于微软官方文档 - ASP.NET Core Blazor 级联值和参数

PanelBody.cs

public class PanelBody
{
    public string? Text { get; set; }
    public string? Style { get; set; }
}

ParameterChild.razor

<h1>This is a child component.</h1>

<div>
    <div>@Title</div>

    <div style="font-style:@Body.Style">
        @Body.Text
    </div>
</div>

@code {
    [CascadingParameter(Name = "ChildTitle")]
    public string Title { get; set; }

    [CascadingParameter(Name = "ChildBody")]
    public PanelBody Body { get; set; }
}

ParameterParent.razor

@page "/parameter-parent"

<h1>This is a parent component.</h1>

<CascadingValue Value="Set by Parent" Name="ChildTitle">
    <CascadingValue Value="@Body" Name="ChildBody">
        <ParameterChild />
    </CascadingValue>
</CascadingValue>

@{
    public PanelBody Body{ get; set; } = new PanelBody(){
        Text = "Set by Parent",
        Style = "italic"
    }
}

跨组件层次结构传递数据

前提知识:

  1. RenderFragment委托
  2. 子内容呈现片段

代码说明:父组件设置子组件的内容

代码示例:(提示:以下代码改编于微软官方文档 - ASP.NET Core Razor 组件 - 子内容呈现片段

ChildComponent.cs

<div>
    @ChildContent
</div>

@code {
    [Parameter]
    public RenderFragment? ChildContent { get; set; }
}

ParentComponent.cs

<ChildComponent>
    <p>在父组件设置子组件的内容<p>
</ChildComponent>

代码说明:在IndexPage页中展示Tab页集合

代码示例:(提示:以下代码改编于微软官方文档 - ASP.NET Core Blazor 级联值和参数

IndexPage.razor

在IndexPage页中显示三个Tab页。其中,TabSet用于组织和呈现Tab组件,Tab组件用于显示Tab页内容。

@page "/index_page"

<h3>级联参数</h3>

<TabSet>
    <Tab Title="First tab">
        <p>The first tab!</p>
    </Tab>

    <Tab Title="Second tab">
        <p>The second tab!</p>
    </Tab>

    <Tab Title="Third tab">
        <p>The third tab!</p>
    </Tab>
</TabSet>

TabSet.razor

其中,TabSet组件通过 <CascadingValue Value="this"> 将自身的实例作为参数传递给子组件。

注:为什么组件也可以作为参数传递呢?因为组件本质上是以的形式存在。

<CascadingValue Value="this">
    <ul>
        @ChildContent
    </ul>
</CascadingValue>

<div>
    @ActiveTab?.ChildContent
</div>

@code {
    [Parameter]
    public RenderFragment? ChildContent{ get; set; }

    public Tab? ActiveTab{ get; private set; }

    public void AddTab(Tab tab)
    {
        if (ActiveTab is null)
        {
            SetActiveTab(tab);
        }
    }

    public void SetActiveTab(Tab tab)
    {
        if (ActiveTab != tab)
        {
            ActiveTab = tab;
            StateHasChanged();
        }
    }
}

Tab.razor

<li>
    <a @onclick="ActivateTab" class="nav-link @TitleCssClass" role="button">
        @Title
    </a>
</li>

@code {
    [CascadingParameter]
    public TabSet? ContainerTabSet{ get; set; }

    [Parameter]
    public string? Title{ get; set; }

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

    public string? TitleCssClass => ContainerTabSet?.ActiveTab == this ? "active" : null;

    protected override void OnInitialized()
    {
        ContainerTabSet?.AddTab(this);
    }

    public void ActivateTab()
    {
        ContainerTabSet?.SetActiveTab(this);
    }
}

事件处理

① 嵌套组件的常见方案是在发生子组件事件时,在父组件中执行某个方法。
② EventCallback是一种用于处理事件的标准机制,它允许子组件触发事件并将数据传递回父组件。
③ 通过EventCallback,可以定义一个委托,当事件发生时,父组件中的相应方法会被调用,从而实现组件间的交互和数据传递。

前提知识:

  1. 委托
  2. 事件

代码说明:子组件从父组件接收EventCallback委托,设置子组件按钮的onclick事件处理程序

代码示例:(提示:以下代码改编于微软官方文档 - ASP.NET Core Blazor 事件处理 - EventCallback

ChildComponent.razor

<div>
    <button @onclick = "OnClickCallback"> 
        Trigger a Parent component method 
    </button>
</div>

@code{
    [Parameter]
    public EventCallback<MouseEventArgs> OnClickCallback { get; set; }
}

ParentComponent.razor

@page "/parent_page"

<ChildComponent OnClickCallback="ShowMessage" />

<p>@_msg</p>

@code{
    private string? _msg;

    private void ShowMessage(MouseEventArgs e)
    {
        _msg = $"Blaze a new trail with Blazor! ({e.ScreenX}:{e.ScreenY})"
    }
}

参考文章

  1. ASP.NET Core Razor 组件:
    https://learn.microsoft.com/zh-cn/aspnet/core/blazor/components/?view=aspnetcore-6.0#component-parameters

  2. 级联值和参数:
    https://learn.microsoft.com/zh-cn/aspnet/core/blazor/components/cascading-values-and-parameters?view=aspnetcore-6.0

  3. ASP.NET Core Blazor 事件处理:
    https://learn.microsoft.com/zh-cn/aspnet/core/blazor/components/event-handling?view=aspnetcore-6.0

文章声明

  • 内容准确性:我会尽力确保所分享信息的准确性和可靠性,但由于个人知识有限,难免会有疏漏或错误。如果您在阅读过程中发现任何问题,请不吝赐教,我将及时更正。

标签:set,get,NET,通信,组件,Blazor,public
From: https://www.cnblogs.com/wubing7755/p/18586144

相关文章

  • 22Java之网络编程(IP地址、端口号、协议、UDP通信、TCP通信、BS架构程序)
    一、网络编程概述同学们,今天我们学习的课程内容叫网络编程。意思就是编写的应用程序可以与网络上其他设备中的应用程序进行数据交互。网络编程有什么用呢?这个就不言而喻了,比如我们经常用的微信收发消息就需要用到网络通信的技术、在比如我们打开浏览器可以浏览各种网络、视频......
  • HarmonyOS Next 入门实战 - 基础组件、页面实现
    基础组件常用组件Text:显示文本内容Image:显示图片Button:显示一个按钮Column:纵向布局Row:横向布局List:列表各组件的用法Text("文本组件").fontColor(Theme.Color.textPrimary).fontWeight(FontWeight.Medium).fontSize(20)Image($r('app.media.banner'))......
  • DevExpress Blazor UI v24.1新版亮点:表单布局、富文本编辑器全新升级
    DevExpress BlazorUI组件使用了C#为BlazorServer和BlazorWebAssembly创建高影响力的用户体验,这个UI自建库提供了一套全面的原生BlazorUI组件(包括PivotGrid、调度程序、图表、数据编辑器和报表等)。DevExpress Blazor控件目前已经升级到v24.1版本了,此版本文件管理器、表单布......
  • 使用js写一个批量上传文件的组件
    importReact,{useState}from'react';functionBulkUpload(){const[selectedFiles,setSelectedFiles]=useState([]);const[uploadProgress,setUploadProgress]=useState({});const[uploadStatus,setUploadStatus]=useState({});co......
  • 《跟我一起学“Harmony-ArkTS”》——常用组件及其属性和事件
    一、文本组件Text是文本组件,通常用于展示用户视图,如显示文章的文字。Text可通过以下两种方式来创建:string字符串@Entry@ComponentstructIndex{build(){Column(){Text('我是字符串')}}}引用Resource资源资源引用类型可以通过$r创建Resou......
  • 【ArkTS】列表组件的“下拉刷新”和“上拉加载”
    系列文章目录【ArkTS】关于ForEach的第三个参数键值【ArkTS】“一篇带你读懂ForEach和LazyForEach”【小白拓展】【ArkTS】“一篇带你掌握TaskPool与Worker两种多线程并发方案”【ArkTS】一篇带你掌握“语音转文字技术”--内附详细代码【ArkTS】技能提高–“用户授......
  • 鸿蒙UI开发快速入门 —— part06:组件状态管理之@State装饰器1、说在前面的话 在前五
    这篇文章是关于鸿蒙UI开发中组件状态管理的@State装饰器的介绍。包括引入状态概念构建动态交互界面,@State装饰变量特点,如与组件渲染绑定、私有且特定类型等,以及可观察的变化类型和框架行为。还通过示例介绍了@State变量的初始化流程,最后提及后续将分别介绍其他装饰器。关联......
  • 鸿蒙UI开发快速入门 —— part07:组件状态管理之@Prop/@Link装饰器
    1、前言我们在上一章学习了@State装饰器,@State装饰器的作用范围仅仅在当前组件,接下来,我们讨论如何从父组件中传入参数到子组件,让子组件随着父组件的状态发生变化。本章将要介绍的就是:@Props装饰器。2、@Props装饰器@Prop装饰的变量可以和父组件建立单向的同步关系。@Prop装饰的......
  • 鸿蒙UI开发快速入门 —— part05:组件的样式复用
    1、为什么要样式复用?如果每个组件的样式都需要单独设置,在开发过程中会出现大量代码在进行重复样式设置,虽然可以复制粘贴,但为了代码简洁性和后续方便维护,样式的复用就很有必要了。为此,鸿蒙推出了可以提炼公共样式进行复用的装饰器@Styles;2、@Styles装饰器@Styles装饰器可以将......
  • Vue组件间数据传递
    场景:页面中有搜索、列表两个组件,搜索组件传出搜索字符串,需要流入列表组件,使用页面做中转。searchbar内部弹出searchevent:this.$emit('searchevent',val);页面定义searchprocess方法响应searchevent并接收参数,赋值给自身预定义变量。页面将自带参数赋值后传入列表组件的search......