gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

Angular開發問題記錄:組件數據不能實時更新到視圖上

工作中碰到一個問題:Angular組件數據不能實時更新到視圖上,問題本身比較容易解決,但還是總結記錄一下。

Angular開發問題記錄:組件數據不能實時更新到視圖上

前端(vue)入門到精通課程,老師在線輔導:聯系老師
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調試工具:點擊使用

先來說一下起因吧。【相關教程推薦:《angular教程》】

問題起源


MainComponent:

@Component({   selector: 'main',   template: `     <MenuComponent [isReport]="isReport"> 	  </MenuComponent>  `,   changeDetection:ChangeDetectionStrategy.OnPush }) export class MainComponent {   ... }
登錄后復制

現在有一個MainComponent,我需要在這個組件中引用一個另一個組件MenuComponent

import { Component, Input} from '@angular/core'; import { Subject, debounceTime } from 'rxjs';  @Component({   selector: 'movie',   styles: ['div {border: 1px solid black}'],   template: `     <div (mouseover)="mouseOver()">       <h3>{{ menu }}</h3>     </div>` }) export class MovieComponent {   @Input() isReport: boolean = false;   menu: string = '我是Menu';    mouseOver$: Subject<any> = new Subject();    ngOnInit(): void {     this.mouseOver$.pipe(debounceTime(250)).subscribe((data) => {        this.menu = 'New: ' + this.menu;     });   }    mouseOver(): void {     this.mouseOver$.next(this.menu);   } }
登錄后復制

這個MenuComponent在其他的頁面使用起來是正常的,而且因為是Menu組件,所以上面很有多mouseover事件,這些事件也可以正常工作。但,這個 MenuComponent 放在MainComponent中,mouseover事件就有問題了,調試了下mouseover事件,代碼都正確執行了,感覺代碼并沒有什么問題。因為這個組件放在其他頁面里,行為完全正常,所以感覺不是組件本身的問題。

表現的現象是

Menu里的mouseover行為很怪異,你over到A的時候,顯示的是B的數據,當你over到B的時候顯示的是A的數據,整個錯亂了。

第一反應就是,這會不會是和MainComponent中的mouseover事件沖突了呢?

檢查了一遍,沒有發現問題所在。但是有意外收獲,啊啊啊,MainComponent組件使用的是OnPush變更檢測策略,難怪其他頁面都好使,就這個地方有問題了。好了,問題應該就是OnPush造成的。關于變更檢測策略的,那還不是手到擒來,在熟悉不過了,來來來,一起簡單看一下這個OnPush。

OnPush策略

Angular有兩種變更檢測的策略,一種是Default,另一種就是這個OnPush。OnPush這個變更檢測策略主要為了改善性能。當我們設置組件裝飾器的 changeDetection為OnPush的時候,Angular 每次觸發變更檢測后會跳過該組件和該組件的所以子組件變化檢測

好了,我們也知道什么是OnPush變更檢測策略了,它會跳過當前組件和其子組件的變更 檢測。也就是說,你改變這個組件的屬性值,但這些屬性值并不會更新到視圖上,也就是組件數組和視圖不一致。那我們知道了這一點,再回去看一下MenuComponent

由于MainComponent的變更策略設置為了OnPush,他的子組件的變更檢測策略會跳過,也就是MenuComponent變更檢測不起作用了。但是,你會發現當你操作Menu的時候視圖還是會有變化的。這是怎么回事?

大部分人可能花一分鐘了解了OnPush是什么,但是沒有了解透徹。繼續往下看。

OnPush 策略下,以下這種情況會觸發組件的變化檢測:

當前組件或子組件之一觸發了事件

如果OnPush組件或其子組件之一觸發(DOM/BOM)事件,例如 clickmouseovermouseleaveresize, keydown,則將觸發變化檢測(針對組件樹中的所有組件)。

需要注意的是在OnPush策略中,以下操作不會觸發變化檢測:

  • setTimeout()

  • setInterval()

  • Promise.resolve().then()

  • this.http.get('…').subscribe()

原來如此,盡管是OnPush策略,但是DOM/BOM事件還是會觸發變更檢測的,所以MenuComponent的視圖還是會有變化的,也就是這個變更檢測是起作用的。但問題還是沒有解決,Menu mouseover的時候還是會錯亂啊!再來看一下代碼。

ngOnInit(): void {     this.mouseOver$.pipe(debounceTime(250)).subscribe((data) => {        this.menu = 'New: ' + this.menu;     }); }
登錄后復制

引起問題的地方就是這debounceTime,這個之前在介紹Rxjs原理的時候,說過這個是異步的。之前掌握的東西,終于派上用場了。

總結一下,就是mouseover是異步的,會觸發變更檢測,但是由于debounceTime是異步又嵌套了一下,debounceTime一般是用setTimeout來實現的。所以,debounceTime里的數據變化并不能及時的顯示到視圖中。終于找到問題的根源了。啦啦啦。問題找到了,那解決起來多easy啊。它不是不會觸發變更檢測嗎,我就手動讓它觸發一下吧。

import { Component, Input, ChangeDetectorRef } from '@angular/core'; import { Subject, debounceTime } from 'rxjs';  @Component({   selector: 'movie',   styles: ['div {border: 1px solid black}'],   template: `...` }) export class MovieComponent {   ...    constructor(private cd: ChangeDetectorRef){}    ngOnInit(): void {     this.mouseOver$.pipe(debounceTime(250)).subscribe((data) => {        this.menu = 'New: ' + this.menu;         this.cd.detectChanges();     });   }    ... }
登錄后復制

總結


  • 平時多注意知識積累,不能按照網上說的解決方案復制過來就解決了,遇到簡單問題這樣是沒有問題的,遇到復雜的就沒辦法了;

  • 當設置為Onpush策略時,要更加注意,用OnPush就是要減少變更檢測的次數,就不要無論什么情況都detectChanges,或markForCheck,失去了意義,還是要規范使用;

  • 要優雅實現代碼,項目中居然還看到把父組件的ChangeDetectorRef作為輸入屬性傳到子組件中,一看就不懂變更檢測啊;

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
欧美与动交zoz0z| 中文字幕第38页| 亚洲人成无码www久久久| 欧美精品性生活| 久艹在线免费观看| 色一情一区二区| 日本一区二区黄色| 影音先锋成人资源网站| 自拍偷拍21p| 久章草在线视频| 五十路熟女丰满大屁股| 波多野结衣免费观看| 男女视频一区二区三区| 久久成人福利视频| 国产高清免费在线| 久久av秘一区二区三区| 中文字幕一区二区三区四区在线视频| 日本一区午夜艳熟免费| 日本高清免费观看| 日韩成人精品视频在线观看| av免费在线播放网站| 日本黄色三级大片| 成年人午夜免费视频| 久久成人福利视频| 国产日本在线播放| 97在线国产视频| 国产真人做爰毛片视频直播| 996这里只有精品| 4444在线观看| 亚洲精品国产suv一区88| 三年中文高清在线观看第6集| 老司机午夜性大片| 欧美美女性视频| 三级性生活视频| 婷婷视频在线播放| 国产小视频免费| 欧美不卡在线播放| 欧美日韩一区二区在线免费观看| 无码人妻h动漫| 爱情岛论坛vip永久入口| wwwwww.色| 91蝌蚪视频在线| 天堂av免费看| 久青草视频在线播放| 国产日韩亚洲欧美在线| 国产精品丝袜久久久久久消防器材| 国产 日韩 欧美在线| 97成人在线观看视频| 亚洲精品高清无码视频| 污网站在线免费| 少妇高潮大叫好爽喷水| 青草青青在线视频| 久久精品影视大全| 看一级黄色录像| 凹凸国产熟女精品视频| 天天干天天玩天天操| 久久手机在线视频| 五月婷婷深爱五月| 屁屁影院ccyy国产第一页| 国产精品无码av在线播放| 毛葺葺老太做受视频| a级黄色片网站| av片中文字幕| 成人毛片100部免费看| mm1313亚洲国产精品无码试看| 国产欧美一区二| 欧美变态另类刺激| 欧美一级视频在线| 9久久9毛片又大又硬又粗| 17c国产在线| 国产日韩一区二区在线观看| 亚洲热在线视频| 男人操女人免费软件| 国风产精品一区二区| 久章草在线视频| 日本午夜激情视频| 中文字幕制服丝袜在线| www.天天射.com| 国内精品视频一区二区三区| 九九热免费在线观看| 日韩精品 欧美| 午夜在线视频免费观看| 亚洲一区日韩精品| 亚洲精品乱码久久久久久自慰 | 国产二级片在线观看| 激情成人在线观看| 看欧美ab黄色大片视频免费| 韩日视频在线观看| 91免费国产精品| 91嫩草国产丨精品入口麻豆| 伊人色在线观看| 日本激情视频在线播放| 人妻无码视频一区二区三区| 久久视频这里有精品| 久激情内射婷内射蜜桃| 亚洲精品蜜桃久久久久久| 五月天六月丁香| 网站在线你懂的| 一区二区三区网址| 99热一区二区| 99999精品| 国产资源第一页| 国产专区在线视频| 人妻av无码专区| 国产精品333| 日韩免费高清在线| 欧美色图另类小说| 日日碰狠狠丁香久燥| 欧美伦理片在线看| 91精品视频国产| 最新av在线免费观看| 国产成人一二三区| 337p粉嫩大胆噜噜噜鲁| 日本爱爱免费视频| 亚洲精品综合在线观看| 日韩视频在线观看视频| 色一情一乱一乱一区91| 91成人在线观看喷潮教学| 韩国日本美国免费毛片| 亚洲免费黄色录像| av一区二区三区免费观看| 成人免费性视频| 九热视频在线观看| www婷婷av久久久影片| 男人操女人免费软件| 一本一道久久a久久综合蜜桃| 日韩视频一二三| 免费在线激情视频| 在线看的黄色网址| www.男人天堂网| 日韩毛片在线免费看| 精品国产无码在线| jizzjizzxxxx| 超碰97免费观看| chinese少妇国语对白| 午夜啪啪福利视频| 日韩日韩日韩日韩日韩| 欧洲在线免费视频| 成人在线免费在线观看| 99九九精品视频| 欧美色图色综合| 在线观看免费黄色片| 精品久久久久av| 毛片av在线播放| 在线视频日韩欧美| 国产日韩一区二区在线观看| 特黄特黄一级片| 国产免费视频传媒| 欧美精品卡一卡二| 26uuu成人| 手机免费av片| 色婷婷狠狠18| 久久久久久久久久久久久国产精品| 国产成人强伦免费视频网站| caopor在线视频| 高清在线观看免费| 日本xxxxxxxxxx75| www插插插无码免费视频网站| 天天干天天干天天干天天干天天干| 国产精品网站免费| 欧美人成在线观看| 轻点好疼好大好爽视频| 午夜剧场高清版免费观看 | 香港三级日本三级a视频| 999精彩视频| 91香蕉视频导航| 在线视频日韩一区 | 欧美大片在线播放| 日本精品久久久久久久久久| 99热这里只有精品7| 欧美专区第二页| 黄色a级三级三级三级| 亚洲自拍第三页| 欧美日韩一区二区三区电影| 色乱码一区二区三区熟女| 中文字幕一区二区三区四区五区人| www.午夜av| 一级黄色录像免费看| a级片一区二区| 亚洲国产精品无码观看久久| 成年人午夜视频在线观看| cao在线观看| 青青青在线播放| 奇米视频7777| 91免费版看片| 热99这里只有精品| 日韩av播放器| 亚洲一二区在线观看| 成年丰满熟妇午夜免费视频| 成人网站免费观看入口| 茄子视频成人免费观看| 欧美特黄aaa| 日韩成人手机在线| 毛片一区二区三区四区| 三级av免费看| 亚洲天堂av免费在线观看| 欧美 日韩 亚洲 一区| jizzzz日本| 免费网站在线观看视频| 黄色av免费在线播放|