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一区二区
mm131午夜| 91精品国产吴梦梦| 国产精品沙发午睡系列| 在线免费观看av网| 国产欧美激情视频| 中文字幕 91| 日本高清一区二区视频| 天天操天天爱天天爽| 日本va中文字幕| 黄色a级片免费| 日本www.色| 欧美日韩一区二区三区69堂| 狠狠操狠狠干视频| 91丨九色丨蝌蚪| 国产一二三四区在线观看| 久久精品国产精品亚洲精品色| 日日躁夜夜躁aaaabbbb| 在线观看日本www| 国产精品久久成人免费观看| 一级黄色在线播放| 超碰在线免费观看97| 日韩不卡一二区| 久久久久久久久久网| 中文字幕日本最新乱码视频| 无码内射中文字幕岛国片| 午夜欧美福利视频| 不卡中文字幕在线观看| 欧美一级免费在线观看| 国内自拍第二页| 免费看毛片的网址| 日韩中文字幕a| 精品一区二区三区毛片| 国产精品秘入口18禁麻豆免会员| 黄色免费观看视频网站| 午夜视频在线网站| 国产在线无码精品| 亚洲最大成人在线观看| 欧美狂野激情性xxxx在线观| 成人性视频欧美一区二区三区| 午夜视频在线观| 黄色动漫网站入口| 在线观看免费视频污| 黄色一级视频在线播放| 色婷婷一区二区三区av免费看| 熟妇熟女乱妇乱女网站| 日韩中文字幕三区| 男人c女人视频| 中国黄色片免费看| 91.com在线| 日本a√在线观看| 久久综合在线观看| www.99在线| www.夜夜爱| 亚洲成人手机在线观看| 国产91xxx| 欧美亚洲色图视频| 欧美成人乱码一二三四区免费| 奇米精品一区二区三区| 麻豆传媒网站在线观看| 奇米影视四色在线| 男女曰b免费视频| av免费观看大全| 亚洲第一天堂久久| 亚洲人视频在线| 中文字幕在线观看第三页| 波多野结衣之无限发射| 中国 免费 av| 神马午夜伦理影院| 丰满人妻一区二区三区53号 | 青春草在线视频免费观看| 男人搞女人网站| 国产熟人av一二三区| 手机看片福利盒子久久| 欧美性猛交xxx乱久交| 东京热加勒比无码少妇| 久久精品免费一区二区| 18岁视频在线观看| 能看的毛片网站| 亚洲高清av一区二区三区| 中文字幕av不卡在线| 日本中文字幕观看| 一级黄色录像免费看| 国产欧美久久久久| 国产3p露脸普通话对白| 亚洲国产精品久久久久爰色欲| 欧美日韩激情视频在线观看| 久久久免费视频网站| 亚洲第一中文av| 久久久久久久久久毛片| 国产91沈先生在线播放| 欧美日韩黄色一级片| 欧美精品aaaa| 996这里只有精品| 波多野结衣家庭教师视频| 国产高清视频网站| 午夜啪啪免费视频| 国产91xxx| 三年中文高清在线观看第6集| 91免费国产精品| aaa毛片在线观看| 色中文字幕在线观看| 久久精品国产精品亚洲色婷婷| 日本男人操女人| 日本免费成人网| 国产成人美女视频| 无码精品国产一区二区三区免费| 中文字幕第88页| 奇米精品一区二区三区| 日本网站在线看| 中国丰满人妻videoshd| a级网站在线观看| 男人透女人免费视频| 欧美激情亚洲天堂| 欧美在线aaa| 鲁一鲁一鲁一鲁一色| 青青在线免费视频| 久国产精品视频| 国产91对白刺激露脸在线观看| 妞干网这里只有精品| xxxx一级片| 不要播放器的av网站| 黄网站色视频免费观看| 中文字幕55页| 手机看片一级片| 韩国一区二区av| 夫妻免费无码v看片| 18禁裸男晨勃露j毛免费观看| 欧美性猛交xxxx乱大交91| 日本熟妇人妻xxxxx| av女优在线播放| 日韩极品视频在线观看| 女女百合国产免费网站| 天天综合中文字幕| 思思久久精品视频| 激情五月婷婷基地| 日韩av卡一卡二| 欧美男女交配视频| www.日本xxxx| 不卡中文字幕在线观看| 亚洲综合av在线播放| 九九热在线免费| 两性午夜免费视频| 青青草原播放器| 9色视频在线观看| 毛片在线视频观看| 阿v天堂2017| 精品久久久久av| 欧美日韩精品区别| 91成人在线视频观看| 国产美女在线一区| 国内外成人激情视频| 成人性生生活性生交12| 国产999免费视频| 欧美这里只有精品| 国产91xxx| 亚洲日本黄色片| 国产综合中文字幕| 韩国日本美国免费毛片| 日本一二三区在线| 国产又黄又大又粗视频| 99久久国产宗和精品1上映| 国产又黄又猛的视频| 人人妻人人澡人人爽欧美一区双| 尤物av无码色av无码| 岛国av免费在线| av之家在线观看| 日本中文字幕影院| 国产在线精品91| 日韩av影视大全| 亚洲人成无码www久久久| 亚洲制服中文字幕| 无码aⅴ精品一区二区三区浪潮| 日韩va在线观看| 可以在线看的av网站| 欧洲在线免费视频| aa在线免费观看| 男人添女人下部视频免费| 久久久久国产一区| 欧洲精品一区二区三区久久| 污污动漫在线观看| 国产乱子伦农村叉叉叉| 99热这里只有精品7| 992kp快乐看片永久免费网址| www污在线观看| 亚洲高清在线不卡| 蜜臀av免费观看| 91人人澡人人爽人人精品| 成人在线免费高清视频| www.久久av.com| 波多野结衣天堂| 亚洲黄色av网址| 青青青在线播放| 黄色片一级视频| 99福利在线观看| 国产午夜福利视频在线观看| 日韩久久久久久久久久久久| 一级片免费在线观看视频| 国产视频一区二区三区在线播放| 日本一道本久久| 久久久久久久久久久视频|