Angular中组件之间的传值

news2024/11/25 16:52:16

Angular中组件之间的传值


文章目录

  • Angular中组件之间的传值
    • 前言
    • 一、父亲向儿子传值
    • 二、儿子向父亲传值
    • 三、爷爷向孙子传值
    • 四、兄弟之间的传值


前言

Angular的组件是构成应用的基础单元,它们封装了HTML模板、TypeScript代码以及CSS样式,以实现特定的功能。组件的目的是为了复用和减少代码的重复度。

以下是对Angular组件的详细介绍:

  1. 组件的组成:
    HTML模板(Template):定义了组件的视图结构,用于展示数据并响应用户交互。
    TypeScript代码(Script):包含组件的类定义、业务逻辑以及数据模型。这个类通常使用@Component()装饰器进行标记,装饰器中包含了组件的元数据,如选择器(Selector)、模板URL等。
    CSS样式(Style):定义了组件的外观和样式。

  2. 组件的创建:
    使用Angular CLI(命令行界面)可以快速创建组件。通过执行ng generate component 组件名命令,Angular CLI会自动生成组件所需的文件,包括.ts(TypeScript代码文件)、.html(HTML模板文件)和.css(CSS样式文件)。
    手动创建组件时,需要分别创建这三个文件,并在TypeScript代码文件中使用@Component()装饰器来定义组件的元数据。

  3. 组件的核心任务:
    将数据渲染到视图:组件负责将数据模型中的数据渲染到HTML模板中,以便在视图中展示给用户。
    监听用户在视图上的操作:组件可以监听用户在视图上的各种操作(如点击、输入等),并执行相应的业务逻辑。

  4. 组件的复用:
    Angular组件具有很好的复用性。一旦创建了一个组件,就可以在其他组件或应用程序中重复使用它,从而减少了代码的重复度,提高了开发效率。

  5. 依赖注入:
    Angular组件可以通过依赖注入(Dependency Injection)机制来满足其执行功能所需的服务或对象。这使得组件可以更加灵活和可配置。

总的来说,Angular组件是构建复杂Web应用程序的关键部分。通过创建可复用的组件,开发人员可以更加高效地构建和维护代码库,并减少错误和重复工作。

一、父亲向儿子传值

首先使用命令创建两个组件,一个parent一个child

ng g component components/parent
ng g component components/child

@Input(): 用于从父组件接收数据。当你想在组件之间传递数据时,可以在子组件中使用@Input()装饰器来定义一个输入属性。父组件可以通过这个属性将数据传递给子组件。

在这里插入图片描述

parent.component.ts

import { Component, OnInit } from '@angular/core';
import { ChildComponent } from "../child/child.component";

@Component({
    selector: 'app-parent',
    standalone: true,
    templateUrl: './parent.component.html',
    styleUrl: './parent.component.css',
    imports: [ChildComponent]
})
export class ParentComponent  {
   value = 'parent的value';
}

parent.component.html

<p>parent works!</p>

<app-child [childValue]="value"></app-child>

<p>{{ value }}</p>

<p>parent works end!</p>

child.component.ts

import { Component, Input, EventEmitter , Output } from '@angular/core';

@Component({
  selector: 'app-child',
  standalone: true,
  imports: [],
  templateUrl: './child.component.html',
  styleUrl: './child.component.css'
})
export class ChildComponent {
  @Input() childValue:string = "Hello, I am child component.";
}

child.component.html

<p>child works!</p>

<p>{{childValue}}</p>

<p>child works end!</p>

最后在app.component.ts中引入ParentComponent

import { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';

import { ParentComponent } from './components/parent/parent.component';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [RouterOutlet,ParentComponent],
  templateUrl: './app.component.html',
  styleUrl: './app.component.css'
})
export class AppComponent {
  title = 'first-component';
}

app.component.html中使用组件

<p>这个是app</p>

<app-parent></app-parent>

运行效果

在这里插入图片描述

二、儿子向父亲传值

@Output(): 用于从子组件发送事件到父组件。你可以使用@Output()装饰器来定义一个输出属性,并通过这个属性发出事件。父组件可以监听这个事件并作出响应。

child.component.ts

import { Component, Input, EventEmitter , Output } from '@angular/core';

@Component({
  selector: 'app-child',
  standalone: true,
  imports: [],
  templateUrl: './child.component.html',
  styleUrl: './child.component.css'
})
export class ChildComponent {

  @Input() childValue:string = "Hello, I am child component.";

  @Output() valueSend = new EventEmitter<string>();

  sendValue() {
    this.valueSend.emit('这是child组件发送的值');
  }
}

child.component.html

<p>child works!</p>

<p>{{childValue}}</p>

<button (click)="sendValue()">传给父组件</button>

<p>child works end!</p>

parent.component.ts

import { Component, OnInit } from '@angular/core';
import { ChildComponent } from "../child/child.component";

@Component({
    selector: 'app-parent',
    standalone: true,
    templateUrl: './parent.component.html',
    styleUrl: './parent.component.css',
    imports: [ChildComponent]
})
export class ParentComponent  {

   value = 'parent的value';
   iCount =1;

   receiveValue(value: string) {

    this.value=value + "" + this.iCount++;
    console.log(value); 
  }
}

parent.component.html

<p>parent works!</p>

<app-child [childValue]="value" (valueSend)="receiveValue($event)"></app-child>

<p>{{ value }}</p>

<p>parent works end!</p>

运行效果

在这里插入图片描述

点击按钮

在这里插入图片描述

在这里插入图片描述

三、爷爷向孙子传值

grandfather.component.ts

import { Component } from '@angular/core';
import { ParentComponent } from "../parent/parent.component";

@Component({
    selector: 'app-grandfather',
    standalone: true,
    templateUrl: './grandfather.component.html',
    styleUrl: './grandfather.component.css',
    imports: [ParentComponent]
})
export class GrandfatherComponent {
  grandfatherVaule = '爷爷组件的值';
}

grandfather.component.html

<p>grandfather works!</p>

<app-parent [grandparentValue]="grandfatherVaule"></app-parent>

<p>grandfather works end!</p>

parent.component.ts

import { Component, Input, OnInit } from '@angular/core';
import { ChildComponent } from "../child/child.component";

@Component({
    selector: 'app-parent',
    standalone: true,
    templateUrl: './parent.component.html',
    styleUrl: './parent.component.css',
    imports: [ChildComponent]
})
export class ParentComponent  {

   value = 'parent的value';
   iCount =1;

   @Input() grandparentValue: string = ''; // 假设这个值是从爷爷组件传入的


   receiveValue(value: string) {

    this.value=value + "" + this.iCount++;
    console.log(value); 
  }

}

parent.component.html

<p>parent works!</p>
<app-child [parentValue]="grandparentValue"></app-child>
<p>{{ value }}</p>
<p>parent works end!</p>

child.component.ts

import { Component, Input, EventEmitter , Output } from '@angular/core';

@Component({
  selector: 'app-child',
  standalone: true,
  imports: [],
  templateUrl: './child.component.html',
  styleUrl: './child.component.css'
})
export class ChildComponent {

  @Input() childValue:string = "Hello, I am child component.";

  @Output() valueSend = new EventEmitter<string>();

  @Input() parentValue: string='';
  sendValue() {
    this.valueSend.emit('这是child组件发送的值');
  }
}

child.component.html

<p>child works!</p>

<p>{{childValue}}</p>

<button (click)="sendValue()">传给父组件</button>

<p>{{parentValue}}</p>

<p>child works end!</p>

运行效果

在这里插入图片描述

四、兄弟之间的传值

同样创建三个组件

在这里插入图片描述

brother-father.component.ts

import { Component } from '@angular/core';
import { BrotherOneComponent } from "../brother-one/brother-one.component";
import { BrotherTwoComponent } from "../brother-two/brother-two.component";

@Component({
    selector: 'app-brother-father',
    standalone: true,
    templateUrl: './brother-father.component.html',
    styleUrl: './brother-father.component.css',
    imports: [BrotherOneComponent, BrotherTwoComponent]
})
export class BrotherFatherComponent {
  receiveValue(value: string) {
    console.log(value); // 将打印 "Value from Child"
  }
  sharedValue = 'Shared value between brother';
}

brother-father.component.html

<p>brother-father works!</p>

<app-brother-one [sharedValue]="sharedValue"></app-brother-one>
<app-brother-two [sharedValue]="sharedValue"></app-brother-two>

<p>brother-father works end!</p>

brother-one.component.ts

import { Component, Input } from '@angular/core';

@Component({
  selector: 'app-brother-one',
  standalone: true,
  imports: [],
  templateUrl: './brother-one.component.html',
  styleUrl: './brother-one.component.css'
})
export class BrotherOneComponent {
  @Input() sharedValue: string='';
}

brother-one.component.html

<p>brother-one works!</p>

<p>brother-one的值为{{sharedValue}}</p>

<p>brother-one works end!</p>

brother-two.component.ts

import { Component,Input } from '@angular/core';

@Component({
  selector: 'app-brother-two',
  standalone: true,
  imports: [],
  templateUrl: './brother-two.component.html',
  styleUrl: './brother-two.component.css'
})
export class BrotherTwoComponent {
  @Input() sharedValue: string='';
}

brother-two.component.html

<p>brother-two works!</p>

<p>brother-two的值为{{sharedValue}}</p>

<p>brother-two works end!</p>

app.component.ts

import { Component } from '@angular/core';
import { RouterOutlet } from '@angular/router';
import { ParentComponent } from './components/parent/parent.component';
import { GrandfatherComponent } from "./components/grandfather/grandfather.component";
import { BrotherFatherComponent } from './components/brother-father/brother-father.component';

@Component({
    selector: 'app-root',
    standalone: true,
    templateUrl: './app.component.html',
    styleUrl: './app.component.css',
    imports: [RouterOutlet, ParentComponent, GrandfatherComponent,BrotherFatherComponent]
})
export class AppComponent {
  title = 'first-component';
}

parent.component.html

<p>parent works!</p>

<app-child [parentValue]="grandparentValue"></app-child>

<p>{{ value }}</p>

<p>parent works end!</p>

运行效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows10系统中CANoe字体异常问题解决办法

Windows10系统中CANoe/CANalyzer字体异常问题解决办法 一、问题: 在Windows10中文系统中,CANoe/CANalyzer的一些窗口会显示异常的字体,大部分其他窗口的字体却是正常的? 异常的字体如下: 二、问题说明 CANoe/CANalyzer的开发过程中使用了多种对话框技术。一些对话框使…

Qt——入门基础

目录 Qt入门第一个应用程序 main.cpp widget.h widget.cpp widget.ui .pro Hello World程序 对象树 编辑框 按钮 Qt 窗口坐标系 Qt入门第一个应用程序 main.cpp 这就像一开始学语言时都会打印一个“Hello World”一样&#xff0c;我们先来看看创建好一个项目后&…

互联网十万个为什么之什么是云计算

云计算是一种通过互联网提供计算资源和服务的技术。它允许用户随时随地访问和使用云平台上的数据、软件和硬件资源。在数字化时代&#xff0c;互联网已经成为基础设施。云计算使得数据中心能够像一台计算机一样去工作。通过互联网将算力以按需使用、按量付费的形式提供给用户&a…

[Kubernetes] Rancher 2.7.5 部署 k8s

server: 192.168.66.100 master: 192.168.66.101 node1: 192.16t8.66.102 文章目录 1.rancher server 安装docker2.部署k8s3.kubeconfig 1.rancher server 安装docker 所有主机开通ipv4 vi /etc/sysctl.conf#加入 net.ipv4.ip_forward 1#配置生效 sysctl -prancher-server开…

什么是企业出海?

本文节选自Odoo亚太金牌服务机构【开源智造】所编写的《企业数字化百科大全》如需获取完整的知识内容&#xff0c;请至开源智造官网免费获取。感谢网友一键三连&#xff1a;点赞、转发、收藏&#xff0c;您的支持是我们最大的前进动力&#xff01; 企业出海是什么意思&#xff…

压力测试-JMeter常用插件、服务器硬件监控

1.写在前面 在前一篇文章中&#xff0c;我们已经对jmeter有了一个入门的学习。 掌握了JMeter安装、入门、结果分析等内容&#xff0c;详情可查看这里&#xff1a;压力测试-JMeter安装、入门、结果分析 对于jmeter默认的插件&#xff0c;往往不太够&#xff0c;例如&#xff…

机器学习实践:超市商品购买关联规则分析

第2关&#xff1a;动手实现Apriori算法 任务描述 本关任务&#xff1a;编写 Python 代码实现 Apriori 算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握 Apriori 算法流程。 Apriori 算法流程 Apriori 算法的两个输人参数分别是最小支持度和数据集。该算法首先会生成所…

LeetCode-DFS-树类-简单难度

关于二叉树的相关深度优先遍历类题目&#xff0c;重点在于掌握最基本的前中后序遍历&#xff0c;大多数题目都在围绕这套逻辑&#xff0c;找到处理节点的时机&#xff0c;以及停止遍历的条件&#xff0c;即可顺利完成。 二叉树前中后序遍历模板 所谓前中后序&#xff0c;指的…

好久不见,回来看看七年前的你

今天在网上搜东西&#xff0c;突然想到之前在网上记录的点滴成长&#xff0c;回来看看~ 来看看那些年走过的路&#xff0c;小伙还挺真实&#xff0c;有些想法~ 那时&#xff0c;一起在网上记录文字的人&#xff0c;也都慢慢失去了联系~ 确实&#xff0c;深有感触&#xff0c;…

【论文阅读笔记】MAS-SAM: Segment Any Marine Animal with Aggregated Features

1.论文介绍 MAS-SAM: Segment Any Marine Animal with Aggregated Features MAS-SAM&#xff1a;利用聚合特征分割任何海洋动物 Paper Code(空的) 2.摘要 最近&#xff0c;分割任何模型&#xff08;SAM&#xff09;在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…

超疏水TiO₂纳米纤维网膜的良好性能

超疏水TiO₂纳米纤维网膜是一种具有特殊性能的材料&#xff0c;它结合了TiO₂的光催化性能和超疏水表面的自清洁、防腐、防污等特性。这种材料在防水、自清洁、油水分离等领域具有广阔的应用前景。 制备超疏水TiO₂纳米纤维网膜的过程中&#xff0c;通过精确控制纺丝溶液的成分…

BFS Ekoparty 2022 -- Linux Kernel Exploitation Challenge

前言 昨天一个师傅给了我一道 linux kernel pwn 题目&#xff0c;然后我看了感觉非常有意思&#xff0c;题目也不算难&#xff08;在看了作者的提示下&#xff09;&#xff0c;所以就花时间做了做&#xff0c;在这里简单记录一下。这个题是 BFS Lab 2022 年的一道招聘题&#…

【优选算法】——Leetcode——202—— 快乐数

目录 1.题目 2. 题⽬分析: 3.简单证明&#xff1a; 4. 解法&#xff08;快慢指针&#xff09;&#xff1a; 算法思路&#xff1a; 补充知识&#xff1a;如何求⼀个数n每个位置上的数字的平⽅和。 总结概括 5.代码实现 1.C语言 2.C 1.题目 202. 快乐数 编写一个算法来…

国家电网某地电力公司网络硬件综合监控运维项目

国家电网某地电力公司是国家电网有限公司的子公司&#xff0c;负责当地电网规划、建设、运营和供电服务&#xff0c;下属多家地市供电企业和检修公司、信息通信公司等业务支撑实施机构。 项目现状 随着公司信息化建设加速&#xff0c;其信息内网中存在大量物理服务器、存储设备…

我独自升级崛起在哪下载 我独自升级崛起客户端下载教程

定于5月8日全球盛放的《我独自升级&#xff1a;崛起》——这一激动人心的动作角色扮演游戏巨作&#xff0c;汲取了同名动漫及网络漫画的精髓&#xff0c;誓将以其无与伦比的魅力&#xff0c;引领玩家迈入一个探索深远、规模宏大的奇幻之旅。游戏构筑在一个独一无二的网络武侠世…

英语学习笔记3——Sorry, sir.

Sorry, sir. 对不起&#xff0c;先生。 词汇 Vocabulary umbrella n. 伞&#xff0c;保护伞 注意读音 [ʌm’brelə] 英国人离不开雨伞。 please 请 特殊用法&#xff1a;让路&#xff08;升调&#xff09;      用餐礼仪&#xff08;平调&#xff09;      求求你…

【Toritoise SVN】SVN 怎么忽略文件夹下的所有文件但是不忽略文件夹本身

比如&#xff1a;忽略 Assets\StreamingAssets\LocalAsset文件夹下的所有文件但是不忽略LocalAsset这个文件夹 在TortoiseSVN中&#xff0c;你可以通过以下步骤来修改文件夹的svn:ignore属性&#xff1a; 打开Windows资源管理器&#xff0c;导航到你的工作副本中的Assets\Stre…

鸿蒙内核源码分析(互斥锁篇) | 互斥锁比自旋锁丰满多了

内核中哪些地方会用到互斥锁?看图: 图中是内核有关模块对互斥锁初始化,有文件,有内存,用消息队列等等,使用面非常的广.其实在给内核源码加注的过程中,会看到大量的自旋锁和互斥锁,它们的存在有序的保证了内核和应用程序的正常运行.是非常基础和重要的功能. 概述 自旋锁 和…

HIVE函数的基本使用

HIVE函数的基本使用 1.查看所有支持的函数 共289个 1)SHOW FUNCTIONS 查看所有支持的函数 共289个 2)SHOW FUNCTIONS LIKE "**" 模糊查询函数名 3)DESC FUNCTION 函数名 可以查看函数的具体使用方法 show functions; show functions like "*c…

【Python爬虫实战入门】:全球天气信息爬取

文章目录 一、爬取需求二、所需第三方库2.1 简介 三、实战案例四、完整代码 一、爬取需求 目标网站&#xff1a;http://www.weather.com.cn/textFC/hb.shtml 需求&#xff1a;爬取全国的天气&#xff08;获取城市以及最低气温&#xff09; 目标url&#xff1a;http://www.weath…