在 Blazor 中在子组件和父组件之间共享数据

介绍

可以在Blazor 中创建一个子组件并在另一个组件中重用它。我们将非常轻松地在这些组件之间共享数据。我们将创建一个自定义文本框作为子组件。此自定义文本框将显示文本框中的当前字符数,并在需要时限制字符总数。我将逐步解释所有操作。

在 Visual Studio 中创建 Blazor 应用程序

从 Visual Studio 中选择 Blazor 模板并创建 Blazor 应用程序。

我们可以在“Pages”文件夹中创建一个新的razor组件。

我们可以在组件中定义 HTML 标记。

<div class="float-right">
    <i>Total Characters : @TextLength/@LengthString</i>
</div>
<div class="form-group row mb-2">
    <label class="col-md-3 col-form-label" for="Name">@FieldName</label>
    <div class="col-md-7">
        <input class="form-control" type="text" placeholder="@FieldName" value="@Value" @oninput="OnValueChanged" maxlength="@MaxLength" />
    </div>
</div>

我们还可以在@code 块内添加 C# 代码。

@code {
    [Parameter]
    public string Value { get; set; }
    [Parameter]
    public string FieldName { get; set; }
    [Parameter]
    public int MaxLength { get; set; } = -1;
    [Parameter]
    public EventCallback<string> ValueChanged { get; set; }
    string LengthString;
    int TextLength;
    protected override void OnInitialized()
    {
        TextLength = Value.Length;
        LengthString = (MaxLength == -1) ? "Unlimited" : MaxLength.ToString();
    }
    private Task OnValueChanged(ChangeEventArgs e)
    {
        Value = e.Value.ToString();
        TextLength = Value.Length;
        return ValueChanged.InvokeAsync(Value);
    }
}

我们定义了三个参数属性“Value”,“FieldName”和“MaxLength”。

  • FieldName 用于在自定义文本框中显示字段名称和占位符值。
  • MaxLength 用于在需要时限制自定义文本框中的最大字符数。
  • Blazor 中的 FieldName 和 MaxLength 属性充当 Angular 中的 @Input 装饰器。这些属性用于将数据从父组件共享到子组件。
  • Value 属性充当 Angular 中的 @Output 装饰器。这将用于将数据从子组件共享回父组件。
  • 在 Angular 中,我们使用 EventEmitter 和 Output 装饰器将数据从子组件共享到父组件。在 Blazor 中,我们使用“EventCallback”参数将值从子组件发送到父组件。
  • 请注意,“Changed”后缀被添加到 value 属性参数。这是 Blazor 中使用的默认约定。

我们创建了一个“OnValueChanged”方法,并将其与 HTML 标记中输入控件的“@oninput”属性绑定。

CustomTextbox.razor

<div class="float-right">
    <i>Total Characters : @TextLength/@LengthString</i>
</div>
<div class="form-group row mb-2">
    <label class="col-md-3 col-form-label" for="Name">@FieldName</label>
    <div class="col-md-7">
        <input class="form-control" type="text" placeholder="@FieldName" value="@Value" @oninput="OnValueChanged" maxlength="@MaxLength" />
    </div>
</div>
@code {
    [Parameter]
    public string Value { get; set; }
    [Parameter]
    public string FieldName { get; set; }
    [Parameter]
    public int MaxLength { get; set; } = -1;
    [Parameter]
    public EventCallback<string> ValueChanged { get; set; }
    string LengthString;
    int TextLength;
    protected override void OnInitialized()
    {
        TextLength = Value.Length;
        LengthString = (MaxLength == -1) ? "Unlimited" : MaxLength.ToString();
    }
    private Task OnValueChanged(ChangeEventArgs e)
    {
        Value = e.Value.ToString();
        TextLength = Value.Length;
        return ValueChanged.InvokeAsync(Value);
    }
}

我们可以在父组件内添加这个子组件。我们可以创建一个新的父组件。

ParentComponent.razor

@page "/parentcomponent"
<CustomTextbox @bind-Value="name" FieldName="Name" MaxLength="20" />
<CustomTextbox @bind-Value="address" FieldName="Address" />
@code {
    string name = "Sarath Lal";
    string address = "Kakkanad";
}

我们在这个父组件内添加了两个自定义文本框子组件。“@bind-{parametername}”用于将子组件字段与父组件字段绑定。这里,“Value”是子组件中的字段名称。因此,我们将其用作“@bind-Value”。我们可以从父组件传递这两个输入参数“FieldName”和“MaxLength”。我没有为第二个子组件传递 MaxLength 属性。因此,运行时将为该组件分配默认值 -1。

我们可以修改共享组件“NavMenu”,为父组件添加导航。

NavMenu.razor

<div class="top-row pl-4 navbar navbar-dark">
    <a class="navbar-brand" href="">BlazorReusableComponent</a>
    <button class="navbar-toggler" @onclick="ToggleNavMenu">
        <span class="navbar-toggler-icon"></span>
    </button>
</div>
<div class="@NavMenuCssClass" @onclick="ToggleNavMenu">
    <ul class="nav flex-column">
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="" Match="NavLinkMatch.All">
                <span class="oi oi-home" aria-hidden="true"></span> Home
            </NavLink>
        </li>
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="counter">
                <span class="oi oi-plus" aria-hidden="true"></span> Counter
            </NavLink>
        </li>
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="fetchdata">
                <span class="oi oi-list-rich" aria-hidden="true"></span> Fetch data
            </NavLink>
        </li>
        <li class="nav-item px-3">
            <NavLink class="nav-link" href="parentcomponent">
                <span class="oi oi-list-rich" aria-hidden="true"></span> Parent Component
            </NavLink>
        </li>
    </ul>
</div>
@code {
    bool collapseNavMenu = true;
    string NavMenuCssClass => collapseNavMenu ? "collapse" : null;
    void ToggleNavMenu()
    {
        collapseNavMenu = !collapseNavMenu;
    }
}

我们可以运行该应用程序。

您会注意到菜单中出现了一个新的“父组件”链接。您可以点击该链接查看父组件。

我们在父组件中定义了两个自定义文本框组件。对于第一个文本框,我们给出了 20 个字符的限制,而对于第二个组件,则没有字符限制。这样,您可以在第二个文本框中输入无限个字符。总字符数也会显示在屏幕上。

结论

在本文中,我们在 Blazor 中创建了一个可重用的子组件,并可轻松在另一个父组件中使用。我们与子组件共享了父组件的数据,反之亦然。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/718925.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

购物App需要进行软件测试吗?包括哪些测试内容?

随着移动互联网的飞速发展&#xff0c;购物App在人们的日常生活中扮演着越来越重要的角色。然而&#xff0c;由于App开发的复杂性和用户对于购物体验的高要求&#xff0c;保证App的质量成为了一项重要的任务。而软件测试作为确保App质量的关键环节&#xff0c;也日益受到重视。…

文件操作(1)(C语言版)

前言&#xff1a; 为什么要学习文件操作&#xff1a; 1、如果大家写过一些代码&#xff0c;当运行结束的时候&#xff0c;这些运行结果将不复存在&#xff0c;除非&#xff0c;再次运行时这些结果才能展现在屏幕上面&#xff0c;就比如之前写过的通讯录。 现实中的通讯录可以保…

智游剪辑手机版发布!

耗时一个多月&#xff0c;手机版终于开发的差不多了&#xff0c;下面带大家一起来看下效果咋样吧&#xff01; 功能介绍 打开应用就可以直接看到我们的所有功能了&#xff0c;支持分类查看和关键词搜索功能&#xff0c;每个功能都可以查看帮助教程和收藏&#xff0c;点击即可进…

Day40

Day40 监听器 概念&#xff1a; 监听器用于监听web应用中某些对象信息的创建、销毁、增加&#xff0c;修改&#xff0c;删除等动作的 发生&#xff0c;然后作出相应的响应处理。当范围对象的状态发生变化的时候&#xff0c;服务器自动调用 监听器对象中的方法。 常用于统计在线…

AWS——01篇(AWS入门 以及 AWS之EC2实例及简单实用)AWS

AWS——01篇&#xff08;AWS入门 以及 AWS之EC2实例及简单实用&#xff09; 1. 前言 2. 创建AWS账户 3. EC2 3.1 启动 EC2 新实例 3.1.1 入口 3.1.2 设置名称 选择服务 3.1.3 创建密钥对 3.1.4 网络设置——安全组 3.1.4.1 初始设置 3.1.4.2 添加安全组规则&#xff08;开放新…

0X0-基于Sklearn的机器学习入门:聚类(上)

本节及后续章节将介绍深度学习中的几种聚类算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍几种相对基础的聚类算法&#xff0c;包括K-均值算法和均值漂移算法。 目录 X.1 聚类概述 X.1.1 聚类的种类 X.1.2 Sklearn聚类子模块 …

【JVM结构、JVM参数、JVM垃圾回收】

JVM&#xff1a;Java Virtual Machine java虚拟机 虚拟机&#xff1a;使用软件技术模拟出与具有完整硬件系统功能、运行在一个隔离环境中的计算机系统。 JVM官方文档&#xff1a;https://docs.oracle.com/javase/specs/jvms/se8/html/index.html java 一些命令 javac 将文件编…

【C++入门(3)】函数重载、引用

一、函数重载 1、函数重载概念 函数重载是指在同一作用域中&#xff0c;具有不同形参列表&#xff08;参数的 个数 或 类型 或类型顺序 不同&#xff09;的同名函数。 C语言中不允许同名函数的存在&#xff0c;如果一个程序中有两个函数的函数名完全相同&#xff0c;就会报错…

C#(C Sharp)学习笔记_多态【十九】

前言 个人觉得多态在面向对象编程中还比较重要的&#xff0c;而且不容易理解。也是学了一个下午&#xff0c;才把笔记写得相对比较完善&#xff0c;但仍欠缺一些内容。慢慢来吧…… 什么是多态&#xff1f; 基本概念 在编程语言和类型论中&#xff0c;多态&#xff08;Poly…

2024最新版Node.js下载安装及环境配置教程(非常详细)

一、进入官网地址下载安装包 官网&#xff1a;Node.js — Run JavaScript Everywhere 其他版本下载&#xff1a;Node.js — Download Node.js (nodejs.org) 选择对应你系统的Node.js版本 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xf…

OpenGL Super Bible 7th-Primitives, Pipelines, and Pixels图元、渲染管线与像素

简介 本文的原版为《OpenGL Super Bible 7th》,是同事给我的,翻译是原文+译文的形势。文章不属于机器直译,原因在于语言不存在一一对应的关系,我将尽可能的按照中国人看起来舒服的方式来翻译这些段子,如果段子让你感到身心愉悦,那还劳烦点个关注,追个更。如果我没有及时…

从0进入微服务需要了解的基础知识

文章目录 系统架构演化过程为什么要了解系统架构的演化过程技术发展认知技术选型与创新 演变过程单体架构分层-分布式集群微服务 分布式\集群\微服务 微服务中的核心要素-拆分原则项目拆分与复杂度微服务的拆分维度有哪些小结 微服务中的核心要素服务化进行拆分后一定是微服务&…

MFC扩展库BCGControlBar Pro v35.0新版亮点:重新设计的工具栏编辑器等

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v35.0已全新发布了&#xff0c;这个版本改进类Visual Studio 2022的视觉主题、增强对多个…

ChatGPT付费创作系统V3.0.2独立版 WEB+H5+小程序端 (H5端界面美化+Pika视频作品广场+SunoAI 文生歌)系统部署教程

播播资源GPT付费体验系统最新版系统是一款基于ThinkPHP框架开发的AI问答小程序&#xff0c;是基于国外很火的ChatGPT进行开发的Ai智能问答小程序。当前全民热议ChatGPT&#xff0c;流量超级大&#xff0c;引流不要太简单&#xff01;一键下单即可拥有自己的GPT&#xff01;无限…

MinIO Enterprise Cache:实现超性能的分布式 DRAM 缓存

随着计算世界的发展和 DRAM 价格的暴跌&#xff0c;我们发现服务器配置通常配备 500GB 或更多的 DRAM。当您处理大型部署时&#xff0c;即使是那些具有超高密度 NVMe 驱动器的部署&#xff0c;这些服务器上的服务器数量乘以 DRAM 也会迅速增加&#xff0c;通常达到几 TB。该 DR…

【Intel CVPR 2024】通过图像扩散模型生成高质量360度场景,只需要一个语言模型

在当前人工智能取得突破性进展的时代&#xff0c;从单一输入图像生成全景场景仍是一项关键挑战。大多数现有方法都使用基于扩散的迭代或同步多视角内绘。然而&#xff0c;由于缺乏全局场景布局先验&#xff0c;导致输出结果存在重复对象&#xff08;如卧室中的多张床&#xff0…

Android网络性能监控方案 android线上性能监测

1 Handler消息机制 这里我不会完整的从Handler源码来分析Android的消息体系&#xff0c;而是从Handler自身的特性引申出线上卡顿监控的策略方案。 1.1 方案确认 首先当我们启动一个App的时候&#xff0c;是由AMS通知zygote进程fork出主进程&#xff0c;其中主进程的入口就是Ac…

.Net OpenCVSharp生成灰度图和二值图

文章目录 前言一、灰度图二、二值图 前言 使用OpenCVSharp生成图片的灰度图和二值图 .Net 8.0版本&#xff0c;依赖OpenCvSharp4和OpenCvSharp4.runtime.win组件。 原图&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、灰度图 /// &…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 内存访问热度分析(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

Proteus8.13安装及使用

Proteus安装包下载地址 具体安装方法如下&#xff1a; 退出所有杀毒软件,右键以管理员身份运行 如果缺插件安装插件然后点击安装 如果遇到这种需要勾选的都勾选 安装插件完成 安装过程: 安装完成后桌面会自动出现图标 注意这个安装包是免破解的, 安装好以后可以直接使用 打…