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

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

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

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

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

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

先來說一下起因吧?!鞠嚓P教程推薦:《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)事件,例如 clickmouseover,mouseleave,resize, 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一区二区
久久久久久久久久久福利| 男人天堂手机在线视频| 大西瓜av在线| 手机av在线网| 男人日女人下面视频| 婷婷激情综合五月天| 男人天堂999| 日韩极品视频在线观看| 亚洲美女性囗交| 青青在线视频观看| 日韩极品视频在线观看| 一级片免费在线观看视频| 国模无码视频一区二区三区| 久久av秘一区二区三区| 国产免费999| www.com毛片| 国产91在线亚洲| 欧美一级免费在线| 国产美女18xxxx免费视频| 国产性xxxx18免费观看视频| 九九热只有这里有精品| 超碰91在线播放| 91视频这里只有精品| caopor在线视频| 免费黄色日本网站| 国产中文字幕乱人伦在线观看| 秋霞在线一区二区| 激情成人在线观看| 亚洲一二区在线观看| 国产一二三区av| 国产裸体免费无遮挡| 日本wwww视频| 99精品视频在线看| 青青草视频在线免费播放 | 精品人妻一区二区三区四区在线| 五月天激情图片| 欧美少妇一区二区三区| www.色.com| 久久av喷吹av高潮av| 亚洲色图欧美自拍| 天天干天天曰天天操| 一级网站在线观看| 国产麻豆电影在线观看| 精品一区二区成人免费视频 | 成人综合视频在线| 人人妻人人添人人爽欧美一区| 亚洲国产精品无码av| 国产极品尤物在线| av免费播放网址| 欧美 日韩 国产 激情| 一区二区xxx| 欧美激情第一区| 欧美一级特黄aaaaaa在线看片| 色一情一乱一乱一区91| 国内少妇毛片视频| 日韩avxxx| 在线免费视频a| 国产成人美女视频| 看一级黄色录像| 青青草精品视频在线| 国产主播在线看| 日日干夜夜操s8| 91视频成人免费| 国产精品50p| 奇米视频888| 水蜜桃在线免费观看| 免费一级特黄毛片| 国产a级片免费观看| 一区二区久久精品| 青青草视频在线免费播放| 亚洲国产精品久久久久爰色欲| 免费看涩涩视频| 青青草视频在线视频| 日韩欧美在线播放视频| 亚洲黄色片免费| 青青草视频在线免费播放| 91看片在线免费观看| 日产精品久久久久久久蜜臀| 超碰网在线观看| 特级黄色录像片| 国产最新免费视频| 欧美少妇一级片| 亚洲国产精品毛片av不卡在线| 99视频在线观看视频| 国产精品va无码一区二区| xxww在线观看| 精品中文字幕av| 在线免费看v片| 成人在线观看黄| 国产欧美123| 色噜噜狠狠永久免费| 日韩精品在线中文字幕| 天堂中文av在线| 免费日韩视频在线观看| 国产精品igao激情视频| 色婷婷狠狠18| 黄色av网址在线播放| 国产av不卡一区二区| 三上悠亚在线一区二区| 熟女少妇在线视频播放| 日韩国产精品毛片| 久久撸在线视频| 黄色片一级视频| 我的公把我弄高潮了视频| 国产在线视频三区| www.日本一区| 无码aⅴ精品一区二区三区浪潮| 粉嫩av一区二区三区天美传媒 | 国产91porn| 亚洲图片 自拍偷拍| 国产精品人人爽人人爽| 九九九九免费视频| 成人小视频在线观看免费| 一本之道在线视频| 日韩欧美国产片| 亚洲欧美激情网| 免费av网址在线| 久久国产亚洲精品无码| 久久久久99精品成人片| 日本老太婆做爰视频| 波多野结衣在线免费观看| 午夜久久福利视频| 日韩精品视频一二三| 欧美三级理论片| 91香蕉视频污版| 午夜dv内射一区二区| 青青青在线播放| 人妻有码中文字幕| 青青青在线播放| 免费黄色一级网站| 国产三级日本三级在线播放| 116极品美女午夜一级| 亚洲欧洲日产国码无码久久99| 成人性生活视频免费看| 男女超爽视频免费播放| 国产中文字幕视频在线观看| 免费av观看网址| 亚洲人成色77777| 熟妇人妻va精品中文字幕| 黄色成人免费看| xxx国产在线观看| 成年人网站av| 亚洲国产一二三精品无码 | 亚洲 高清 成人 动漫| 日韩a在线播放| 亚洲成人福利在线观看| 亚洲最大天堂网| 在线观看污视频| 久久久久久免费看| 精品99在线视频| 欧美一级特黄a| 波多野结衣网页| 69精品丰满人妻无码视频a片| 国产aaa免费视频| 亚洲午夜精品久久久久久人妖| 男人舔女人下面高潮视频| 亚洲欧美在线精品| 亚洲美女自拍偷拍| 777av视频| 在线观看的毛片| gogogo免费高清日本写真| 大胆欧美熟妇xx| 成人精品视频一区二区| 成人高清在线观看视频| 欧美成人三级在线视频| 欧美日韩第二页| 免费不卡av网站| 国产肥臀一区二区福利视频| 不卡av免费在线| 日本一道在线观看| 777米奇影视第四色| 国产999免费视频| 国产亚洲综合视频| 亚洲综合伊人久久| a√天堂在线观看| www.色.com| 成年人免费在线播放| 韩国黄色一级大片| 国产97色在线 | 日韩| 伊人网在线免费| 精品999在线| 麻豆tv在线播放| 一区二区三区四区毛片| 国产精品12345| 黄色三级视频在线播放| 成人免费观看视频在线观看| 日日夜夜精品视频免费观看| 欧美日韩亚洲一| 中文字幕精品在线播放| 99免费视频观看| 国产精品又粗又长| youjizz.com亚洲| 日韩中文字幕免费在线| 高清无码视频直接看| 性生生活大片免费看视频| 青青草原av在线播放| www.亚洲成人网| 日韩av福利在线观看| 久久精品网站视频| 欧美精品久久久久久久免费|