angular 知识点整理

创建项目

安装Angular-cli

npm install -g @angular/cli

创建项目 --skip-install忽视安装包

ng new angularApp --skip-install

安装模块

cnpm install

启动开发服务命令

Npm start
Ng serve --open    //自动打开浏览器

启动时候打开浏览器

ng serve --open

创建组件命令

ng g component  components/news

组件使用:

<app-news></app-news>

基础语法

Angular插值

语法:{{ …变量和表达式}}
应用:应用于html内容里,也可以应用于property里

<h1 [innerHtml]="htmlStr"></h1>

Angular 绑定class

定义的class三种方式,跟VUE一致,会自动的将变量和原有的HTML的CLASS相加

<!-- 定义变量的方式 -->
<h1 class="abc" class="{{classStr}}">class1</h1>
<h1 class="abc" [class]="classStr">class2</h1>
<h1 [attr.class]="classStr">class3</h1>

Class变量类型

<!-- 变量类型 -->
<!-- 字符串模式 -->
<h1 [class]="classStr">class4</h1>
<h1 class="a" [class]="'str abc'">class4</h1>
<!-- 对象模式 -->
<h1 [class]="classObj">class5</h1>
<h1 [class]="{bgBlue:isShow}">class6</h1>
<!-- 数组模式 -->
<h1 [class]="['bgBlue','active','abc']">class7</h1>
<h1 [class]="classArr"></h1>

Angular 绑定style

<!-- style -->
<!-- style表达式类型 -->
<!-- 字符串变量 -->
<h1 [style]="styleStr"></h1>
<!-- 对象模式 -->
<h1 [style]="styleObj"></h1>
<!-- 橙色 -->
<h1 [style.height]="styleObj.width">h</h1>
<h1 [style.width]="colorAbc"></h1>
<h1 [style.width.px]="widthNum"></h1>

Angular 绑定事件

<!-- 
  绑定事件:
  由等号左侧写小括号加上事件名称,右边写调用的事件函数
 -->
<button (click)="changeColor()">改变颜色</button>

<button (click)="changeButton($event)">改变颜色</button>

Angular 条件渲染

<!-- 条件渲染 -->
<!-- person如果是广东人,就显示广东人的疫情信息 -->
<div *ngIf="person=='广东人'">
  广东:1000</div>

<div *ngIf="person=='湖北人'">
  湖北:40000</div>

<button (click)="togglePerson()">切换身份</button>

<h1>style的条件渲染</h1>
<!-- 
  这里使用的条件渲染,会移除出Document,添加进DOM都会消耗性能。
 -->
<!-- 使用STYLE进行条件渲染,如果需要频繁切换内容,那么需要style完成条件渲染-->
<div [style.display]="person=='广东人'?'block':'none'">
  广东:1000</div>

<div [style.display]="person=='湖北人'?'block':'none'">
  湖北:40000</div>



<!-- 条件渲染,匹配多种情况 -->
<div [ngSwitch]="homeState">
  <div *ngSwitchCase="'睡觉'">卧室</div>
  <div *ngSwitchCase="'看电视'">客厅</div>
  <div *ngSwitchCase="'吃饭'">餐厅</div>
  <div *ngSwitchCase="'发呆'">阳台</div>
  <div *ngSwitchDefault>厕所</div>
</div>

<!-- 条件渲染,匹配多种情况 -->
<div [ngSwitch]="orderState">
  <div *ngSwitchCase="1">待付款</div>
  <div *ngSwitchCase="2">已付款</div>
  <div *ngSwitchCase="3">发货</div>
  <div *ngSwitchCase="4">已收货</div>
  <div *ngSwitchDefault>丢失</div>
</div>

Angular 循环渲染

<!-- 列表循环 -->
<ul>
  <li *ngFor="let item of arr">{{item}}</li>

</ul>

<!-- 列表循环获取索引值 -->
<ul>
  <li *ngFor="let item of arr;let i=index">索引值:{{i}};内容:{{item}}</li>
</ul>

<!-- 将列表的内容传入事件 -->
<ul>
  <li *ngFor="let item of arr;let i=index" (click)="choosePerson(item,i)">索引值:{{i}};内容:{{item}}</li>
</ul>

<!-- 循环复杂数组 -->
<ul>
  <li *ngFor="let item of students;let key=index">{{key}}-{{item.name}}的爱好是{{item.hobby}}</li>
</ul>

双向数据绑定

基础语法

导入FormsModule模块至app.module.ts

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
//导入form模块
import { FormsModule} from '@angular/forms'

import { AppComponent } from './app.component';
import { NewsComponent } from './views/news/news.component';

@NgModule({
  declarations: [
    AppComponent,
    NewsComponent
  ],
  imports: [
    BrowserModule,
    //导入form模块
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

表单的数据绑定

<input type="text" [(ngModel)]="username">

设置临时变量绑定DOM对象

<!-- 表单数据获取 -->
<div>
  <label for="">用户名</label>
  <input #input1 type="text" >
</div>
<div>
  <label for="">密码</label>
  <input #input2 type="text" >
</div>
<button (click)="getContent(input1.value,input2.value)">获取账号密码</button>

NgForm获取整个表单的数据

导入ReactiveFormsModule模块至app.module.ts:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
//导入form模块
import { FormsModule ,ReactiveFormsModule} from '@angular/forms'

import { AppComponent } from './app.component';
import { NewsComponent } from './components/news/news.component';

@NgModule({
  declarations: [
    AppComponent,
    NewsComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

使用:

<form  #myForm="ngForm">
  <input type="text" [(ngModel)]="usernamer" name="username" >
  <input type="text" [(ngModel)]="password" name="password" >
  <button (click)='eventFn(myForm.value)'>按钮</button>
</form>

管道(处理数据)

基础语法

<h1>{{student | json}}</h1>
<h1>显示时间:{{time | date:"yy/MM/dd"}}</h1>
<h1>用户名:  {{username | uppercase}}   </h1>
//管道可以转换多次
<h1>{{'abcdefg'|uppercase|lowercase}}</h1>

常用值:
1、大小写转换管道

uppercase将字符串转换为大写

lowercase将字符串转换为小写

<p>{{str | uppercase}}-{{str1 | lowercase}} </p>  //str:hello str1:WORLD

页面上显示:HELLO-world

2、日期管道

date:日期管道符可以接受参数,用来规定输出日期的格式。

<p>现在的时间是{{today | date:'yyyy-MM-dd HH:mm:ss'}}</p>
today = new Date();

页面上显示:现在的时间是2019-04-02 16:08:10

3、小数管道

number管道用来将数字处理为我们需要的小数格式

接收的参数格式为{最少整数位数}.{最少小数位数}-{最多小数位数}

其中最少整数位数默认为1

最少小数位数默认为0

最多小数位数默认为3

当小数位数少于规定的{最少小数位数}时,会自动补0

当小数位数多于规定的{最多小数位数}时,会四舍五入

<p>num保留4位小数的值是:{{num | number:'3.2-4'}}</p>
num = 125.156896;
页面上显示:num保留4位小数的值是:125.1569

4、货币管道

currency管道用来将数字转换为货币格式

  <p>数量:{{count}}</p>
  <p>价格:{{price}}</p>
  <p>总价:{{(price * count) | currency:'¥'}}</p>
  count = 5;
  price = 1.5;
  
页面上显示:
	数量:5
	价格:1.5
	总价:$7.50

5、字符串截取

slice:start[:end] //开始下标到结束下标 不包括结束下标

<p>{{name | slice : 2 : 4}}</p>
	name = '只对你说';

 页面上显示:你说

6、json(数据)格式化

<div>
  <p>{{ { name: 'semlinker' } | json }}</p>
</div>

页面上显示:{ "name": "semlinker" }

自定义管道

创建自定义的管道文件

ng g pipe filter/lcUppercase
import { Pipe, PipeTransform } from '@angular/core';

// @Pipe({
//   name: 'lcUppercase'
// })
// export class LcUppercasePipe implements PipeTransform {

//   transform(value:string,...args:string[]):string {
//     if(value=="老陈"){
//       return "大帅哥老陈"
//     }
//     return value ;
//   }

// }
@Pipe({
  name: 'lcUppercase'
})
export class LcUppercasePipe implements PipeTransform {

  transform(value:string,...args:string[]):string {
    console.log(args)
    return '¥'+value+args[0];
  }

}

模板
注意:msg是模板变量,lcUppercase是转换函数,:后面是参数

```javascript
<h1>{{msg|lcUppercase:'元'}}</h1>

父子之间传参

父组件传值给子组件

父组件设置

<app-child [item]="sendchildMsg"></app-child>

子组件设置 (需要在子组件引入 Input)

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

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {
  @Input() item;
  constructor() { }

  ngOnInit(): void {
  }
}

子组件Template

<h1>{{item}}</h1>

子组件传值给父组件

父组件Template

<app-child (childMsg)="getEvent($event)"></app-child>

父组件Ts

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {  
  getChildMsg="";
  getEvent(event){
    console.log(event)
    this.getChildMsg = event.msg
  }
}

子组件设置(需要引入Output,EventEmitter)

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

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {
//实例化事件对象
  @Output() childMsg=new EventEmitter()
  constructor() { }
  ngOnInit(): void {
  }
  sendMsg(){
    //发送消息
    this.childMsg.emit({msg:"我子组件,这是我发给父组件的消息"})
  }
}

子组件Template

<button (click)="sendMsg()">发送消息给父组件</button>

父组件调用子组件的方法

父组件Template(需要在子组件的标签上添加 #child)

<app-news #child > </app-news>
<button type="button" (click)="getChildFun()">调用子组件方法按钮</button>

父组件Ts (需要引入ViewChild)

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
	//注册
  @ViewChild('child') 
  child;

  getChildFun(){
    this.child.sendMsg()
  }
}

子组件

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

@Component({
  selector: 'app-news',
  templateUrl: './news.component.html',
  styleUrls: ['./news.component.scss']
})
export class NewsComponent implements OnInit {
  constructor() { }
    ngOnInit(): void {
  }
 //子组件的方法
  sendMsg(){
    console.log("这是子组件的方法")
  }
}

子组件调用父组件的方法(和子传父一样)

父组件Template

<h1>{{title}}</h1>
<app-news (parentFun)="parentFun()" > </app-news>

父组件Ts

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = '父组件';
  parentFun(){
      console.log("这是父组件的方法")
  }
}

子组件Template

<p>子组件</p>
<button type="button" (click)="getParentFun()">点击触发父组件的方法</button>

子组件Ts

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

@Component({
  selector: 'app-news',
  templateUrl: './news.component.html',
  styleUrls: ['./news.component.scss']
})
export class NewsComponent implements OnInit {
  constructor() { }
    ngOnInit(): void {
  }
  @Output() parentFun=new EventEmitter()
  
  getParentFun(){
    this.parentFun.emit()
  }
}

兄弟组件之间传参(就是父子组件的消息传递,父组件为桥梁)

父组件Template

<app-child1 #child1 (parentFun)="parentFun()"></app-child1>
<app-child2 #child2></app-child2>

父组件组件Ts

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss']
})
export class AppComponent {
  title = '父组件';
  @ViewChild('child2')
  child2;
  parentFun(){
    this.child2.child2Fun()
  }
}

child1Template

<p>child1 works!</p>
<button type="button" (click)="getParentFun()">点我调用Child2组件的方法</button>

child1组件Ts

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

@Component({
  selector: 'app-child1',
  templateUrl: './child1.component.html',
  styleUrls: ['./child1.component.scss']
})
export class Child1Component implements OnInit {
  constructor() { }
  ngOnInit(): void {
  }
  @Output() parentFun=new EventEmitter()
  getParentFun(){
    this.parentFun.emit()
  }
}

child2Template

<p>child2 works!</p>

child2组件Ts

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

@Component({
  selector: 'app-child2',
  templateUrl: './child2.component.html',
  styleUrls: ['./child2.component.scss']
})
export class Child2Component implements OnInit {
  constructor() { }
  ngOnInit(): void {
  }
  child2Fun(){
    console.log("这是child2组件中的方法")
  }
}

生命周期

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

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'angularapp';
  constructor(){
    console.log("组件构造函数调用")
  }
  //指令有效
  ngOnChanges(){
    //console.log("数据发生变化之时就会调用此函数ngOnChanges")
  }

  ngOnInit(){
    console.log("第一次显示数据绑定和指令输入属性之后,就会调用,只调用一次")
  }

  ngDoCheck(){
    console.log('在ngOnChanges和ngOnInit发生之后,会进行一次检测')
  }

  ngAfterContentInit(){
    console.log('数据内容渲染到视图上之后')
  }

  ngAfterContentChecked(){
    console.log('数据内容渲染到视图检测之后')
  }

  ngAfterViewInit(){
    console.log('完成组件和子组件初始化')
  }

  ngAfterViewChecked(){
    console.log('完成组件和子组件初始化检测后')
  }

  ngOnDestory(){
    console.log("销毁组件")
  }
}

自定义指令

创建指令文件:

ng g directive directive/lcstyle

设置指令内容和功能 lcstyle.ts

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

@Directive({
  selector: '[appLcstyle]'
})
export class LcstyleDirective {

  @Input() appLcstyle;
  constructor(public ref:ElementRef) { 
    console.log('constructor')
  }
  ngOnChanges(){
    //console.log('指令')
    //console.log("数据发生变化之时就会调用此函数ngOnChanges")
    //console.log(this.appLcstyle)
    //console.log(this.ref)
    this.ref.nativeElement.className = this.appLcstyle;
    this.ref.nativeElement.innerHTML = this.appLcstyle;
    this.ref.nativeElement.addEventListener("click",()=>{
      this.ref.nativeElement.style.background="pink"
    })
  }
}

使用

<h1 [appLcstyle]="'aaa'"></h1>

Axios的使用

第一步:安装axios

npm install axios

第二步:声明axios 在需要用到的地方

import axios from ‘axios’

第三步:使用方法

//Angular生命周期:初始化
 ngOnInit(){
   axios.get("路径").then(res=>{
     console.log(res)
   }).catch((err)=>{
	 console.log(err);
   }).finally(()=>{
	 console.log('执行完了');
   });
 }

路由

基础语法

1、创建路由指令
生成的 app-routing.module.ts 和 app-routing.module.spec.ts 是与 app.module.ts 在同一目录下的,也就是都在app目录下

ng generate module app-routing --flat --module=app

路由配置app-routing.module.ts

import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router';
import {IndexComponent} from './view/index/index.component';
import {AboutComponent} from './view/about/about.component';
import {NewsComponent} from './view/news/news.component'

//配置路由对象
const routes: Routes = [
  {
    //不需要加/
    path:"",
    component:IndexComponent
  },
  {
    path:'about',
    component:AboutComponent
  },
  {
    path:"news",
    component:NewsComponent
  }
];

@NgModule({
  imports: [RouterModule.forRoot(routes)],
  exports: [RouterModule]
})
export class AppRoutingModule { }

HTML模板

<!-- 根据路径的变化,显示不同组件 -->
<style>
  div>span{
    margin: 20px;
    padding: 5px 10px;
    background-color: skyblue;
  }
</style>

<div>
  <span [routerLink]="['/']" routerLinkActive="router-link-active" >首页</span>
  <span [routerLink]="['/about']" routerLinkActive="router-link-active" >about</span>
  <span [routerLink]="['/news']" routerLinkActive="router-link-active" >news</span>
</div>

<router-outlet></router-outlet>

子路由

{
    path:'admin',
    component:AdminComponent,
    children:[
      {
        path:'user',
        component:UserComponent
      },
      {
        path:'product',
        component:ProductComponent
      }
    ]
  },

HTML模板设置

<p>admin works!</p>
<div class="admin">
    <div class="left">
        这是侧边栏
        <div [routerLink]="['/admin/user']" routerLinkActive="router-link-active" >user</div>
        <div [routerLink]="['/admin/product']" routerLinkActive="router-link-active" >product</div>
    </div>
    <div class="main">
        <router-outlet></router-outlet>
    </div>
</div>

路由传参

动态路由

{
    //动态路由
    path:"news/:id",
    component:NewsComponent
  },

获取动态路由的参数(需引入ActivatedRoute)

import { Component, OnInit } from '@angular/core';
//导入route
import {ActivatedRoute} from '@angular/router'

@Component({
  selector: 'app-news',
  templateUrl: './news.component.html',
  styleUrls: ['./news.component.less']
})
export class NewsComponent implements OnInit {
  title = ""
  //注入route
  constructor(public route:ActivatedRoute) {
  }

  ngOnInit(): void {
    //let params = this.route.params;
    //console.log(params.value.id);
  }
  goParams(){
//使用参数
    this.route.params.subscribe((params)=>{
      console.log(params)
      this.title = params.id;
    })
  }
}

编程式导航

1/依赖注入router

import { Component, OnInit } from '@angular/core';
//导入route,router
import {ActivatedRoute,Router} from '@angular/router'

@Component({
  selector: 'app-news',
  templateUrl: './news.component.html',
  styleUrls: ['./news.component.less']
})
export class NewsComponent implements OnInit {
  //注入route,router
  constructor(public route:ActivatedRoute,public router:Router) {
    this.route.data.subscribe((data)=>{
      console.log(data)
      this.title = data.msg
    })
  }

  ngOnInit(): void {
  }
  goParams(){
  // 获取路由传参
    this.route.params.subscribe((params)=>{
      console.log(params)
      this.title = params.id;
    })
  }

  goHome(){
    //第一个参数是传入数组(路径的数组),路由path名称,
    // 第二个参数是路由的参数,需要在路由文件进行配置,比如{path:"admin/:id"},传的就是id
    this.router.navigate([''],{
      queryParams:{
        usernam:"admin"
      },
      fragment:"abc",//传hash值
      replaceUrl:true//是不是要替换当前的页面
    })
  }

}

打包

ng build
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值