Angular 入门(二)
<p class="FirstParagraph">先简单回顾上篇所介绍的知识点:</p><p class="FirstParagraph">Angular相关命令:</p>
<ul>
<li>脚手架的安装: npm i -g @angular/cli --force</li>
<li>生成项目包: ng new 包名 生成过程中的选项 都直接回车选用<strong>默认项</strong>即可.</li>
<li>启动命令: ng s -o</li>
<li>生成组件: ng g c 组件名</li>
</ul>
<p class="FirstParagraph">Angular的一些用法:</p>
<ul>
<li>插值: {{}}</li>
<li>属性的绑定: [属性名]="值" 或 属性名="{{值}}"</li>
<li>事件: (事件名)="方法名()"</li>
<li>双向数据绑定: [(ngModel)]="值" 必须到app.module.ts中注册 Forms 模块才可用</li>
<li>样式: ="{样式名:值}" 和 ="{样式类: true/false}"</li>
<li>条件渲染: *ngIf="条件"</li>
<li>列表渲染: *ngFor="let item of items; let i=index; trackBy=函数"</li>
</ul>
<p> 话不多说直入主题</p>
<h2>管道 pipe_______________________________</h2>
<p>vue中对应的概念: 过滤器 filter</p>
<p>写法: {{ 值 | 过滤器}}</p>
<p>本质是 函数的语法糖写法, 实际上完成的任务: 函数(值) 语法糖: {{值|函数}}</p>
<p class="FirstParagraph">Angular 与 Vue 不同之处:</p>
<ul>
<li>vue官方不提供任何过滤器, 需要自定义.</li>
<li>angular 官方提供了一些常用 管道, 也支持自定义.</li>
</ul>
<p>App文件夹下新建ng g c myc01组件</p>
<p>HTML文件:</p>
<p>(系统过滤器)</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_21f7788e-4b94-4ccc-9279-ed45eddb5b9c" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_21f7788e-4b94-4ccc-9279-ed45eddb5b9c" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_21f7788e-4b94-4ccc-9279-ed45eddb5b9c" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 系统管道 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>全小写: {{ "Nice To MEET You" | lowercase }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>全大写: {{ "Nice To MEET You" | uppercase }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>首字母大写: {{ "Nice To MEET You" | titlecase }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>分数: {{ 0.555555 | percent }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>分数(保留2位小数,整数位随意): {{ 0.055555 | percent: "0.2" }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>分数(保留2位小数,2位整数): {{ 0.055555 | percent: "2.2" }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>千进制的钱: {{ 123456.78 | currency }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>千进制的钱(自定义符号): {{ 123456.78 | currency: "¥" }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 单位: 毫秒 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>日期: {{ 1619489367000 | date }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 自定义格式: y年 M月 d日 H小时24h小时12 m分 s秒 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>自定义日期: {{ 1619489367000 | date: "yyyy-MM-dd HH:mm:ss" }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>新建ng g c myc02组件</p>
<p>HTML文件:</p>
<p>(自定义管道)</p>
<p>组件的HTML文件</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_c5a7141e-ae4e-4898-95af-27157f93e2fc" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_c5a7141e-ae4e-4898-95af-27157f93e2fc" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_c5a7141e-ae4e-4898-95af-27157f93e2fc" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>myc02 works!<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 自定义管道 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> abs: 能够把数字转化成 正数,称为 绝对值 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ 9 | abs }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ -9 | abs }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)">
管道的生成命令:
ng generate pipe 管道名
简写:
ng g p 管道名
</span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 新的管道: pf 得到数字的平方 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> ng g p pf </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ 2 | pf }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ 6 | pf }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 带有参数: 求次幂 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> ng g p pow </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ 2 | pow: 2 }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ 2 | pow: 10 }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 多参数: 利用 : 可以间隔多个参数 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> ng g p add </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ 10 | add: 2:4:65:55 }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>然后再在app文件夹下创建一个pipe文件夹(名字自定义见名知意即可)</p>
<p>然后 在pipe文件夹下运行 :ng g p 管道名字 (生成管道的命令: ng g p 管道名 , 全称: ng generate pipe 管道名)</p>
<p>会生成一个含管道名字的.ts文件 在里面定义过滤器函数如:</p>
<p>abs</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_1f4dc3f9-0e77-471b-a71a-5a56bccf38d0" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_1f4dc3f9-0e77-471b-a71a-5a56bccf38d0" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_1f4dc3f9-0e77-471b-a71a-5a56bccf38d0" class="cnblogs_code_hide">
<pre>import { Pipe, PipeTransform } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Pipe({
name: </span>'abs'<span style="color: rgba(0, 0, 0, 1)">,
})
export class AbsPipe implements PipeTransform {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> {{值|abs}} 此写法是一个语法糖, 真正执行的是:</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> new AbsPipe().transform(值)</span>
<span style="color: rgba(0, 0, 0, 1)">transform(value: number): number {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 参数 value 是 number 类型</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 返回值 也是 numer类型</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> value > 0 ? value : -<span style="color: rgba(0, 0, 0, 1)">value;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>pf</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_a19b0698-dd84-4298-814b-9d17fc4bd127" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_a19b0698-dd84-4298-814b-9d17fc4bd127" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_a19b0698-dd84-4298-814b-9d17fc4bd127" class="cnblogs_code_hide">
<pre>import { Pipe, PipeTransform } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Pipe({
name: </span>'pf'<span style="color: rgba(0, 0, 0, 1)">,
})
export class PfPipe implements PipeTransform {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ng g p pf</span>
<span style="color: rgba(0, 0, 0, 1)">transform(value: number): number {
</span><span style="color: rgba(0, 0, 255, 1)">return</span> value *<span style="color: rgba(0, 0, 0, 1)"> value;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>pow</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_780465db-687e-449d-a727-cb27d2fd6c4f" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_780465db-687e-449d-a727-cb27d2fd6c4f" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_780465db-687e-449d-a727-cb27d2fd6c4f" class="cnblogs_code_hide">
<pre>import { Pipe, PipeTransform } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Pipe({
name: </span>'pow'<span style="color: rgba(0, 0, 0, 1)">,
})
export class PowPipe implements PipeTransform {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> {{ 2 | pow: 2 }}</span>
<span style="color: rgba(0, 0, 0, 1)">transform(value: number, ...args: number[]): number {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> number[] :代表数组类型, 其中的值都是number类型</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> Math.pow(value, args);
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>add</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_668e5167-595d-4f7d-b9fa-58ba1ccbbab7" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_668e5167-595d-4f7d-b9fa-58ba1ccbbab7" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_668e5167-595d-4f7d-b9fa-58ba1ccbbab7" class="cnblogs_code_hide">
<pre>import { Pipe, PipeTransform } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Pipe({
name: </span>'add'<span style="color: rgba(0, 0, 0, 1)">,
})
export class AddPipe implements PipeTransform {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">{{ 10 | add: 2:4:65:55 }}</span>
<span style="color: rgba(0, 0, 0, 1)">transform(value: number, ...args: number[]): number {
args.forEach((item) </span>=> (value +=<span style="color: rgba(0, 0, 0, 1)"> item));
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> value;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 12px">注意:每个管道都需 ng g p 管道名字 再定义函数</span></p>
<h1><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 14pt">自定义指令_______________</span></h1>
<p><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 12px">vue中: directive </span></p>
<p><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 12px">利用 指令 快速操作 指令所在 元素的 DOM</span></p>
<p><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 12px">Angular生成命令:</span></p>
<p><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 12px">ng generate directive 指令名 </span></p>
<p><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 12px">简写: ng g d 指令名</span></p>
<p> </p>
<p><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 12px">新建ng g c myc03组件</span></p>
<p><span style="background-color: rgba(245, 245, 245, 1); font-family: "Courier New"; font-size: 12px">HTML文件:自定义指令</span></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_e9f37dac-6e55-4e2e-aa5a-c203e86626ad" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_e9f37dac-6e55-4e2e-aa5a-c203e86626ad" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_e9f37dac-6e55-4e2e-aa5a-c203e86626ad" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>myc03 works!<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 利用 appHide 可以隐藏元素 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> ng g d hide </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li </span><span style="color: rgba(255, 0, 0, 1)">appHide</span><span style="color: rgba(0, 0, 255, 1)">></span>妮妮<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)">
生成指令命令: ng generate directive 指令名
简称: ng g d 指令名
</span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> app前缀是自带的, 实际执行: ng g d green </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li </span><span style="color: rgba(255, 0, 0, 1)">appGreen</span><span style="color: rgba(0, 0, 255, 1)">></span>波波<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>可可<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>媛媛<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>欢欢<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span> <span style="color: rgba(0, 0, 255, 1)">/><</span><span style="color: rgba(128, 0, 0, 1)">br </span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 自动获取焦点 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 元素具有 focus() 方法, 调用即可获得焦点 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> ng g d focus </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(255, 0, 0, 1)"> appFocus </span><span style="color: rgba(0, 0, 255, 1)">/><</span><span style="color: rgba(128, 0, 0, 1)">br </span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span> <span style="color: rgba(0, 0, 255, 1)">/><</span><span style="color: rgba(128, 0, 0, 1)">br </span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span> <span style="color: rgba(0, 0, 255, 1)">/><</span><span style="color: rgba(128, 0, 0, 1)">br </span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>然后再在app文件夹下创建directive文件夹 再再directive文件夹下运行命令 ng g d 指令名</p>
<p>(这里的指令名不需要加app前缀) 运行命令后会生成对应的.ts文件 需要在其中定义指令的内容</p>
<p>ng g d green -----green.directive.ts文件</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_e961bd99-3a9e-4cb4-93e7-f6eb3b12d7c7" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_e961bd99-3a9e-4cb4-93e7-f6eb3b12d7c7" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_e961bd99-3a9e-4cb4-93e7-f6eb3b12d7c7" class="cnblogs_code_hide">
<pre>import { Directive, ElementRef } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Directive({
selector: </span>''<span style="color: rgba(0, 0, 0, 1)">,
})
export class GreenDirective {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> <li appGreen>波波</li></span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 指令所在的元素, 此处就是 li 会自动作为初始化的参数传入构造方法</span>
<span style="color: rgba(0, 0, 0, 1)">constructor(e: ElementRef) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 此处需要声明类型, 固定类型为 ElementRef</span>
<span style="color: rgba(0, 0, 0, 1)"> console.log(e);
e.nativeElement.style.color </span>= 'green'<span style="color: rgba(0, 0, 0, 1)">;
e.nativeElement.style.border </span>= '1px solid purple'<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>ng g d hide ---hide.directive.ts文件</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_a8145462-2ea1-48c6-a560-e529bcc5d116" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_a8145462-2ea1-48c6-a560-e529bcc5d116" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_a8145462-2ea1-48c6-a560-e529bcc5d116" class="cnblogs_code_hide">
<pre>import { Directive, ElementRef } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Directive({
selector: </span>''<span style="color: rgba(0, 0, 0, 1)">,
})
export class HideDirective {
constructor(e: ElementRef) {
e.nativeElement.style.display </span>= 'none'<span style="color: rgba(0, 0, 0, 1)">;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>ng g d focus ---focus.directive.ts文件</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_694f2541-a9a3-4e58-8537-e32e2b4aab95" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_694f2541-a9a3-4e58-8537-e32e2b4aab95" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_694f2541-a9a3-4e58-8537-e32e2b4aab95" class="cnblogs_code_hide">
<pre>import { Directive, ElementRef } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Directive({
selector: </span>''<span style="color: rgba(0, 0, 0, 1)">,
})
export class FocusDirective {
constructor(e: ElementRef) {
console.log(e);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> focus: 在 input 的 原型链 的 原型链 中</span>
<span style="color: rgba(0, 0, 0, 1)"> e.nativeElement.focus();
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2> 生命周期_____________________</h2>
<p>Vue中组件的生命周期:</p>
<p><span style="font-size: 12px">组件: 准备创建 ->创建完毕 -> 准备挂载 -> 挂载完毕 -> 准备更新 ->更新完毕 -> 将要销毁 ->销 毁完毕</span></p>
<p>钩子函数: 每个周期都会触发对应的函数, 这类函数叫 钩子函数</p>
<p>新建ng g c myc04组件</p>
<p>在其ts文件中:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_36490e68-76f8-4394-919a-25697b070205" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_36490e68-76f8-4394-919a-25697b070205" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_36490e68-76f8-4394-919a-25697b070205" class="cnblogs_code_hide">
<pre>import { Component, OnInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc04'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc04.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc04.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class Myc04Component implements OnInit {
count </span>= 1<span style="color: rgba(0, 0, 0, 1)">;
constructor() {}
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 相当于vue 的 created 周期</span>
console.log('ngOnInit: 开始初始化'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 下方两个周期 合并之后, 就是 vue 的 mounted 周期, 挂载完毕</span>
ngAfterContentInit(): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>'ngAfterContentInit: 数据初始化完毕'<span style="color: rgba(0, 0, 0, 1)">);
}
ngAfterViewInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>'ngAfterViewInit: UI界面初始化完毕'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">更新</span>
ngAfterContentChecked(): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>'ngAfterContentChecked: 数据更新'<span style="color: rgba(0, 0, 0, 1)">);
}
ngAfterViewChecked(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>'ngAfterViewChecked: UI界面更新'<span style="color: rgba(0, 0, 0, 1)">);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">销毁</span>
ngOnDestroy(): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span>'ngOnDestroy: 开始销毁'<span style="color: rgba(0, 0, 0, 1)">);
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2> 组件间参数传递__________________________</h2>
<h3>父子传参</h3>
<p>vue中:</p>
<p>子组件: props: ['name'] 声明需要一个 name 参数</p>
<p>使用时父组件: <tag name="博客"/>即可将name值传递给子组件</p>
<p>创建组件: ng g c myc05</p>
<p>在app.component.html中 给出要传递的值</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">app-myc05 </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="dongdong"</span><span style="color: rgba(255, 0, 0, 1)"> </span><span style="color: rgba(0, 0, 255, 1)">="18"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">app-myc05</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>在myc05.component.ts中设置接收的值</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_07f9e8e1-3dea-44a7-abbd-9ad9e0a9bbde" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_07f9e8e1-3dea-44a7-abbd-9ad9e0a9bbde" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_07f9e8e1-3dea-44a7-abbd-9ad9e0a9bbde" class="cnblogs_code_hide">
<pre>import { Component, Input, OnInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc05'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc05.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc05.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class Myc05Component implements OnInit {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 声明接受外来参数的属性: name</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 外来传入 属性名:类型 = 默认值;</span>
@Input() name: string = '默认值'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">@Input(): 特殊标识, 代表此属性来自外部传入</span>
<span style="color: rgba(0, 0, 0, 1)">
@Input() age: number </span>= 0<span style="color: rgba(0, 0, 0, 1)">;
constructor() {}
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>在myc05.component.html中接收值并显示</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_adfdc57d-e87b-4bb3-8ffa-fdb1f16e6c74" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_adfdc57d-e87b-4bb3-8ffa-fdb1f16e6c74" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_adfdc57d-e87b-4bb3-8ffa-fdb1f16e6c74" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>myc05 works!<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span>name:{{ name }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span>age:{{ age }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">h1</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h3>子父传参</h3>
<p>Vue中:</p>
<p>在父中声明一个函数, 利用子的事件方式, 传递函数给子</p>
<p>就实现了 函数是父的, 但是在子中使用</p>
<p>子中, 触发获取的父的函数, 传入的参数是子的. 函数体是父的. 把子的值传递到父的函数中 特殊的触发方式: $emit</p>
<p>父组件:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_2b2147bc-7f0b-45b2-9d28-b9a402426d59" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_2b2147bc-7f0b-45b2-9d28-b9a402426d59" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_2b2147bc-7f0b-45b2-9d28-b9a402426d59" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">//父组件
</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
//定义函数在子组件上
</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">ratingselect </span><span style="color: rgba(255, 0, 0, 1)">@select-type</span><span style="color: rgba(0, 0, 255, 1)">="onSelectType"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">ratingselect</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
data () {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">return</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
selectType: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">,
},
methods: {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">定义函数内容</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> onSelectType (type) {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.selectType </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> type
}
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>子组件:</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_6116d800-d49f-4507-a0df-63f735b99c97" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_6116d800-d49f-4507-a0df-63f735b99c97" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_6116d800-d49f-4507-a0df-63f735b99c97" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">// 子组件
</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="color: rgba(0, 0, 0, 1)">
//通过点击传入参数
</span><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">span </span><span style="color: rgba(255, 0, 0, 1)">@click</span><span style="color: rgba(0, 0, 255, 1)">="select(0, $event)"</span><span style="color: rgba(255, 0, 0, 1)">:class</span><span style="color: rgba(0, 0, 255, 1)">="{'active': selectType===0}"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">span </span><span style="color: rgba(255, 0, 0, 1)">@click</span><span style="color: rgba(0, 0, 255, 1)">="select(1, $event)"</span><span style="color: rgba(255, 0, 0, 1)">:class</span><span style="color: rgba(0, 0, 255, 1)">="{'active': selectType===1}"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">span </span><span style="color: rgba(255, 0, 0, 1)">@click</span><span style="color: rgba(0, 0, 255, 1)">="select(2, $event)"</span><span style="color: rgba(255, 0, 0, 1)">:class</span><span style="color: rgba(0, 0, 255, 1)">="{'active': selectType===2}"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">template</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">
data () {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">return</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> {
selectType: </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">0</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">,
},
methods: {
select (type, event) {
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.selectType </span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">=</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)"> type
</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">//</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 128, 0, 1)">接收父组件传来的函数并传入参数type</span>
<span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 255, 1)">this</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">.$emit(</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">select-type</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">'</span><span style="background-color: rgba(245, 245, 245, 1); color: rgba(0, 0, 0, 1)">, type)
}
}
</span><span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">script</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>Angular中:</p>
<p>创建组件: ng g c myc06</p>
<p>先在父级app.component.ts中定义函数内容</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_70b392e7-77ac-4d1f-bdde-ea752df0f99a" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_70b392e7-77ac-4d1f-bdde-ea752df0f99a" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_70b392e7-77ac-4d1f-bdde-ea752df0f99a" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">import { Component } from '@angular/core';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css'],
})
export class AppComponent {
title = 'ngpro';
show04 = false;
name = '';
//定义函数并设置接收的参数
showMsg(value) {
console.log(value);
this.name = value.msg;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>再再父级app.component.html中将函数传递给子组件 </p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_5299cad5-c210-4658-952f-c09bf2fc2e6d" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_5299cad5-c210-4658-952f-c09bf2fc2e6d" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_5299cad5-c210-4658-952f-c09bf2fc2e6d" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 子父传参 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 参数 $event 是固定的传入值 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">app-myc06 </span><span style="color: rgba(255, 0, 0, 1)">(sendMsg)</span><span style="color: rgba(0, 0, 255, 1)">="showMsg($event)"</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">app-myc06</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)">将接收的子组件参数显示在父组件上</span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ name }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>子组件myc06.component.ts中接收父组件传递来的函数并传入参数</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_5bc6e196-580e-41ab-88cf-682bbe7bf651" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_5bc6e196-580e-41ab-88cf-682bbe7bf651" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_5bc6e196-580e-41ab-88cf-682bbe7bf651" class="cnblogs_code_hide">
<pre>import { Component, EventEmitter, OnInit, Output } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc06'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc06.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc06.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class Myc06Component implements OnInit {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 声明接受一个事件, 此事件用来向外部输出内容</span>
@Output() sendMsg = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> EventEmitter();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> @Output(): 代表此处的函数是用于向外传递内容</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> EventEmitter: 事件触发器.外部传入的方法会保存在此 触发器中</span>
<span style="color: rgba(0, 0, 0, 1)">
name </span>= ''<span style="color: rgba(0, 0, 0, 1)">;
doSure() {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> emit: 调用 sendMsg 中保存的函数, 传入值{msg: xxx}</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.sendMsg.emit({ msg: <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.name });
console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.name);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.name = ''<span style="color: rgba(0, 0, 0, 1)">;
}
constructor() {}
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>子组件myc06.component.html中定义点击事件触发函数传入参数</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_521faf06-64ba-4000-ad0f-958714ebbc14" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_521faf06-64ba-4000-ad0f-958714ebbc14" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_521faf06-64ba-4000-ad0f-958714ebbc14" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div </span><span style="color: rgba(255, 0, 0, 1)">style</span><span style="color: rgba(0, 0, 255, 1)">="padding: 20px; border: 1px solid purple; width: 400px"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(0, 0, 255, 1)">></span>这里是 myc06<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">b</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 双向绑定数据 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">input </span><span style="color: rgba(255, 0, 0, 1)">type</span><span style="color: rgba(0, 0, 255, 1)">="text"</span><span style="color: rgba(255, 0, 0, 1)"> [(ngModel)]</span><span style="color: rgba(0, 0, 255, 1)">="name"</span> <span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">br </span><span style="color: rgba(0, 0, 255, 1)">/></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 点击触发函数将参数传递给父组件 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">(click)</span><span style="color: rgba(0, 0, 255, 1)">="doSure()"</span><span style="color: rgba(0, 0, 255, 1)">></span>确定<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210428204954512-1539127886.png" alt="" loading="lazy"></p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210428205005404-1174948938.png" alt="" loading="lazy"></p>
<h3> 兄弟传参</h3>
<p>Vue中, 有3种方式实现</p>
<p>依赖共同的父组件: 例如 A 有 B C 两个子; B -> A -> C (通过子传父,父传子)</p>
<p>事件车: eventBus. 利用共同的 Vue 对象共享变量</p>
<p>Vuex: 可以在任意关系的组件之间共享数据</p>
<p> </p>
<p>在vue中, 就是 Vuex 全局状态共享</p>
<p>在angular中, 此知识点叫 服务</p>
<p> </p>
<p>新建组件: ng g c myc07 和 ng g c myc08</p>
<p>在app.component.html 中将组件myc07,myc08引入</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_2904b2ee-cf3a-4531-93bd-0289812fabba" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_2904b2ee-cf3a-4531-93bd-0289812fabba" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_2904b2ee-cf3a-4531-93bd-0289812fabba" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">app-myc07</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">app-myc07</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">hr</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">app-myc08</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">app-myc08</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>在app文件夹下创建services文件夹 然后在该文件夹下运行(全称:ng generate service 服务名)命令 ng g s 服务名</p>
<p>例如: ng g s skill</p>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429093820456-28326295.png" alt="" width="404" height="122" loading="lazy"></p>
<p> </p>
<p> 然后在skillls.service.ts中定义全局变量</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_43fea1f9-c6cd-4d84-a9ca-94722d0c40f7" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_43fea1f9-c6cd-4d84-a9ca-94722d0c40f7" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_43fea1f9-c6cd-4d84-a9ca-94722d0c40f7" class="cnblogs_code_hide">
<pre>import { Injectable } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Injectable({
providedIn: </span>'root'<span style="color: rgba(0, 0, 0, 1)">,
})
export class SkillService {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义的全局变量</span>
skills = ['vue', 'angular', 'react', 'jQuery', 'Vuex', 'UniApp'<span style="color: rgba(0, 0, 0, 1)">];
constructor() { }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>然后在myc07.component.ts ,myc08.component.ts文件中分别引入全局变量</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_eda3b4c7-6597-4474-a1b7-ed7fcde61d64" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_eda3b4c7-6597-4474-a1b7-ed7fcde61d64" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_eda3b4c7-6597-4474-a1b7-ed7fcde61d64" class="cnblogs_code_hide">
<pre>import { Component, OnInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
import { SkillService } from </span>'../services/skill.service'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc08'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc08.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc08.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class Myc08Component implements OnInit {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> TS语言的语法:变量:类型名;</span>
<span style="color: rgba(0, 0, 0, 1)">skillS: SkillService;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 构造方法: 声明依赖. 当前组件实例化必须要 1个 SkillService 类型的值</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 组件是NG的系统自动实例化: 会识别依赖 然后注入对应的值</span>
<span style="color: rgba(0, 0, 0, 1)">constructor(skillS: SkillService) {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> skills 是形参, 属于局部变量. 只能在当前方法中使用</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 要想到 html 中使用, 则必须保存到 属性 中</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.skillS =<span style="color: rgba(0, 0, 0, 1)"> skillS;
}
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {}
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* TS语言的依赖注入机制
*
* 基本的例子:
* - 依赖: 人要活着要喝水 吃饭 呼吸
* - 注入: 要活着,必须 提供 水 饭 空气
</span><span style="color: rgba(0, 128, 0, 1)">*/</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> show函数, 需要一个 string 类型的参数 -- 依赖</span>
<span style="color: rgba(0, 0, 255, 1)">function</span><span style="color: rgba(0, 0, 0, 1)"> show(name: string) {}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用:注入</span>
show('mike'<span style="color: rgba(0, 0, 0, 1)">);
class Demo {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 构造函数: 声明依赖当前类初始化要 1个 string类型的值</span>
<span style="color: rgba(0, 0, 0, 1)">constructor(name: string) {}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 注入: 使用时, 必须提供 1个 string 类型的值</span>
<span style="color: rgba(0, 0, 255, 1)">new</span> Demo('true');</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_0301754f-f109-4832-9f16-97a3722624ff" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_0301754f-f109-4832-9f16-97a3722624ff" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_0301754f-f109-4832-9f16-97a3722624ff" class="cnblogs_code_hide">
<pre>import { Component, OnInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">引入服务</span>
import { SkillService } from '../services/skill.service'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc07'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc07.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc07.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class Myc07Component implements OnInit {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 实际工作时, 一个服务中有非常多的内容需要使用</span>
<span style="color: rgba(0, 0, 0, 1)">skillS: SkillService;
constructor(skillS: SkillService) {
console.log(skillS);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 属性 = 局部变量; 因为局部变量不能在html中使用, 必须变成属性</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.skillS =<span style="color: rgba(0, 0, 0, 1)"> skillS;
}
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>07语法糖写法</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_ef209385-c412-49d1-b7bb-73bf761be76e" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_ef209385-c412-49d1-b7bb-73bf761be76e" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_ef209385-c412-49d1-b7bb-73bf761be76e" class="cnblogs_code_hide">
<pre>import { Component, OnInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
import { SkillService } from </span>'../services/skill.service'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc07'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc07.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc07.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class Myc07Component implements OnInit {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">语法糖写法 等价于之前的写法</span>
<span style="color: rgba(0, 0, 0, 1)">
constructor(public skills: SkillService) { }
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> { }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>最后将引入的数据显示到页面上</p>
<p>myc07.component.html</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_16dedbaf-f8a9-450b-8294-d7304a593764" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_16dedbaf-f8a9-450b-8294-d7304a593764" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_16dedbaf-f8a9-450b-8294-d7304a593764" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>myc07 works!<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li </span><span style="color: rgba(255, 0, 0, 1)">*ngFor</span><span style="color: rgba(0, 0, 255, 1)">="let item of skillS.skills; let i = index"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ item }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 这里点击删除对应的08文件中也会删除 实现了兄弟间共享数据 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">(click)</span><span style="color: rgba(0, 0, 255, 1)">="skillS.skills.splice(i, 1)"</span><span style="color: rgba(0, 0, 255, 1)">></span>删除<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>myc08.component.html</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_d68fe498-c43b-4202-8fc9-818e952c01b8" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_d68fe498-c43b-4202-8fc9-818e952c01b8" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_d68fe498-c43b-4202-8fc9-818e952c01b8" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>myc08 works!<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">li </span><span style="color: rgba(255, 0, 0, 1)">*ngFor</span><span style="color: rgba(0, 0, 255, 1)">="let item of skillS.skills; let i = index"</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ item }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">span</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 这里点击删除对应的07文件中也会删除 实现了兄弟间共享数据 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">(click)</span><span style="color: rgba(0, 0, 255, 1)">="skillS.skills.splice(i, 1)"</span><span style="color: rgba(0, 0, 255, 1)">></span>删除<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">li</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">ul</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>如此一来就实现了兄弟间传参</p>
<h2> 系统服务________________________</h2>
<p>官方默认提供了非常多 强大的服务, 例如: 网络服务</p>
<h3>网络服务</h3>
<p>网络模块默认未加载, 必须到 app.module.ts 中加载网络模块</p>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429102952620-804682829.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p> <img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429102957708-59514712.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p> 创建组件: ng g c myc10</p>
<p>myc10.component.ts中使用网络模块</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_04759663-9aea-4a47-9b6f-71501bd86473" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_04759663-9aea-4a47-9b6f-71501bd86473" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_04759663-9aea-4a47-9b6f-71501bd86473" class="cnblogs_code_hide">
<pre>import { HttpClient } from '@angular/common/http'<span style="color: rgba(0, 0, 0, 1)">;
import { Component, OnInit } from </span>'@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">////////////////////////////////////</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">////// TypeScript语言是类型严格语言</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 此语言中, 必须掌握 自定义对象类型的声明</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> interface 类型名{}</span>
<span style="color: rgba(0, 0, 0, 1)">interface Res {
code: number;
message: string;
result: Result[];
}
interface Result {
image: string;
path: string;
passtime: string;
title: string;
}
@Component({
selector: </span>'app-myc10'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc10.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc10.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class Myc10Component implements OnInit {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 此处声明依赖: 需要网络服务 HttpClient 的支持</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 这是语法糖写法</span>
<span style="color: rgba(0, 0, 0, 1)">constructor(public http: HttpClient) { }
result: Result[] </span>=<span style="color: rgba(0, 0, 0, 1)"> [];
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 相当于vue 的 created 周期</span>
ngOnInit(): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> axios.get(url).then(res=>{})</span>
const url = 'https://api.apiopen.top/getWangYiNews'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 差别:用 subscribe单词 替换了then, 效果是一样的</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.http.get(url).subscribe((res: Res) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 变量:any代表此变量是任意类型, 则vscode不会检测此类型 使用时是否有错误</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 返回值的类型, 应该自己声明, 这样才标准</span>
<span style="color: rgba(0, 0, 0, 1)"> console.log(res);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.result =<span style="color: rgba(0, 0, 0, 1)"> res.result;
});
}
}
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* jQuery- ajax
* vue -- axios
* react - fetch
* angular - 网络服务
</span><span style="color: rgba(0, 128, 0, 1)">*/</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>获取数据后就可以挂载到页面上显示了</p>
<h2>跨域问题_______________________</h2>
<p>angular的服务器提供 proxy 代理方式解决跨域问题</p>
<p>生成组件: ng g c myc11</p>
<p>在app.module.ts中引入HttpClientModule模块</p>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429111752590-971096483.png" alt="" loading="lazy"></p>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429111736189-973610445.png" alt="" loading="lazy"></p>
<p>在组件的ts文件中发送请求(以一个跨域的连接为例</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_bb3fe005-362c-425c-b80d-cf103c5e328d" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_bb3fe005-362c-425c-b80d-cf103c5e328d" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_bb3fe005-362c-425c-b80d-cf103c5e328d" class="cnblogs_code_hide">
<pre>import { HttpClient } from "@angular/common/http"<span style="color: rgba(0, 0, 0, 1)">;
import { Component, OnInit } from </span>'@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc10'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc10.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc10.component.css'<span style="color: rgba(0, 0, 0, 1)">]
})
export class Myc10Component implements OnInit {
constructor(public http: HttpClient) { }
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">不使用代理的url</span>
const url = 'https://m.douyu.com/api/room/list?page=1&type=yz'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.http.get(url).subscribe((res) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p><span style="font-family: "PingFang SC", "Helvetica Neue", Helvetica, Arial, sans-serif">此时会出现跨域错误</span></p>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429111142661-1526372074.png" alt="" width="444" height="88" loading="lazy"></p>
<p> </p>
<p> </p>
<p> 开始解决跨域错误</p>
<p>在 src 目录下, 新建 proxy.config.json 文件</p>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429111348745-953180144.png" alt="" loading="lazy"></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_192d2f18-edd8-4761-a171-295f8368b4bf" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_192d2f18-edd8-4761-a171-295f8368b4bf" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_192d2f18-edd8-4761-a171-295f8368b4bf" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span>"/api"<span style="color: rgba(0, 0, 0, 1)">:{
</span>"target": "https://m.douyu.com"<span style="color: rgba(0, 0, 0, 1)">,
</span>"changeOrigin": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"secure": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"pathRewrite"<span style="color: rgba(0, 0, 0, 1)">: {
</span>"/api": ""<span style="color: rgba(0, 0, 0, 1)">
},
</span>"logLevel": "debug"<span style="color: rgba(0, 0, 0, 1)">
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>在angular.json中配置proxy文件</p>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429112018161-56348853.png" alt="" loading="lazy"></p>
<p> </p>
<p> </p>
<p>myc11.component.ts代码中, 把请求的地址 改成 <strong>代理方式</strong></p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_20ecbdac-cd6a-4289-aa2d-10b6b3557ef7" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_20ecbdac-cd6a-4289-aa2d-10b6b3557ef7" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_20ecbdac-cd6a-4289-aa2d-10b6b3557ef7" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">注意引入网络模块</span>
import { HttpClient } from "@angular/common/http"<span style="color: rgba(0, 0, 0, 1)">;
import { Component, OnInit } from </span>'@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc10'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc10.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc10.component.css'<span style="color: rgba(0, 0, 0, 1)">]
})
export class Myc10Component implements OnInit {
constructor(public http: HttpClient) { }
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">不使用代理的url</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> const url = 'https://m.douyu.com/api/room/list?page=1&type=yz';</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 使用代理的 /api 代替 https://m.douyu.com</span>
<span style="color: rgba(0, 0, 0, 1)">
const url </span>= '/api/api/room/list?page=1&type=yz'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.http.get(url).subscribe((res) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
});
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<div>注意:修改之后, 必须重启服务器, 才能生效.</div>
<div><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429112249795-369971565.png" alt="" width="463" height="210" loading="lazy">
<p> 综上做一个新的例子 重新生成项目 ng new work</p>
<p>创建组件 ng g c work</p>
<p>在app.module.ts中</p>
<p><img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429173335422-1356775974.png" alt="" loading="lazy"></p>
<p> <img src="https://img2020.cnblogs.com/blog/1770052/202104/1770052-20210429173353425-2074787948.png" alt="" loading="lazy"></p>
<p> </p>
<p> app.component.html中引入子组件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">app-work</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">app-work</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>work.component.ts 获取页面数据以及一些函数</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_796a19ec-495a-4957-9dff-fe702e19aa0c" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_796a19ec-495a-4957-9dff-fe702e19aa0c" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_796a19ec-495a-4957-9dff-fe702e19aa0c" class="cnblogs_code_hide">
<pre>import { HttpClient } from '@angular/common/http'<span style="color: rgba(0, 0, 0, 1)">;
import { Component, OnInit } from </span>'@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-work'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./work.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./work.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class WorkComponent implements OnInit {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">网络服务的语法糖写法</span>
<span style="color: rgba(0, 0, 0, 1)">constructor(public http: HttpClient) { }
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 定义函数传递参数 方便获取url不同页数</span>
<span style="color: rgba(0, 0, 0, 1)">getUrl(pno: number) {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> (
</span>'http://101.96.128.94:9999/mfresh/data/news_select.php?pageNum=' +<span style="color: rgba(0, 0, 0, 1)"> pno
);
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ngfor不能直接遍历数字 将页数转换为数组</span>
<span style="color: rgba(0, 0, 0, 1)">range(num: number) {
const arr </span>=<span style="color: rgba(0, 0, 0, 1)"> [];
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (let i = 1; i <= num; i++<span style="color: rgba(0, 0, 0, 1)">) {
arr.push(i);
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> arr;
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">点击不同的页数发送请求</span>
<span style="color: rgba(0, 0, 0, 1)">getData(pno: number) {
const url </span>= <span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.getUrl(pno);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.http.get(url).subscribe((res: News) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.news =<span style="color: rgba(0, 0, 0, 1)"> res;
});
}
news: News; </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">没写值 则默认值为 undefined</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">初始化是获取数据</span>
ngOnInit(): <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {
const url </span>= <span style="color: rgba(0, 0, 255, 1)">this</span>.getUrl(1<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.http.get(url).subscribe((res: News) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(res);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 常见波浪线问题: 返回值的类型默认是 Object, 就是 空{},必须认为声明类型, vscode 才会正常识别</span>
<span style="color: rgba(0, 0, 255, 1)">this</span>.news =<span style="color: rgba(0, 0, 0, 1)"> res;
});
}
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">///////////////////////////////////////</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/////// 非必备操作, 但是TS支持类型</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)">/// 应该对返回值进行类型声明</span><span style="color: rgba(0, 128, 0, 1)">
//</span><span style="color: rgba(0, 128, 0, 1)"> 在使用时, 可以提供更多的便捷</span>
<span style="color: rgba(0, 0, 0, 1)">interface News {
data: NewsData[];
pageCount: number;
pageNum: number;
pageSize: number;
totalRecord: number;
}
interface NewsData {
content: string;
nid: string;
pubTime: string;
title: string;
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>work.component.html构建页面</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_23bfdcd6-7e1c-467c-aa73-045082adb15f" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_23bfdcd6-7e1c-467c-aa73-045082adb15f" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_23bfdcd6-7e1c-467c-aa73-045082adb15f" class="cnblogs_code_hide">
<pre><p>work works!</p>
<!-- 利用if判断, 在网络数据没有之前, 不要渲染这些DOM, 防止报错 -->
<div class="news" *ngIf="news">
<div>
<div *ngFor="let item of news.data; let i = index" class="cell">
<span>{{ item.title }}</span>
<!-- 管道写法 -->
<span>{{ item.pubTime | date: "yyyy-MM-dd" }}</span>
</div>
</div>
<div class="pages">
<span (click)="getData(news.pageNum - 1)" *ngIf="news.pageNum > 1">上一页</span>
<span class="disable" *ngIf="news.pageNum == 1">上一页</span>
<span (click)="getData(item)" ="{ cur: news.pageNum == item }"
*ngFor="let item of range(news.pageCount)">{{ item }}</span>
<span (click)="getData(news.pageNum + 1)" *ngIf="news.pageNum < news.pageCount">下一页</span>
<span class="disable" *ngIf="news.pageNum >= news.pageCount">下一页</span>
</div>
</div></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>work.component.css修饰页面</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_d4fdd73e-7143-4047-bf1a-6c2e456f03dc" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_d4fdd73e-7143-4047-bf1a-6c2e456f03dc" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_d4fdd73e-7143-4047-bf1a-6c2e456f03dc" class="cnblogs_code_hide">
<pre><span style="color: rgba(128, 0, 0, 1)">.news </span>{<span style="color: rgba(255, 0, 0, 1)">
width</span>:<span style="color: rgba(0, 0, 255, 1)"> 700px</span>;<span style="color: rgba(255, 0, 0, 1)">
margin</span>:<span style="color: rgba(0, 0, 255, 1)"> 0 auto</span>;
}<span style="color: rgba(128, 0, 0, 1)">
.cell </span>{<span style="color: rgba(255, 0, 0, 1)">
padding</span>:<span style="color: rgba(0, 0, 255, 1)"> 5px</span>;<span style="color: rgba(255, 0, 0, 1)">
border-bottom</span>:<span style="color: rgba(0, 0, 255, 1)"> 1px gray dashed</span>;<span style="color: rgba(255, 0, 0, 1)">
display</span>:<span style="color: rgba(0, 0, 255, 1)"> flex</span>;<span style="color: rgba(255, 0, 0, 1)">
justify-content</span>:<span style="color: rgba(0, 0, 255, 1)"> space-between</span>;
}<span style="color: rgba(128, 0, 0, 1)">
.pages </span>{<span style="color: rgba(255, 0, 0, 1)">
text-align</span>:<span style="color: rgba(0, 0, 255, 1)"> center</span>;<span style="color: rgba(255, 0, 0, 1)">
margin-top</span>:<span style="color: rgba(0, 0, 255, 1)"> 10px</span>;<span style="color: rgba(255, 0, 0, 1)">
user-select</span>:<span style="color: rgba(0, 0, 255, 1)"> none</span>;
}<span style="color: rgba(128, 0, 0, 1)">
.pages > span </span>{<span style="color: rgba(255, 0, 0, 1)">
display</span>:<span style="color: rgba(0, 0, 255, 1)"> inline-block</span>;<span style="color: rgba(255, 0, 0, 1)">
margin</span>:<span style="color: rgba(0, 0, 255, 1)"> 2px</span>;<span style="color: rgba(255, 0, 0, 1)">
padding</span>:<span style="color: rgba(0, 0, 255, 1)"> 2px 8px</span>;<span style="color: rgba(255, 0, 0, 1)">
border</span>:<span style="color: rgba(0, 0, 255, 1)"> 1px solid gray</span>;<span style="color: rgba(255, 0, 0, 1)">
color</span>:<span style="color: rgba(0, 0, 255, 1)"> gray</span>;<span style="color: rgba(255, 0, 0, 1)">
border-radius</span>:<span style="color: rgba(0, 0, 255, 1)"> 3px</span>;
}<span style="color: rgba(128, 0, 0, 1)">
.pages > span:not(.cur):not(.disable):hover </span>{<span style="color: rgba(255, 0, 0, 1)">
color</span>:<span style="color: rgba(0, 0, 255, 1)"> orange</span>;<span style="color: rgba(255, 0, 0, 1)">
border-color</span>:<span style="color: rgba(0, 0, 255, 1)"> orange</span>;<span style="color: rgba(255, 0, 0, 1)">
cursor</span>:<span style="color: rgba(0, 0, 255, 1)"> pointer</span>;
}<span style="color: rgba(128, 0, 0, 1)">
.pages > .cur </span>{<span style="color: rgba(255, 0, 0, 1)">
color</span>:<span style="color: rgba(0, 0, 255, 1)"> white</span>;<span style="color: rgba(255, 0, 0, 1)">
background-color</span>:<span style="color: rgba(0, 0, 255, 1)"> orange</span>;<span style="color: rgba(255, 0, 0, 1)">
border-color</span>:<span style="color: rgba(0, 0, 255, 1)"> orange</span>;
}
<span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)"> 不可用状态 </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(128, 0, 0, 1)">
.pages > .disable </span>{<span style="color: rgba(255, 0, 0, 1)">
color</span>:<span style="color: rgba(0, 0, 255, 1)"> lightgray</span>;<span style="color: rgba(255, 0, 0, 1)">
border-color</span>:<span style="color: rgba(0, 0, 255, 1)"> lightgray</span>;
}
</pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<h2>掌控子元素________________</h2>
<p>在 Vue 中: 利用 ref 属性 绑定一个变量 到 一个组件上, 然后就可以利用变量操作组件</p>
<p>创建组件: ng g c myc01</p>
<p>在myc01.component.ts中定义事件和变量</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_1ab4557b-2aa6-46f5-9734-391e7815c24f" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_1ab4557b-2aa6-46f5-9734-391e7815c24f" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_1ab4557b-2aa6-46f5-9734-391e7815c24f" class="cnblogs_code_hide">
<pre>import { Component, OnInit } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-myc01'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./myc01.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./myc01.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class Myc01Component implements OnInit {
num </span>= 1<span style="color: rgba(0, 0, 0, 1)">;
show() {
alert(</span>'我是myc01'<span style="color: rgba(0, 0, 0, 1)">);
}
constructor() {}
ngOnInit(): </span><span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> {}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>在myc01.component.html中构建子元素基本结构</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>myc01 works!<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">p</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span>{{ num }}<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">div</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>在app.component.html中给子元素myc01绑定唯一标识</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_9f1d99a3-9ea2-41e1-8b84-938c74aee2aa" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_9f1d99a3-9ea2-41e1-8b84-938c74aee2aa" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_9f1d99a3-9ea2-41e1-8b84-938c74aee2aa" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 掌控子元素 </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">button </span><span style="color: rgba(255, 0, 0, 1)">(click)</span><span style="color: rgba(0, 0, 255, 1)">="changeSon()"</span><span style="color: rgba(0, 0, 255, 1)">></span>修改子元素内容<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">button</span><span style="color: rgba(0, 0, 255, 1)">></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> # 用于为子元素快速添加唯一标识, 类似于id </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 128, 0, 1)"><!--</span><span style="color: rgba(0, 128, 0, 1)"> 这里的 abc 随意起名, 不和其他元素重复即可. </span><span style="color: rgba(0, 128, 0, 1)">--></span>
<span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">app-myc01 </span><span style="color: rgba(255, 0, 0, 1)">#abc</span><span style="color: rgba(0, 0, 255, 1)">></</span><span style="color: rgba(128, 0, 0, 1)">app-myc01</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p>在app.component.ts中通过viewchild查找指点绑定的元素通过事件控制其子元素事件和变量</p>
<div class="cnblogs_code"><img src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" id="code_img_closed_a738afb6-a2e9-452d-9bb0-475a0ece60f3" class="code_img_closed"><img src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" id="code_img_opened_a738afb6-a2e9-452d-9bb0-475a0ece60f3" class="code_img_opened" style="display: none">
<div id="cnblogs_code_open_a738afb6-a2e9-452d-9bb0-475a0ece60f3" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">导入ViewChild</span>
import { Component, ViewChild } from '@angular/core'<span style="color: rgba(0, 0, 0, 1)">;
import { Myc01Component } from </span>'./myc01/myc01.component'<span style="color: rgba(0, 0, 0, 1)">;
@Component({
selector: </span>'app-root'<span style="color: rgba(0, 0, 0, 1)">,
templateUrl: </span>'./app.component.html'<span style="color: rgba(0, 0, 0, 1)">,
styleUrls: [</span>'./app.component.css'<span style="color: rgba(0, 0, 0, 1)">],
})
export class AppComponent {
title </span>= 'ngpro'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> ViewChild: 查找指定id的元素</span>
<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 找到 #abc的元素, 绑定给 xyz 变量</span>
@ViewChild('abc'<span style="color: rgba(0, 0, 0, 1)">) xyz: Myc01Component;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">定义事件函数控制子元素</span>
<span style="color: rgba(0, 0, 0, 1)">changeSon() {
console.log(</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.xyz);
</span><span style="color: rgba(0, 0, 255, 1)">this</span>.xyz.num = 100<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">this</span><span style="color: rgba(0, 0, 0, 1)">.xyz.show();
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">View Code</span></div>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
</div>
<p> </p><br><br>
来源:https://www.cnblogs.com/CIBud/p/14714343.html
頁:
[1]