原理深度解析Vue的響應式更新比React快_vue.js

來源:腳本之家  責任編輯:小易  

音樂是人們抒發感情、表現感情、寄托感情的藝術,不論是唱或奏或聽,都內涵著及關聯著人們千絲萬縷的情感因素。對于音樂的認識相信大家都有自己的感受,而要說真正的欣賞音樂卻不一定每個人都是正確的方法。 音樂要懂得欣賞 如何欣賞音樂是一個非常老的話題。多少年來,一直有許多的專論。可到底該怎樣欣賞音樂,還是有人不明白。其實,欣賞音樂也可以說是一個非常簡單的問題,那就是只要你喜歡就行。經常都聽到很多人說:“音樂好,就是聽不懂。”可我也經常反問他們:你到底要聽懂什么呢?音樂這東西,你只要覺得好聽就行。何必要這么功利性的搞懂呢?其實真是這樣。一首音樂名曲,你只要覺得好聽,能讓你感動就行了,不一定非去琢磨這曲子是描寫的是什么故事。什么曲式、調性、主題那是下一步的事,那些都還不是重要的,最重要的是你首先必須要覺得好聽,能被這音樂感動,否則再是什么名曲對你也是白搭。至于那些東西是對音樂下一步了解的事。如果你能被音樂感動那就什么都好辦。因為你在被感動時,會有一種沖動的想法,你會去思考為什么這音樂讓人感動萬分。這到底是因為什么?也就這樣,你就有了進一步了解音樂的渴望,但如果你想一開始就什么都搞懂那不太可能。● 談音樂的感染力 音樂在剛剛開始欣賞時,它所具有的那種音響的感染力太大了,它幾乎能讓所有聽到它的人為之感動。這個時侯的音樂是非常神秘的,它具有巨大的魅力,讓人著迷。不管是旋律還是歌詞,甚至到伴奏的和聲等等,都會讓人激動萬分。我們可以從喜歡不同音樂類型的人群中看到流行歌曲和浪漫情調音樂的差別。非常明顯的是音樂在這e79fa5e98193e59b9ee7ad9431333332636336個時侯對感官的引誘力太大了,特別是對那些還沒有真正接觸音樂或較少接觸音樂的人更是如此。他們會一下子被它那或委婉的旋律或鮮明的節奏或悅耳的和弦甚至纏綿的歌詞所吸引。也正因為如此,才會有很多人在這個時侯往往把音樂當作一種寄托,當作理想,當作禮物,當作遠離現實的逃避,甚至當作是自己的幻想世界。音樂的感染力是巨大的 正因為如此,才有人經常參加電臺電視臺的點歌節目,把自己喜歡的某支歌作為自己的一種心意當作禮物送給別人。因為他們覺得這音樂(歌曲)使自己感動,就好象是自己的心境的表露。當然這無可非議,送什么給別人那是自個的事。一切都是在向前發展的。人不可能永遠停留在一個欣賞階段。在喜歡流行歌曲的人群中有一點是明確的,那就是三十歲以上的人肯定很少。為什么?僅就閱歷而言,那些“為了愛夢一生”、“永遠相信愛情”真是一場比較虛的事。沒有人會永遠生活在這樣的歌曲里,自己受不了別人也受不了。 音樂欣賞由淺入深有這么一個過程,即從感性(被音樂感動)到理性認識(探究音樂知識)又回到感性認識(更深層次的欣賞)這樣三個階段。這是欣賞音樂的必經之路。一個學習樂器的人也許不一定就是一個很好的音樂欣賞者,因為他關注的是技巧。表達與理解不是一回子事。音樂有自己的語言,就象舞蹈中的一招一式都有自身的表達含義,音樂里的和弦、樂譜、速度、調性也有其含義。在剛一開始期間音樂能從感官上打動你,讓你激動讓你欣喜。這是一種無意識的審美活動。可如果就此而已,你還是沒辦法去真正聆聽音樂。● 音樂具有巨大的感染力 這種感染力不僅是對剛接觸音樂的年輕人,對一個飽經風霜、歷盡人間艱辛的老人也是如此。只是欣賞音樂的階段不同,所帶來的思想內容也就不盡相同了。在感性認識的階段,你對音樂的理解還只限于感官感受。如果你在欣賞音樂中不是主動積極的,那么你也許就沒法真正去領會音樂的真諦。比如《藍色多瑙河》這首膾炙人口的名曲,在感性認識階段,我們會覺得它十分動聽,其實我們僅僅只是被那起伏的旋律和三拍子的圓舞曲節奏以及這首名曲的故事名聲以及其他因素所吸引。我們并不知曉三拍子的圓舞曲形式為什么這么吸引人;不知曉在這首曲子究竟由幾首什么樣的小圓舞曲組成;我們也不知曉斯特勞斯圓舞曲與其他圓舞曲有什么實質性上的不同,但首先我們會被吸引會被感動。音樂的感染力是巨大的 如果你面對一曲好聽的音樂而無動于衷,那才是最沒辦法的。欣賞音樂時你必須是一個積極的聆聽者,絕不滿足于簡單的感官感受和無意識的欣賞。這樣你才會去深入了解這首作品的其他內容,從創作背景到音樂流派以至于音樂曲式主題思想內涵藝術造詣等等。這樣,你對音樂的感悟就會比別人更深。在感性認識的第一階段,我們通常還會借用一些作曲家對曲目的標題或后人標注的文字說明來加深對音樂的理解。比如《獻給愛麗絲》這首貝多芬所作的鋼琴小品,聆聽中結合音樂加上標題文字的聯想,我們就能很好理解這首溫馨明快的抒情小品;又再如墨西哥作曲家羅薩斯的《乘風破浪圓舞曲》,由標題中我們可以領略到音樂所描寫的那浪花飛濺,海鷗飛翔、在波峰浪尖中航行的自由愉快的心情;克萊斯勒的小提琴曲《中國花鼓》,一聽曲名就知道是由中國的五聲音調來表現出熱烈又歡快的情調。在浩瀚的音樂長河中有大量的標題性音樂,只要你愿意走進這音樂圣殿,你就會發現這殿堂堂中滿是人類文明的精華,它就象一筆巨大的財富足夠你受用一輩子。● 被音樂感動 在聆聽音樂時情感體驗以及對探求音樂的欲望將驅使你走入音樂圣殿的第二道大門:理性認識階段。如果不經過這個階段,你仍是一個被動無為的音樂聆聽者,盡管你也許會選擇音樂,也可能隨時都在聽音樂,可你仍然是被動的,因為除了你被音樂感動之外什么也沒有了。優美也罷,歡樂也罷,悲傷也罷,僅僅只是聽感上造成你的情緒上的波動而已。你當然可以隨時隨地的聽音樂,連騎自行車上班或者進餐什么的都可以聆聽音樂,但此時的音樂僅僅只是給你造成一個屏障,用音樂里那些旋律節奏來隔絕城市的喧囂和人世的糾葛。我們在前面提到過,音樂不是調味品。音樂盡管是非常神奇的,但它決不是調味品。音樂是需要被人聆聽的。你真要拿它來做別的用途,如烘托氣氛、調節情緒、甚至于拿它來開胃,那它就不是音樂了。因為沒人會認真地聆聽餐廳重播的音響,更沒有人會被某候機廳的音樂激動。只有當你認真地聆聽音樂的時候,音樂才是音樂。因為一件響器如果能引起你內心體驗其中必定有某種內涵,這種內涵就是音樂內容本身。被音樂感動 進入到音樂欣賞的理性認識階段,說明我們欣賞音樂從被動到主動的發展過程。在這個圣殿的第二道大門中,我們將認識巴赫、莫扎特,體會貝多芬、拉赫瑪尼諾夫。總之,整個人類文明歷史中所有著名的音樂家都將一個個從我們前面走過,讓我們認識了解。我們還將知道音樂構成的要素:旋律節奏音色和聲;知道什么是巴洛克音樂,誰是浪漫主義后期的音樂代表;奏鳴曲和奏鳴曲式怎么不同。一個剛接觸音樂的人對音樂的認識應該說是比較膚淺的。如果不全面地理解音樂,你就不能更好地欣賞音樂。比如你不知道什么是音色,你就根本無法去理解音樂。因為音色就猶如繪畫中那絢麗的顏色,從而決定了豐富的音樂含意。又比如在柴科夫斯基第六《悲愴》交響曲中那個感人至深的主題,其感染力實在讓人欲哭無淚。楊明望先生對這個主題有一段讓我覺得是非常精彩的描述:“這個困倦的心靈,帶著不可磨滅的創傷,在無法撫慰的慟哭和悲哀絕望的熱潮中,終于投入永恒死亡的懷抱。”如果對音樂沒有了解,你能了解這個主題的深刻含義么?在理性認識的這個階段,不一定每個人都有機會或條件去認真系統的學習音樂理論和音樂史。但我們仍可以通過其他一些書籍來獲取有關音樂的知識。用《名曲賞析》這類型的書來對比聆聽是最好的方法之一。樂曲分析、曲式結構、主題提示等對聆聽者是必不可少的一環。這樣一來,你就知道了協奏曲與交響曲在結構上的差別;你也就知道變奏曲與回旋曲的不同;甚至你也許就開始迷上了馬勒或是勃拉姆斯;帕瓦洛蒂那高昂激揚的嗓音與阿姆斯特郎的沙啞聲可能你也同時都會喜歡。等等這一切都是建立在你對音樂了解的基礎上的。也就在這個時候,你也開始發生變化了:你的談吐、你的見解、你的閱歷和涵養等等。“芝麻開花”,音樂這座巨大的寶藏已經對你敞開了大門。所有的音樂都有其自身的內涵 所有的音樂都有其自身的內涵,你對音樂的了解就是對這些音樂內涵的認識過程。盡管每一個人都不可能孤立地停留在一個階段去單純地探究音樂知識而置音樂內涵于不顧。借助一些音樂欣賞名曲分析等一些輔助工具,認真聆聽一首音樂作品是必要的。在這個階段首先要了解音樂史,要知道音樂不同時期的不同的表現形式;你還要了解作曲家的基本內容如貝多芬和瓦格納在音樂創作上的不同風格和思想;另外你還需要知道一些音樂的基本知識,比如曲式。其實曲式就是樂曲的形式,在曲式中最需要了解的首先是奏鳴曲式。一般說來,在古典音樂的曲式中,以奏鳴曲式為最多。奏鳴曲式基本上代表了大部分樂曲的基本形式,交響曲、協奏曲、室內樂等大都采用的是這種形式。奏鳴曲式有一個樂章,也有三至四個樂章的。曲式當然不僅僅只是奏鳴曲式,曲式還有很多種。如變奏曲,用一個主題進行各種演變:A-A1-A2-A3-.....AZ,對變奏曲的了解可以聆聽柴科夫斯基的《洛可可主題變奏曲》,一個主題變化為七個變奏;又如回旋曲,它的基本含義就是由一個主題多次重復:A-B-A-C-D-A......等,其中A代表主題,而B.C.D.....等則代表變化,每一次變化之后又回到主題。對這個曲式的了解可聆聽莫扎特的《A小調鋼琴回旋曲》。音樂中的主題是至關重要 音樂欣賞還應該了解主題,音樂中的主題是至關重要。在一首樂曲中,一個聆聽者必然牢牢記住這首樂曲中的音樂主題形象,它的變化對比發展等構成了音樂的全部內涵。所以我們在聆聽音樂時一定要學會記住主題。欣賞音樂主觀的因素很多 在柏遼茲的《幻想交響曲》中那個孱弱敏感的青年藝術家主題音樂形象,從樂曲的第一樂章一直貫穿到第五樂章,且每個樂章都有其不同的變化。從一開始溫柔純真到最后的怪誕瘋狂,仔細聆聽這個樂曲對理解主題比較有幫助。如果你在聆聽音樂時連主題形象都聽不出來,你就沒辦法去很好地理解音樂。當然,音樂的主題不象視覺上的形象那樣鮮明清晰,電影中的主要人物一出場,你就知道了電影的全部過程中一定是以他為主。小說也一樣,《紅樓夢》中的賈寶玉與林黛玉是一個對比的主題,兩個主題形象的關系對比發展貫穿整個小說。盡管也有其他的人物,如金陵十二釵和賈府眾多人口,但主題形象卻依然是賈寶玉與林黛玉。音樂里主題形象其實也是如此,只是音樂里的主題形象不會象電影小說里那樣鮮明。在一首樂曲里,音樂形象也有許多,但不管再多它們全都是圍繞樂曲的主題形象的。在貝多芬《命運交響曲》中有很多其它的音樂形象:悲哀、嘆息、撕殺、兇殘、深沉的思考與堅強的信念、光明、勝利,甚至還有憂郁與彷徨,但這些都是由對比的主題形象而產生的。所以,在認真聆聽音樂時一定要緊緊抓住主題,就象雨果唱片公司的易有伍先生說的要提高你耳朵的聚焦能力,這樣你才能在一遍音樂的轟鳴聲中找到那個時刻變化的主題形象從而領略音樂的無窮魅力。● 音樂欣賞還需要注意 在欣賞音樂的這個審美過程中,除了曲式,還有諸多的因素,如節奏、音色等。僅就節奏而言,音樂的最初的起源應與節奏有十分密切的關系。節奏產生的韻律美從原始部落至今仍在信奉。不同組合的強弱快慢節奏以及多次重復能使節奏產生出非常巨大的內涵和韻味,讓人瘋狂或癡迷,沒有人會拒絕節奏。在音樂中節奏的表現形式是節拍。節拍通常用小節線和節拍符號來表示,如3/4,就表明這是三拍子。每一拍為四分音符,每一小節內有三拍;第一拍為重音,后兩拍為弱音。這樣就構成了一個圓舞曲的節奏型。改變重音的位置會引起一些嶄新的變化。把兩個以上不同的節拍組在一起又將形成新的復節奏。就這樣,無窮無盡的節奏就形成了我們音樂的組成要素之一。僅就節奏而言,一個欣賞者需要用耳朵去感受它而不是靠分析,整體的音樂欣賞也是如此。說起節奏還不得不提及諸如《格利高利圣詠》之類的自由節拍的音樂體裁。在許多宗教早期音樂以及東方音樂中經常都有一些無節拍要求的音樂,其實這種自由節奏的音樂對節奏的要求更為精確的。只是這種精確已無法用節拍記號來標注它。它需要的是演奏者或演唱者對它更深層次的了解和把握。在音樂中節奏的表現形式是節拍 音樂的魅力當然不僅僅只是在主題、旋律、節奏、色彩、曲式結構、調性等,有的時候甚至連作曲家的創作觀念、演奏家的風格、錄音師的錄音技術及愛好,在加上聆聽者的素質、閱歷、情感、性格等等這些諸多因素加在一起才構成一個整體的音樂。單獨去分析其中的一個部分其實都是對音樂的肢解。結合歷史背景了解作曲家的創作個性,認真聆聽主題的發展變化與對比,讓你全身心都得到音樂及音響的感染,讓你的思想情感以及情緒都在音樂的體驗中發生微妙的變化。 在音樂欣賞的第二個階段中你需要了解的東西確實太多了,這很可能會嚇到一些愛好者:我的媽,欣賞音樂這么難!其實也沒有什么。因為所有你需要了解的一切一切都在建立在你對音樂極大的興趣上的。對這些知識的了解又促使你對音樂發生更大的興趣。前提是你對音樂首先要有一種需要的欲望,也就是你首先要真正熱愛音樂!也就是因為這個前提,你才能進入到這個階段去認真的學習這些音樂知識。 進入音樂欣賞的第三階段,并不是十分明顯的。因為對音樂認識的階段永不能說結束。進入欣賞音樂的第三階段,并不意味著要和過去的階段劃清界限。其實我們這樣分析和介紹僅僅只是一個表述上的概念。但不管怎樣,經過一段時間的學習,(在這個階段的一切都主要靠你自己的自學,因為沒有人會詳細的教你如何分析和理解一首樂曲)我們對音樂已經有了一定的了解。這時候我們再來聆聽音樂:當那神奇的樂音響起時,我們的心中就會泛起無際的激情的浪花。不管是與巴赫交談還是和馬勒神游;抑或是傾聽莫扎特的心聲,總之,音樂就象是情感的源泉。這時候你已經步入了音樂的殿堂。不管是人生征途的跋涉還是成家立業的拼搏;也不管你是年輕或年邁;落魄或得意,歡樂也罷,憂愁也罷,在音樂的殿堂里,你都是在用自己的情感去體驗音樂!這時候音樂已經不再神秘的了。音樂也不再是高不可攀的了。音樂所表達的一切也都不再是外表的。也許主題還是那個主題,但“山遠水遠,你我的心不遠”,現在的你聆聽音樂時的內心體驗已經有了更深的心潮涌動。也就在這個階段,你已經從一個被動的聆聽者轉變成為一個自由的音樂愛好者了。你不會用主題分析曲式結構來約束你思緒的自由飛翔,也不會在一個標題下用一個簡單的音樂形象來束縛想象力的馳騁和情感的涌動。盡管有的時候也需要去分析主題、探究曲式結構什么的,但真正在聆聽音樂時你已經確確實實是用情感來體驗音樂了。在這個時候你需要的是純音樂而不是什么主題或名曲匯萃。名曲集錦和主題聯奏之類的音樂是最讓人倒胃口的。因為它實在無法讓人去產生什么激情。這一類的音樂只能算是普及讀物,經常聆聽這樣的音樂所帶來的最大好處就是能參加音樂有獎競猜活動。那跟欣賞音樂沒有多少聯系。 在音樂欣賞的審美過程中,內心體驗與認知活動永遠是結合在一起的。從感性認識到理性認識的這一發展過程永遠是不會停滯不前,我們對音樂的理解也永遠是無止境的www.13333515.buzz防采集請勿采集本網。

前言

我們都知道 Vue 對于響應式屬性的更新,只會精確更新依賴收集的當前組件,而不會遞歸的去更新子組件,這也是它性能強大的原因之一。

智能手環測量睡眠的原理為: 智能穿戴具有自己的加速傳感器。不管你帶的手環、手表還是戒指等貼合你身體,并能隨著你身體運動而動的可穿戴設備,都可以通過內置的加速傳感器更準確的感知你的動作

例子

舉例來說 這樣的一個組件:

鍋爐除氧器的工作原理是凝結水及補充水首先進入除氧頭內旋膜器組水室,在一定的水位差壓下從膜管的小孔斜旋噴向內孔,形成射流,由于內孔充滿了上升的加熱蒸汽,水在射流運動中便將大量的加熱

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

<template> <div> {{ msg }} <ChildComponent /> </div></template>

另一方面通過學習來生成新的問題,把學習的過程看成是發現問e799bee5baa6e79fa5e98193e59b9ee7ad9431333361323537題、分析問題、解決問題的過程。因此,教師要引導學生積極的提出問題,鼓勵學生大膽猜想、

我們在觸發 this.msg = 'Hello, Changed~'的時候,會觸發組件的更新,視圖的重新渲染。

其原理為按深度過濾—水中較大的顆粒在頂層被去除,較小的顆粒在過濾器介質的較深處被去除。從而使水質達到粗過濾后的標準。設備是壓力式的,其原理是當原水自上而下通過濾料時,水中懸浮物由于吸附和機械

但是 <ChildComponent /> 這個組件其實是不會重新渲染的,這是 Vue 刻意而為之的。

在以前的一段時間里,我曾經認為因為組件是一棵樹,所以它的更新就是理所當然的深度遍歷這棵樹,進行遞歸更新。本篇就從源碼的角度帶你一起分析,Vue 是怎么做到精確更新的。

React的更新粒度

而 React 在類似的場景下是自頂向下的進行遞歸更新的,也就是說,React 中假如 ChildComponent 里還有十層嵌套子元素,那么所有層次都會遞歸的重新render(在不進行手動優化的情況下),這是性能上的災難。(因此,React 創造了Fiber,創造了異步渲染,其實本質上是彌補被自己搞砸了的性能)。

他們能用收集依賴的這套體系嗎?不能,因為他們遵從Immutable的設計思想,永遠不在原對象上修改屬性,那么基于Object.defineProperty 或 Proxy 的響應式依賴收集機制就無從下手了(你永遠返回一個新的對象,我哪知道你修改了舊對象的哪部分?)

同時,由于沒有響應式的收集依賴,React 只能遞歸的把所有子組件都重新 render一遍(除了memo和shouldComponentUpdate這些優化手段),然后再通過 diff算法 決定要更新哪部分的視圖,這個遞歸的過程叫做 reconciler,聽起來很酷,但是性能很災難。

Vue的更新粒度

那么,Vue 這種精確的更新是怎么做的呢?其實每個組件都有自己的渲染 watcher,它掌管了當前組件的視圖更新,但是并不會掌管 ChildComponent 的更新。

具體到源碼中,是怎么樣實現的呢?

在 patch  的過程中,當組件更新到ChildComponent的時候,會走到patchVnode,那么這個方法大致做了哪些事情呢?

patchVnode

執行 vnode 的 prepatch 鉤子。

注意,只有 組件vnode 才會有 prepatch 這個生命周期,

這里會走到updateChildComponent方法,這個 child 具體指什么呢?

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

prepatch (oldVnode: MountedComponentVNode, vnode: MountedComponentVNode) { const options = vnode.componentOptions // 注意 這個child就是ChildComponent組件的 vm 實例,也就是咱們平常用的 this const child = vnode.componentInstance = oldVnode.componentInstance updateChildComponent( child, options.propsData, // updated props options.listeners, // updated listeners vnode, // new parent vnode options.children // new children ) },

其實看傳入的參數也能猜到大概了,就是做了: 更新props(后續詳細講) 更新綁定事件 對于slot做一些更新(后續詳細講)

如果有子節點的話,對子節點進行 diff。

比如這樣的場景:

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

<ul> <li>1</li> <li>2</li> <li>3</li><ul>

要對于 ul 中的三個 li 子節點 vnode 利用 diff 算法來更新,本篇略過。

然后到此為止,patchVnode 就結束了,并沒有像常規思維中的那樣去遞歸的更新子組件樹。

這也就說明了,Vue 的組件更新確實是精確到組件本身的。

如果是子組件呢?

假設列表是這樣的:

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

<ul> <component>1</component> <component>2</component> <component>3</component><ul>

那么在diff的過程中,只會對 component 上聲明的 props、listeners等屬性進行更新,而不會深入到組件內部進行更新。

注意:不會深入到組件內部進行更新!(劃重點,這也是本文所說的更新粒度的關鍵)

props的更新如何觸發重渲染?

那么有同學可能要問了,如果不會遞歸的去對子組件更新,如果我們把 msg 這個響應式元素通過props傳給 ChildComponent,此時它怎么更新呢?

首先,在組件初始化 props的時候,會走到 initProps 方法。

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

const props = vm._props = {} for (const key in propsOptions) { // 經過一系列驗證props合法性的流程后 const value = validateProp(key, propsOptions, propsData, vm) // props中的字段也被定義成響應式了 defineReactive(props, key, value)}

至此為止,是實現了對于 _props 上字段變更的劫持。也就是變成了響應式數據,后面我們做類似于 _props.msg = 'Changed' 的操作時(當然我們不會這樣做,Vue內部會做),就會觸發視圖更新。

其實,msg 在傳給子組件的時候,會被保存在子組件實例的 _props 上,并且被定義成了響應式屬性,而子組件的模板中對于 msg 的訪問其實是被代理到 _props.msg 上去的,所以自然也能精確的收集到依賴,只要 ChildComponent 在模板里也讀取了這個屬性。

這里要注意一個細節,其實父組件發生重渲染的時候,是會重新計算子組件的 props 的,具體是在 updateChildComponent 中的:

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

// update props if (propsData && vm.$options.props) { toggleObserving(false) // 注意props被指向了 _props const props = vm._props const propKeys = vm.$options._propKeys || [] for (let i = 0; i < propKeys.length; i++) { const key = propKeys[i] const propOptions: any = vm.$options.props // wtf flow? // 就是這句話,觸發了對于 _props.msg 的依賴更新。 props[key] = validateProp(key, propOptions, propsData, vm) } toggleObserving(true) // keep a copy of raw propsData vm.$options.propsData = propsData }

那么,由于上面注釋標明的那段代碼,msg 的變化通過 _props 的響應式能力,也讓子組件重新渲染了,到目前為止,都只有真的用到了 msg 的組件被重新渲染了。

正如官網 api 文檔中所說:

vm.$forceUpdate:迫使 Vue 實例重新渲染。注意它僅僅影響實例本身和插入插槽內容的子組件,而不是所有子組件。

—— vm-forceUpdate文檔

我們需要知道一個小知識點,vm.$forceUpdate 本質上就是觸發了渲染watcher的重新執行,和你去修改一個響應式的屬性觸發更新的原理是一模一樣的,它只是幫你調用了 vm._watcher.update()(只是提供給你了一個便捷的api,在設計模式中叫做門面模式)

slot是怎么更新的?

注意這里也提到了一個細節,也就是 插入插槽內容的子組件:

舉例來說

假設我們有父組件parent-comp:

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

<div> <slot-comp> <span>{{ msg }}</span> </slot-comp></div>

子組件 slot-comp:

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

<div> <slot></slot></div>

組件中含有 slot的更新 ,是屬于比較特殊的場景。

這里的 msg 屬性在進行依賴收集的時候,收集到的是 parent-comp 的`渲染watcher。(至于為什么,你看一下它所在的渲染上下文就懂了。)

那么我們想象 msg 此時更新了,

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

<div> <slot-comp> <span>{{ msg }}</span> </slot-comp></div>

這個組件在更新的時候,遇到了一個子組件 slot-comp,按照 Vue 的精確更新策略來說,子組件是不會重新渲染的。

但是在源碼內部,它做了一個判斷,在執行 slot-comp 的 prepatch 這個hook的時候,會執行 updateChildComponent 邏輯,在這個函數內部會發現它有 slot 元素。

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

prepatch (oldVnode: MountedComponentVNode, vnode: MountedComponentVNode) { const options = vnode.componentOptions // 注意 這個child就是 slot-comp 組件的 vm 實例,也就是咱們平常用的 this const child = vnode.componentInstance = oldVnode.componentInstance updateChildComponent( child, options.propsData, // updated props options.listeners, // updated listeners vnode, // new parent vnode options.children // new children ) },

在 updateChildComponent 內部

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

const hasChildren = !!( // 這玩意就是 slot 元素 renderChildren || // has new static slots vm.$options._renderChildren || // has old static slots parentVnode.data.scopedSlots || // has new scoped slots vm.$scopedSlots !== emptyObject // has old scoped slots )

然后下面走一個判斷

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

if (hasChildren) { vm.$slots = resolveSlots(renderChildren, parentVnode.context) vm.$forceUpdate() }

這里調用了 slot-comp 組件vm實例上的 $forceUpdate,那么它所觸發的渲染watcher就是屬于slot-comp的渲染watcher了。

總結來說,這次 msg 的更新不光觸發了 parent-comp 的重渲染,也進一步的觸發了擁有slot的子組件 slot-comp 的重渲染。

它也只是觸發了兩層渲染,如果 slot-comp 內部又渲染了其他組件 slot-child,那么此時它是不會進行遞歸更新的。(只要 slot-child 組件不要再有 slot 了)。

比起 React 的遞歸更新,是不是還是好上很多呢?

贈禮 一個小issue

有人給 Vue 2.4.2 版本提了一個issue,在下面的場景下會出現 bug。

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

let Child = { name: "child", template: '<div><span>{{ localMsg }}</span><button @click="change">click</button></div>', data: function() { return { localMsg: this.msg }; }, props: { msg: String }, methods: { change() { this.$emit("update:msg", "world"); } }};new Vue({ el: "#app", template: '<child :msg.sync="msg"><child>', beforeUpdate() { alert("update twice"); }, data() { return { msg: "hello" }; }, components: { Child }});

具體的表現是點擊 click按鈕,會 alert 出兩次 update twice。 這是由于子組件在執行 data 這個函數初始化組件的數據時,會錯誤的再收集一遍 Dep.target (也就是渲染watcher)。

由于數據初始化的時機是 beforeCreated -> created 之間,此時由于還沒有進入子組件的渲染階段, Dep.target 還是父組件的渲染watcher。

這就導致重復收集依賴,重復觸發同樣的更新

怎么解決的呢?很簡單,在執行 data 函數的前后,把 Dep.target 先設置為 null 即可,在 finally 中再恢復,這樣響應式數據就沒辦法收集到依賴了。

提供高質量、準確而又及時的統計數據和高層次、有一定深度、廣度的統計分析報告是統計分析的產品。從一定意義上講,提供高水平的統計分析報告是統計數據經過深加工的最終產品。統計分析法的優點:方法簡單

export function getData (data: Function, vm: Component): any { const prevTarget = Dep.target+ Dep.target = null try { return data.call(vm, vm) } catch (e) { handleError(e, vm, `data()`) return {}+ } finally {+ Dep.target = prevTarget }}

后記

如果你對于 Dep.target、 渲染watcher等概念還不太理解,可以看我寫的一篇最簡實現 Vue 響應式的文章,歡迎閱讀:

手把手帶你實現一個最精簡的響應式系統來學習Vue的data、computed、watch源碼

本文也存放在我的Github博客倉庫中,歡迎訂閱和star。

到此這篇關于原理深度解析Vue的響應式更新比React快的文章就介紹到這了,更多相關Vue的響應式更新比React快內容請搜索真格學網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持真格學網!

69800就是個傳銷,什么國家項目,百分之三的分紅,上去了狗屁都沒有,還要你自己去找一筆錢來和上去的人一起合伙投資,一zd上總就先沒收你的手機,把里面原來和團隊的微信全部刪除,說什么封閉式,上去的老總還是3個人租一套房子住,其他人住在哪里全部是保密的,如果是國家的,為什么住哪里都不給人知道,難道要一下子偷偷摸摸嗎,那更加不是培養商人,是在朋友間諜了。你是一代老總什么都不讓你知道,等你是二代老總就慢慢告訴你一點,下面來的全是親人回朋友,這個什么你配合他們繼續騙下去也完蛋,不騙下去親人們也完蛋。說了29個人上總,滿份額還要你下面多上10-8個左右,說什么別人帶新人好答觸成,狗屁都不是,是因為要上去包裝自己,下面沒人來就是上去了也沒有錢來包裝自己 怎么下團隊,怎么給入行業的人打雞血內容來自www.13333515.buzz請勿采集。


  • 本文相關:
  • vue響應式更新機制及不使用框架實現簡單的數據雙向綁定問題
  • vue實現一個分頁組件的示例
  • 關于vue.js組件數據流的問題
  • vue-router單頁面路由
  • vue使用showdown并實現代碼區域高亮的示例代碼
  • vue-router路由模式詳解(小結)
  • vue 返回上一頁,頁面樣式錯亂的解決
  • vue2.0與bootstrap3實現列表分頁效果
  • 深入淺析vue全局組件與局部組件的區別
  • mpvue+vant app搭建微信小程序的方法步驟
  • vue文件配置全局變量的實例
  • 69800項目深度解析,六萬九千八項目能做嗎
  • 深度分析:如何欣賞音樂
  • 深度解析電子感應測速儀是怎么測速的
  • 常言笑的深度解析
  • 智能手環測量睡眠的原理
  • 鍋爐除氧器的工作原理
  • 統計分析的三大主要內容
  • 如何構建有深度的課堂
  • 多介質過濾器的原理
  • 深度解析:一把步槍的使用壽命是多久
  • 網站首頁網頁制作腳本下載服務器操作系統網站運營平面設計媒體動畫電腦基礎硬件教程網絡安全yui.ext相關prototypejqueryangularjsjsonlib_jsjs面向對象extjsmootoolsseajsdojovue.jsbackbone.js其它首頁javascriptjavascript類庫vue.js手把手帶你實現一個最精簡的響應式系統來學習vue的data、computed、watch源碼vue響應式更新機制及不使用框架實現簡單的數據雙向綁定問題vue實現一個分頁組件的示例關于vue.js組件數據流的問題vue-router單頁面路由vue使用showdown并實現代碼區域高亮的示例代碼vue-router路由模式詳解(小結)vue 返回上一頁,頁面樣式錯亂的解決vue2.0與bootstrap3實現列表分頁效果深入淺析vue全局組件與局部組件的區別mpvue+vant app搭建微信小程序的方法步驟vue文件配置全局變量的實例vue引用js文件的多種方式(推薦)簡單理解vue中props屬性vue之父子組件間通信實例講解(prvue props用法詳解(小結)vue元素的隱藏和顯示(v-show指令vue.js常用指令匯總(v-if、v-fovue 進階教程之v-model詳解使用vue實現圖片上傳的三種方式vue.js實戰之利用vue-router實現vue.js中的圖片引用路徑的方式vue-router 類似vuex實現組件化開發的示例vue + webpack如何繞過qq音樂接口對host的基于vue-cli 路由 實現類似tab切換效果(vue select組件的使用與禁用實現代碼vue項目優化之通過keep-alive數據緩存的方vue 實現前進刷新后退不刷新的效果vue.js中實現登錄控制的方法示例vue3.0 cli - 1 - npm 安裝與初始化的入門vue組件生命周期詳解詳解vue 數組更新
    免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
    Copyright © 2017 www.13333515.buzz All Rights Reserved
    3排列五开奖结果