angular

发布时间 2023-04-20 15:26:09作者: 顺·

![image-20230418150837356](/Users/fanshun/Library/Application Support/typora-user-images/image-20230418150837356.png)

1. 新建组件 ng n c hello
2. 插值语法 {{ content }}
3. 属性绑定用 []
<p-dataTable [value]="listdata" selectionMode="multiple"></p>
或者
<p-dataTable [value]="listdata" [selectionMode]="'multiple'"></p>
<div [class]="'box'"></div>  // 必须是字符串    [class]="box"这样写box是变量
<h3 [class.xxy-table]="true"></h3>       //
<h3 [class]="{'xxyTable': true}"></h3>   //对象条件渲染
ngClass 是指令 和直接写class一样 
<h3 [ngClass]="{'active': isActive}"></h3>    
<h3 [class]="['xxyTable', 'xxyBox']"></h3>   //数组渲染
<p [style]="{ width: '170px', height: '30px' }"></p>  //样式绑定
ngStyle
4. 条件判断 ngIf
<p *ngIf="isShow"></p>
<ng-container *ngIf="isShow; else Show">
	<p></p>
</ng-container>
<ng-template #Show>
  <p></p>
</ng-template>
5. 循环语句
let elementDatas: string[] = ['小明', ‘小红]
<div *ngFor="let data of elementDatas let i = index">
{{i}}                                                      //下标
{{data}}                                                   // 值   
</div>
6. 事件绑定
<button (click)="handleClick()"></button>
7. ViewChild 绑定获取dom元素 (类似vue2中的ref)

通过 ViewChild 装饰器 获取 dom

import { ViewChild } from "@angular/core";

<div #text1></div>

@ViewChild("text1") text1: ElementRef;

this.text1.nativeElement
8 表单的双向数据绑定 (和vue的v-model类似)

首先全局引入app.module.js

import {FormsModule} from "@angular/forms";
imports: [ FormsModule ]

使用

<input maxlength="20" placeholder="名称" [(ngModel)]="prodectName"

export class ShopchecklistComponent implements OnInit {
  prodectName: string = ''
}
9.动态表单 (和第8点类似都是实现表单绑定)

首先全局引入app.module.js

import {ReactivFormsModule} from "@angular/forms";
imports: [ ReactivFormsModule ]

使用,要注册一个表单控件,就要导入 Formcontrol 类并创建一个 Formcontrol 的新实例,将其保存为类的属性。

<input type='text' [formControl]="productName" />
 使用必须 .value
<p>{{productName.value}}</p>

import { FormControl } from '@angular/forms'

export class ShopchecklistComponent implements OnInit {
  productName: FormControl = new FormControl('')
  
  //修改值
  updateName(val:string) {
    this.productName.setValue(val)
	}
}

10. 动态表单组(引入第9步的ReactivFormsModule)

使用 FormsGroup创建

<form [formGroup]="personMes" (submit)="OnSubmit()">
  <input type="text" formControlName="name"><br>
  <input type="text" formControlName="address"><br>
  <button>提交</button>
</form>

import { FormControl, FormGroup } from '@angular/forms';

export class ReativeFormsComponent implements OnInit {
  personMes: FormGroup = new FormGroup({
    name: new FormControl(),
    address: new FormControl()
  })

  OnSubmit(){
    console.log(this.personMes.value)
  }
}

11. 基础表单验证

(不常用)表单项使用required启用验证,#自定义名字="ngModel",模版引用变量

<form>
  账号:<input type="text" required #nameInp="ngModel" [(ngModel)]="fromData.name">
    <p>验证信息{{nameInp.valid}}</p>    //返回布尔值
  密码:<input type="text" required #passInp="ngModel" [(ngModel)]="fromData.password">
    <p>验证信息{{passInp.valid}}</p>    //返回布尔值
  <button (click)="OnSubmit(nameInp)">提交</button>
</form>

export class ReativeFormsComponent implements OnInit {
  fromData={
    name: '',
    password: ''
  })

  OnSubmit(val){
    console.log(val)
  }
}
状态 为true时的类 为false时的类
控件已经被访问过 Ng-touched Ng-untouched
控件值已经变化 Ng-dirty Ng-pristine
控件值是有效的 Ng-valid Ng-invalid
12. 自定义表单验证

引入 FormGroup, FormBuilder, Validators

<form [formGroup]="valiDataForm">
  <input type="text" formControlName="userName"><br>
    <p *ngIf="valiDataForm.get('userName')?.errors?.required">请输入6-18位名称</p>
		<p *ngIf="valiDataForm.get('userName')?.errors?.minlength">长度在6-18位</p>
  <input type="text" formControlName="password"><br>
  <input type="text" formControlName="phone"><br>
  <button  (click)="OnSubmit()">提交</button>
</form>



import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms';

constructor(private fb: FormBuilder) {}   //注入方法

valiDataForm: FormGroup = this.fb.group({      //通过FormBuilder生成控件组
	userName: ['', [Validators.required, Validators.maxLength(18), Validators.minLength(6)]],
	password: ['', [this.passwordVal]],
	phone: ['', [Validators.required, this.phoneVal]],
})
//自定义校验方法
passwordVal() {}
//自定义校验方法
phoneVal(phone: FormControl):object {
  const value = phone.value || ''
  if(!value) return { desc: '请输入手机号'}
  const valid = /[0-9]{11}/.test(value)
	return valid ? {} : {desc: '请输入正确的手机号'}
}


//提交时获取
OnSubmit() {
  console.log(this.valiDataForm.get('userName'))  //获取校验信息
}
13. 管道 (类似vue里的过滤器)

管道的作用就是传输,不同的管道具有不同的作用。

angular中自带的pipe函数

{{DateTime | date: 'yyyy-MM-dd HH:mm:ss'}}

export class EditTheDeclarationComponent implements OnInit {
    DateTime: Date = new Date() //获取本地当前时间
 }

常用的内置管道

管道 类型 功能
DatePipe 纯管道 日期格式化
JsonPipe 非纯管道 使用JSON.stringify()将对象转成json字符串
UpperCasePipe 纯管道 将文本中的字母全部转在大写
LowerCasePipe 纯管道 将文本中的字母全部转成小写
TitleCasePipe 将文本转换成标题格式
DecimalPipe 纯管道 数值格式化
CurrencyPipe 纯管道 货币格式化
PercentPipe 纯管道 百分比格式化
SlicePipe 非纯管道 数组或字符串取切割
I18nPluralPipe 根据expression的值匹配mapping中的值,并将匹配之后的值展示出来
I18nSelectPipe 根据expression匹配mapping中的值,并且返回|匹配之后的值
14. 生命周期

![image-20230420105118917](/Users/fanshun/Library/Application Support/typora-user-images/image-20230420105118917.png)

15. 组件交互(类似vue3.0 setup语法糖写法)

https://blog.csdn.net/qq_37516758/article/details/129136190

  • 父组件给子组件传值
父组件
1. 定义数据
export class ShopchecklistComponent implements OnInit {
	messageTitle: string = '某某页面头'
}
2.父组件在调用子组件的时候传值
<app-title [messageTitle]="messageTitle"></app-title>

子组件 app-title
1.需要引入Input
import { Input } from '@angular/core';
2.接收值
export class TitleComponent {
  @Input() messageTitle: string; 
}
3.使用
<p>{{messageTitle}}</p>
  • 子组件给父组件传值
子组件 app-child
1.引入Output 和  EventEmitter
import { Output,EventEmitter } from '@angular/core';
2.定义方法 handleChange
@Output handleChange = new EventEmitter();
3.执行方法并传递数据
send() {
  this.handleChange.emit("给父组件传递的数据")
}

父组件
1.执行子组件emit出来的事件名字然后自定义事件
<app-child #child  (handleChange)="handleChange($event)"></app-child>
handleChange(e: string) {
  console.log(e, '获取子组件的值')
}
  • 父组件获取子组件的数据(ViewChild)
父组件
<app-child #handleChild></app-child>

import { ViewChild } from "@angular/core";

@ViewChild("handleChild") handleChild : any;

假设有一个子组件方法为run()或者子组件数据为name
this.handleChild.run();
this.handleChild.name;