javascript - 如果我们不能从父组件更改属性或操作它们,@ViewChild 有什么用?
问题描述
我有 2 个组件 - 家庭和关于。在两者中,我都注入了第三个(子)组件-心。现在我正在使用“home 组件”中的@viewChild 来操作心中的“age”属性的值(默认设置为“23”)。我看到从“主组件”的角度来看,该值似乎发生了变化,但在“关于组件”中却没有。
我的问题:
值在第一个组件中似乎如何改变,但在第二个组件中没有改变——这意味着模式或值在“心脏组件”中没有改变(这就是为什么没有在 About 组件中更新)——但是这似乎是如何得到的在家庭组件中更改为“33”?
如果“子组件属性”的值不能通过使用@viewChild 的父级更改——那么从父级访问有什么用。那么为什么不直接使用 @input 装饰器——它做得更好。不是吗?
1 - app.component.html
<app-home></app-home>
<app-about></app-about>
2a - home.component.html
<app-heart #ref1></app-heart>
<button (click)="alpha()">click</button>
2b - home.component.ts
import { Component, OnInit, ViewChild } from '@angular/core';
@ViewChild('ref1') ref1: HeartComponent;
alpha(){
this.ref1.age = 33;
}
3 - 关于.component.html
<app-heart></app-heart>
4 - heart.component.ts
age = 23;
快照(点击按钮)
解决方案
您有两个不同的 实例<app-heart></app-heart>
,因此它们将保持自己的状态,这意味着其中一个实例的更改不会影响另一个实例。
如果您使用@Input()
-decorator 也是如此,该值仅在您使用它的实例上更新。
使用@Input()
-decorator 时,您不必像使用@ViewChild()
-decorator 那样显式设置所需的值。
@Input()
当您使用而不是时,您也在解耦组件之间的关系@ViewChild()
推荐阅读
- javascript - 海图 | 热图 | 更新数据时图例过滤器不起作用
- selenium - 使用 selenium 3 启动网页
- c++ - 引用指向类成员的指针时的 C++ 访问冲突
- android - 使用 Cordova ionic 管理多个构建变体 - Android 项目
- php - 使用 LIKE 子句的 MySql 搜索不起作用
- powershell - powershell有运行任务的能力吗?
- php - Doctrine MongoDB - 使用 Doctrine MongoDB Aggregation Builder 在构面内水合结果
- symfony - 在 symfony 3 中调用 null 上的成员函数 getId()
- excel - 如何使用 VBA 创建公式来引用单元格的动态偏移范围?
- php - 如果精确值匹配,则从 JSON 中删除数据?