项目总结之angular4.0中的@viewchild,@Input,@Output

2023-11-12

在项目中遇到了这样一个问题,父页面中需要操作子组件里面的方法,这个时候需要怎么做呢?项目是由ionic3.0和angular4.0构成的 代码如下:
child的html页面如下:

<div class="child" [class.actived]="hideBtn">
     <div *ngIf="childImage" class="child-image"><img src="assets/child/{{childImage}}"></div>
     <div *ngIf= "hideBtn" (click)="hideChild()" class="hide-btn"></div>
     <div *ngIf= "showBtn" (click)="showChild()" class="show-btn"></div>
</div>

ts页面如下:

import { Component, Input, Output, EventEmitter } from "@angular/core";
import { NavController, NavParams, ModalController } from "ionic-angular";
import { Config } from "providers/config";
import { User } from "providers/user";
import { Api } from "providers/api";
import { Funcs } from "providers/funcs";

@Component({
    selector: 'child',
    templateUrl: "child.html",
})
export class child {
    hideBtn: boolean = false;
    showBtn: boolean = true;
  constructor(
    public config: Config,
    public navCtrl: NavController,
    public navParams: NavParams,
    public modalCtrl: ModalController,
    public user: User,
    public api: Api,
    public funcs: Funcs,

  ) {
    
  }

  @Input() childImage:string = '';
  @Output() showFlag = new EventEmitter();
  ionViewDidEnter() {}

  showGuide(){
    this.showBtn = false
    this.hideBtn = true
    this.showFlag.emit(true)
  }

  hideGuide(){
    this.showBtn = true
    this.hideBtn = false
    this.showFlag.emit(false)
  }
}

上面是子组件里面的html和ts。
首先子组件接收参数是通过@Input() childImage:string = ‘’;
@Input() 是用来定义输入的,是接收其他组件传过来的数据的。相当于指令的值绑定,无论是单向的(@)还是双向的(=)。都是将父作用域的值“输入”到子作用域中,然后子作用域进行相关处理。(相当于vue中的props)
然后子组件抛出方法是通过@Output() showFlag = new EventEmitter();
@output相当于指令的方法绑定,子作用域触发事件执行响应函数,而响应函数方法体则位于父作用域中,相当于将事件“输出到”父作用域中,在父作用域中处理。(相当于vue中的emit 实现通信)
(可以结合之前我之前写的这篇文章对比记忆:vue中的父子组件之间的数据传递之props、 r e f 和 ref和 refemit
那下面让我们来看一下父组件中的代码吧
parent的html页面如下(引用子组件的部分):

  <div [hidden]="toggleClass != 'unShow'">
    <child #childMask1 [childImage]="'unShowContGuide.png'" (showFlag)="showFlag($event)" class="childCom"></child>
  </div>
  <div [hidden]="toggleClass != 'isShow'">
    <guide #childMask2 [childImage]="'isShowContGuide.png'" (showFlag)="showFlag($event)" class="childCom"></guide>
  </div>
  <div *ngIf="childMask" [hidden]="toggleSignClass != 'unShow'" (click)="childMask1.hideGuide()" class="mask"></div>
  <div *ngIf="childMask" [hidden]="toggleSignClass != 'isShow'" (click)="childMask2.hideGuide()" class="mask"></div>

ts页面如下(引用子组件的部分):

import { Component, ViewChild } from "@angular/core";
import { child } from "../child/child";
export class parent {
  @ViewChild("childMask1") childMask1: child;
  @ViewChild("childMask2") childMask2: child;
  showMask: boolean = false;
  constructor(
  ) { 
  }
  ionViewDidEnter() {
     this.childMask1.showGuide();
     this.childMask2.showGuide();
  }

 // 子组件的点击事件
  showFlag(event) {
      this.childMask = event;
   }
}  

通过父组件页面我们可以看到,在父组件里面引入子组件的方法就是直接以子组件中定好的选择器为标签

@Component({
selector: ‘child’,
templateUrl: “child.html”,
})
<child #childMask1 [childImage]="‘unShowContGuide.png’" (showFlag)=“showFlag($event)” class=“childCom”></child>

在标签中直接定义一个类似于id的#childMask1,这个childMask1就可以在父组件的其他标签中随意使用了,

<div *ngIf="childMask" [hidden]="toggleSignClass != 'unShow'" (click)="childMask1.hideGuide()" class="mask"></div>

这个标签中的childMask1就是之前定义好的类似于id的#childMask1。
那么我们回到最开始的那个问题:我刚进入父组件页面的时候就去调用子组件里面的方法
@ViewChild(“childMask1”) childMask1: child;
@ViewChild(“childMask2”) childMask2: child;
这两行代码就是关键,意思是把childMask1和childMask2定义为子组件child类的数据类型,然后我就可以用
childMask1和childMask2直接调用子组件里面的方法和属性了(这个类似于vue中的$ref)

angular和vue中的父子组件之间的传递的原理都是一样的,只是方法和写法不一样,大家可以对比去记忆。
好了,就到这里吧,以后有什么新的发现再补充。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

项目总结之angular4.0中的@viewchild,@Input,@Output 的相关文章

随机推荐

  • <刷题笔记>408计算机学科专业基础综合_操作系统_第一章_计算机系统概述_第一篇

    操作系统是一种系统软件 通用软件 普通大众都会使用的 如office 迅雷 专用软件 某些领域的专业人士使用的 如AutoCAD logic Pro 系统软件 计算机中负责管理 运行 控制和维护计算机系统资源的软件 如 操作系统 数据库管理
  • ORACLE updata是提示违反唯一约束条件

    如图所示 使用updata语句时提示违反唯一约束条件 语句如下 update table name set param1 xxx param2 xxx where param4 xxx 解决办法 一 能用Navicat for Oracle
  • wow.js

    一 页面在向下滚动的时候 有些元素会产生细小的动画效果 虽然动画比较小 但却能吸引你的注意 刚知道wow js这个插件 之前写的类似滚动时页面效果都是自己用jQuery写的 现在有了插件 开发更加快捷有效了 演示及下载地址 http www
  • PermissionX开源框架的使用

    背景 动态申请权限是一件特别繁琐的事情 涉及的权限一多 就让人头疼 Android提供给我们的运行时权限申请的API并不是很友好 比如我们需要动态申请打电话的功能 除了在roidManifest xml中声明权限之外 还要在执行拨打电话操作
  • 报错:Avoided redundant navigation to current location: “/login“.完美解决

    需求 登陆之后才能查看主页面 否则跳转至登录页 遇到的问题 一开始是打算直接在拦截器跳转路由的 发现会报错Avoided redundant navigation to current location login 后来灵机一动 用了全局路
  • vue报错:regeneratorRuntime is not defined

    报错原因是使用了 async await 没有配置 babel 导致语法不支持 所以才会报错 首先安装以下依赖 npm install babel plugin transform runtime save dev 或 npm i save
  • 【AnyQ】如何添加插件

    一 已有插件 字典插件 此类插件继承DictInterface接口 哈希词典 HashAdapter
  • SyntaxWarning: name 'x' is assigned to before global declaration global color Python

    SyntaxWarning name x is assigned to before global declaration global color Python 这种报错很大原因是在同一个函数重复使用了global 声明 举个例子 x 0
  • LiveData详细分析2

    一 LiveData是什么东西 1 基于观察者设计模式 LiveData是一种持有可被观察数据的类 被观察者 LiveData需要一个观察者对象 一般是Observer类的具体实现 当观察者的生命周期处于STARTED或RESUMED状态时
  • linux用dd命令刻录u盘,巧用linux dd命令刻录启动U盘

    dd命令是Linux UNIX 下的一个非常有用的命令 作用是用指定大小的块拷贝一个文件 并在拷贝的同时进行指定的转换 大部分用户只知道dd命令的这个用处 殊不知dd命令做usb启动盘也十分方便 下面就让我们一起来看看dd命令是如何运用到刻
  • 聊聊限流、熔断和降级

    背景 分布式系统中的调用关系错综复杂 如何保障整个系统平稳运行则显得尤为重要 限流 熔断和降级应运而生 限流 为了保障下游服务稳定性 通常会提前预估调用QPS 一旦超过预估QPS则可以进行限流 拒绝超出预估的请求 常见的限流算法有固定窗口
  • python插入单条、多条dict类型数据到clickhouse

    比如一个数据库名字叫test 表名称叫just check 插入单条dict数据 import clickhouse connect client clickhouse connect get client host 127 0 0 1 d
  • 【剑指offer】总集

    目录 前言 题目索引 数据结构 数 数据结构 数组 数据结构 字符串 数据结构 链表 数据结构 树 数据结构 队列 栈 堆 前言 想看Leetcode总集篇的点它点它 Leetcode总集篇 算法和算法题的任务目标 主要可分为 增 删 改
  • 什么是网站主服务器域名,主域名服务器是什么

    主域名服务器是什么 内容精选 换一换 香港节点和大陆节点的区别如下 香港节点购买域名后无需备案 可以直接在后台绑定域名并使用 大陆节点购买域名后需要先完成备案 才可以在后台绑定域名 香港节点支持绑定多个一级或者子域名 大陆节点只能绑定一个一
  • Linux高性能服务器编程|阅读笔记:第6章 - 高级I/O函数

    目录 简介 6 1 pipe函数 6 2 dup函数和dup2函数 6 3 readv函数和writev函数 6 4 sendfile函数 6 5 mmap函数和munmap函数 6 6 splice函数 6 7 tee函数 6 8 fcn
  • [问题解决方案]JSON parse error: Illegal unquoted character ((CTRL-CHAR, code 13)): has to be escaped using

    公司最近跟外部有一个接受图片的接口让我来做 我心想这么简单 又可以偷懒喽 打开文档一看图片是base64格式的 没啥 不就是base64转字节流吗 一同操作后 测试接受参数 崩出来这个东西 然后就解决呗 总不能因为解决不了让人转变发送参数的
  • 【学习笔记】Python进行数据清洗

    写在前面的话 最近看了一个up主讲基本数据清洗操作 觉得非常好 链接如下 Python 数据清洗 用Python给数据洗澡澡 数据分析 数据清洗 数据预处理 哔哩哔哩 bilibili 评论区也有原数据集和相关代码的链接 不是广告 下面就浅
  • 小程序中scroll-view的下拉刷新和小程序页面的下拉刷新开启方法

    scroll view的下拉刷新 video wxml中
  • ES6---promise详解及用法

    一 什么是Promise Promise是ES6异步编程的一种解决方案 目前最先进的解决方案是async和await的搭配 ES8 但是它们是基于promise的 从语法上讲 Promise是一个对象或者说是构造函数 用来封装异步操作并可以
  • 项目总结之angular4.0中的@viewchild,@Input,@Output

    在项目中遇到了这样一个问题 父页面中需要操作子组件里面的方法 这个时候需要怎么做呢 项目是由ionic3 0和angular4 0构成的 代码如下 child的html页面如下 div class child div class child