導航:首頁 > 數據處理 > vue數據劫持發生在什麼時候

vue數據劫持發生在什麼時候

發布時間:2024-10-10 11:26:36

『壹』 Vue面試題集錦

原理:在創建Vue實例時,Vue會遍歷data選項的屬性,利用Object.defineProperty()為屬性添加getter和setter對數據的讀取進行劫持(getter用來依賴手機,setter用來派發更新),並且在內部追蹤依賴,在屬性被訪問和修改時通知變化。每個組件實例會有相應的watcher實例,會在組件渲染過程中記錄依賴的所有數據屬性,之後依賴項被改動時,setter方法會通知依賴與此data的watcher實例重新計算(派發更新),從而使它關聯的組件重新渲染。

一句話總結:vue.js採用數據劫持結合發布-訂閱模式,通過Object.defineProperty()來劫持各個屬性的setter、getter,在數據變動時發布消息給訂閱者,觸發響應的監聽回調。

我的理解:在new Vue的時候,在Observer中通過Object.defineProperty()達到數據劫持,代理所有數據的getter和setter屬性,在每次觸發setter的時候,都會通過Dep來通知Watcher,Watcher作為Observer數據監聽器與Compile模板解析器之間的橋梁,當Observer監聽到數據發生改變的時候,通過Updater來通知Compile更新視圖。而Compile通過Watcher訂閱對應數據,綁定更新函數,通過Dep來添加訂閱者,達到雙向綁定。

Vue實例從創建到銷毀的全過程,就是生命周期。也就是從開始創建、初始化數據、編譯模板、掛載DOM->渲染、更新->渲染、卸載等一系列過程。

它的生命周期中有多個事件鉤子,讓我們在控制整個Vue實例的過程時更容易形成好的邏輯。

它可以分為8個階段:創建前/後、載入前/後、更新前/後、銷毀前/後。

第一次頁面載入時會觸發beforeCreate、created、beforeMounted、mounted

DOM渲染在mounted中就已經完成。

1、beforeCreate:可以在這加個loading事件,在載入實例時觸發;
2、created:初始化完成時的事件寫在這里,如在這結束loading事件,非同步請求也適宜在這里調用;
3、mounted:掛載元素,獲取DOM節點;
4、updated:如果對數據統一處理,在這里寫上相應函數;
5、beforeDestroy:可以放一個確認停止事件的確認框;
6、nextTick:更新數據後立即操作DOM。

1、對象方法v-bind:class="{'orange': isRipe, 'green': isNotRipe}"
2、數組方法v-bind:class="[class1, class2]"
3、行內v-bind:style="{color: color, fontSize: fontSize+'px'}"

1、router-link標簽會渲染為標簽,咋填template中的跳轉都是這種;
2、另一種是編輯式導航,也就是通過js跳轉比如router.push('/home')

M- model ,model 表示數據模型,也可以在model中定義數據修改和操作的業務邏輯
V- view,view表示視圖,它負責將數據模型轉換為視圖展示出來
VM- viewmodel,viewmodel是一個同步view和model的對象,連接view和model,用於監聽數據模型的改變和控制視圖行為

computed:computed是計算屬性,也就是計算值,更多用於計算值的場景。它具有緩存性,computed的值在getter執行後是會緩存的,只有在它依賴的屬性值改變之後,下一次獲取computed的值時重新調用對應的getter來計算。

watch:watch更多的是觀察作用,類似於某些數據的監聽回調,用於觀察props、$emit或者本組件的值,當數據變化時用來執行回調進行後續操作。它不具有緩存性,頁面重新渲染時值不會變化也不會執行。

在style標簽上添加scoped屬性,以表示它的樣式作用於當下的模塊,很好的實現了樣式私有化的目的,但是也得慎用,樣式不易改變。
解決方法:
① 使用混合型的css樣式,混合使用全局樣式和私有樣式。
② 深度作用選擇器:如果你希望scoped樣式中的一個選擇器能夠作用的更深,可以使用>>>操作符。如:<style scoped>.a>>>.b{/ ... /}</style>

一個元素綁定多個事件的寫法有兩種:
1、修飾符的使用

2、在method方法里分別寫兩個事件

Vue組件中的data值不能為對象,因為對象是引用類型,組件可能會被多個實例同時引用,如果data值為對象,將導致多個實例共享一個對象,其中一個組件改變data屬性值,其它實例也會受到影響。

原理:JS執行是單線程的,它是基於事件循環的。所有同步任務都在主線程上執行,形成一個執行棧。主線程之外,還存在一個任務隊列,只要非同步任務有了運行結果,就在任務隊列中放置一個事件。一旦執行棧中的所有同步任務執行完畢,系統就會讀取任務隊列,看看那些對應的非同步任務,等結束等待狀態,進入執行棧,開始執行。主線程不斷重復上面的步驟。主執行的執行過程就是tick,所有的非同步結果都是通過任務隊列來調度的。任務分為兩大類:宏任務和微任務,宏任務包括:setTimeOut等,微任務包括promise.then。

Vue用非同步隊列的方式來控制DOM更新和nextTick回調先後執行。在下次DOM更新循環結束之後執行延遲回調,nextTick主要使用了宏任務和微任務,nextTick把要執行的任務推入一個隊列中,在下一個tick同步執行隊列的所有任務,它是非同步任務中的微任務。如果我們在更新了一個響應式數據後,需要同步拿到這個渲染後的DOM結果,就使用nextTick方法,非同步拿這個結果。
使用方式:
① this. nextTick.then(cb); 非同步

父組件調用子組件的方法
父組件: this.$refs.yeluosen.childMethod()
子組件向父組件傳值並調用方法: $emit
組件之間: bus==$emit+$on

1、第一種方法是直接在子組件中通過this. emit向父組件觸發一個事件,父組件監聽這個事件就行了。
3、第三種都可以實現子組件調用父組件的方法。

keep-alive是Vue內置的一個組件,可以使被包含的組件保留狀態,或避免重新渲染。

原來的組件實例會被復用。這也意味著組件的生命周期鉤子不會再被調用,你可以簡單的監控watch $route對象:

is用來動態切換組件,DOM模板解析

全局的:前置守衛、後置鉤子(beforeEach、afterEach)beforeResolve
單個路由獨享的:beforeEnter
組件級的:beforeRouteEnter(不能獲取組件實例this)、beforeRouteUpdate、beforeRouteLeave
這是因為在執行路有鉤子函數beforeRouteEnter的時候,組件還沒有被創建出來,先執行beforeRouteEnter,再執行周期鉤子函數beforeCreate,可以通過next獲取組件的實例對象,如:next((vm) => {}),參數vm就是組件的實例化對象。

缺點:

優點:

計算屬性是需要復雜的邏輯,可以用方法method代替。

vue-cli提供的腳手架模板有browserify和webpack。

① 是什麼?
Vue框架中的狀態管理,分別是State、Getter、Mutation、Action、Mole。
② 怎麼使用?
新建一個目錄store。
③ 功能場景?
單頁應用中,組件之間的狀態。音樂播放、登錄狀態、加入購物車等。
④ vuex的狀態:
a. State特性:vuex就是一個倉庫,倉庫裡面放了很多對象,其中state就是數據源存放地,對應於一般Vue對象裡面的data。state裡面存放的數據是響應式的,Vue組件從store中讀取數據,若是store中的數據發生改變,依賴這個數據的組件也會發生更新。它通過mapState把全局的state和getters映射到當前組件的computed計算屬性中。
b. Getter特性:getters可以對State進行計算操作,它就是store的計算屬性。雖然在組件內可以做計算屬性,但是getters可以在多組件之間復用。如果一個狀態只在一個組件內使用,可以不用getters。
c. Mutation特性:改變store中state狀態的唯一方法就是提交mutation,每個mutation都有一個字元串類型的事件類型和一個回調函數,我們需要改變state的值就要在回調函數中改變。我們要執行這個回調函數,那我們需要執行一個相應的調用方法:store.commit。
d. Action特性:類似於mutation,不同點在於:Action提交的是mutation,而不是直接變更狀態。Action可以包含任意非同步操作,Action函數接受一個與store實例具有相同方法和屬性的context對象,因此你可以調用context.commit提交一個mutation。或者通過context.state和context.getters來獲取state和getters。Action通過store.dispatch方法觸發:store.dispatch('increment')。
e. Mole特性:Mole其實只是解決了當state中很復雜臃腫的時候,mole可以將store分解為模塊,每個模塊中擁有自己的state、mutation、action和getter。

① 創建組件頁面eg Toast.vue
② 用Vue.extend() 擴展一個組件構造器,再通過實例化組件構造器,就可以創造出可復用的組件。
③ 將toast組件掛載到新創建的div上;
④ 將toast組件的dom添加到body里;
⑤ 修改優化達到動態控制頁面顯示文字跟顯示時間;

修飾符分為:一般修飾符、事件修飾符、按鍵、系統
① 一般修飾符:

② 事件修飾符

③ 按鍵修飾符

④ 系統修飾符(可以用如下修飾符來實現僅在按下相應按鍵時才觸發滑鼠或鍵盤事件的監聽器。)

Vue的核心的功能,是一個視圖模板引擎,但這不是說Vue就不能成為一個框架。在聲明式渲染(視圖模板引擎)的基礎上,我們可以通過添加組件系統、客戶端路由、大規模狀態管理來構建一個完整的框架。更重要的是,這些功能相互獨立,你可以在核心功能的基礎上任意選用其他的部件,不一定要全部整合在一起。可以看到,所說的「漸進式」,其實就是Vue的使用方式,同時也體現了Vue的設計的理念
在我看來,漸進式代表的含義是:主張最少。視圖模板引擎每個框架都不可避免會有自己的一些特點,從而會對使用者有一定的要求,這些要求就是主張,主張有強有弱,它的強勢程度會影響在業務開發中的使用方式。
比如說,Angular,它兩個版本都是強主張的,如果你用它,必須接受以下東西:
必須使用它的模塊機制- 必須使用它的依賴注入- 必須使用它的特殊形式定義組件(這一點每個視圖框架都有,難以避免)所以Angular是帶有比較強的排它性的,如果你的應用不是從頭開始,而是要不斷考慮是否跟其他東西集成,這些主張會帶來一些困擾。
Vue可能有些方面是不如React,不如Angular,但它是漸進的,沒有強主張,你可以在原有大系統的上面,把一兩個組件改用它實現,當jQuery用;也可以整個用它全家桶開發,當Angular用;還可以用它的視圖,搭配你自己設計的整個下層用。也可以函數式,都可以,它只是個輕量視圖而已,只做了自己該做的事,沒有做不該做的事,僅此而已。
漸進式的含義,我的理解是:主張最少,沒有多做職責之外的事。

『貳』 能說說vue的響應式原理嗎

Vue 是一個 MVVM 框架,核心是雙向數據綁定,VM(視圖模型)是作為 V(視圖) 和 M(模型)的橋梁。下面是對 Vue 響應式(雙向數據綁定)的理解,如果錯誤盡請指出,一起交流,共同進步。

Vue響應式原理核心是 數據劫持,採用 ES5 的 object.defineproperty 的 getter 和 setter 方法。從一個例子出發:

『叄』 Vue學習系列一 —— MVVM響應式系統的基本實現原理

MVVM是Model-View-ViewModel的簡寫。它模式是MVC—>MVP—>MVVM的進化版。
Model負責用JavaScript對象表示,View負責UI界面顯示,兩者做到了最大限度的分離。
而把Model和View關聯起來的就是ViewModel。ViewModel負責把Model的數據同步到View顯示出來,還負責把View的界面修改同步回Model更新數據。

臟值檢查 : angular.js 是通過臟值檢測的方式來比對數據是否有變更而決定是否更新視圖。
原理是,拷貝一份 _viewModel 在內存中,用戶操作導致 viewModel 發生改變的行為時,框架都會把 _viewModel 和最新的 viewModel 進行深度比較,一旦發現有屬性發生變化,則重新渲染與之綁定的DOM節點。
最簡單的方式就是通過 setInterval() 定時輪詢檢測數據變動,angular觸發時進入臟值檢測。但只限 指定的事件 (如:用戶點擊,輸入操作,ajax請求,setInterval,setTimeout等...),否則需手動調用 apply 函數去強制執行一次臟檢查。

數據劫持 : vue.js 則是採用數據劫持結合發布者-訂閱者模式的方式,通過 Object.defineProperty() 來劫持各個屬性的 setter , getter 在數據變動時發布消息給訂閱者,觸發相應的監聽回調,而產生更新數據和視圖。

原理圖告訴我們,data屬性定義了getter、setter對屬性進行劫持,當屬性值改變是就會notify通知watch對象,而watch對象則會重新觸發組件呈現功能,繼而更新view上的DOM節點樹。
反之,view上輸入數據時,也會觸發data變更,也會觸發訂閱者watch更新,這樣子model數據就可以實時更新view上的數據變化。這樣一個過程就是vue的數據雙向綁定了。

vue是通過數據劫持的方式來做數據綁定的,其中最核心的方法便是通過 Object.defineProperty() 來實現對屬性的劫持,達到監聽數據變動的目的。

Object.defineProperty 是ES5一個方法,可以直接在一個對象上定義一個新屬性,或者修改一個已經存在的屬性,並返回這個對象,對象里目前存在的屬性描述符有兩種主要形式: 數據描述符 存取描述符
數據描述符 是一個擁有可寫或不可寫值的屬性。
存取描述符 是由一對getter-setter函數功能來描述的屬性。
描述符必須是兩種形式之一;不能同時是兩者。即:有值和可寫,或者可get和set
屬性描述符包括:

我們已經知道怎麼實現數據的雙向綁定,首先要對數據進行劫持監聽,所以我們需要設置一個監聽器 Observer ,用來監聽所有屬性。如果屬性發上變化了,就需要告訴訂閱者 Watcher 看是否需要更新。因為訂閱者是有很多個,所以我們需要有一個消息訂閱器 Dep 來專門收集這些訂閱者,然後在監聽器 Observer 和訂閱者 Watcher 之間進行統一管理的。接著,我們還需要有一個指令解析器 Compile ,對每個節點元素進行掃描和解析,將相關指令對應初始化成一個訂閱者 Watcher ,並替換模板數據或者綁定相應的函數,此時當訂閱者 Watcher 接收到相應屬性的變化,就會執行對應的更新函數,從而更新視圖。
因此接下去我們執行以下4個步驟,實現數據的雙向綁定:

深入響應式原理
剖析Vue原理&實現雙向綁定MVVM
《響應式系統的基本原理》.js
JavaScript實現MVVM之我就是想監測一個普通對象的變化

閱讀全文

與vue數據劫持發生在什麼時候相關的資料

熱點內容
理財產品功能有哪些 瀏覽:916
如何注冊幣圈交易網 瀏覽:281
哪裡能學到真正的數據 瀏覽:961
如何打開lpc程序 瀏覽:601
印尼有哪些值得購買的產品 瀏覽:271
溫州海鮮有哪些批發市場 瀏覽:517
酒庄有哪些產品或服務 瀏覽:779
新產品啤酒代理需要多少錢 瀏覽:756
微商代理怎麼宣傳 瀏覽:73
兩列數據如何顯示出來不同項 瀏覽:177
放大鏡爆料小程序入口在哪裡 瀏覽:795
怎麼找維密代理 瀏覽:404
愛奇藝網劇有效分賬數據如何查詢 瀏覽:1000
航空公司為什麼取消代理費 瀏覽:755
雲手機如何代理 瀏覽:987
熟練程序員每分鍾寫多少代碼 瀏覽:331
兔拉拉網路科技是做什麼產品公司 瀏覽:454
如何建立激勵數據分析模型 瀏覽:206
發那科系統怎麼看程序列表 瀏覽:933
功能飲料如何發展市場營銷 瀏覽:869