1. 程式人生 > >vue筆記-----深入響應式原理

vue筆記-----深入響應式原理

模型層只是普通的JavaScript物件,修改它則更新時圖。這會讓狀態管理變得非常
簡單且直觀,不過理解它的工作原理以避免一些常見的問題也是很重要的。


如何追蹤變化
把一個普通的JavaScript物件傳給Vue例項的data選項,Vue將遍歷此物件的搜遊屬性
,並使用Object.defineProperty把這些屬性全部轉為getter/setter。Object.
defineProperty是僅ES5支援,且無法shim的特性,這也就是為什麼Vue不支援IE8以
及耕地版本瀏覽器的原因。


使用者看不到getter/setter,但是在內部它們讓Vue追蹤依賴,在屬性被訪問和修改時
通知變化。這裡需要注意的問題是瀏覽器控制檯在列印資料物件時getter/setter的
格式化並不同,所以你可能餘姚安裝vue-devtools來獲取更加友好的檢查介面。


每個元件例項都有相應的watcher例項物件,它會在元件渲染的過程中把屬性記錄為
依賴,之後當以來想的setter被呼叫時,會通知watcher重新計算.


變化檢測問題


受現代JAvaScript的限制(以及飛起Object.observe),Vue不能檢測到物件屬性的
新增或刪除。由於vue會在初始化例項時對屬性執行getter/setter轉化過程,所以屬
性必須在data物件上存在才能讓Vue轉換它,這樣才能讓它是響應的
var vm = new Vue({
data:{
a:1
}
})
//vm.a是響應式的


vm.b = 2
//vm.b是非響應式的


Vue不允許在已經建立的例項上動態新增新的根級響應式屬性。然而他可以使用Vue.
set(object,key,value)方法將響應屬性新增到巢狀的物件上:
Vue.set(vm.someObject,'b',2)
您還可以使用vm.$set例項方法,這也是全域性Vue.set方法的別名:
this.$set(this.someObject,'b',2)
有事你想向已有物件上新增一些屬性,例如使用Object.assign()或_.extend()方法來新增屬性。
但是,新增到物件上的新屬性不會觸發更新。在這種情況下可以建立一個新的物件,
讓他包含元物件的屬性和新的屬性:
//代替Object.assign(this.someObject,{a:1,b:2})
this.someObject = Object.assign({},this.someObject,{a:1,b:2})


宣告響應式屬性
由於Vue不允許動態新增根級響應式屬性,所以你必須在初始化例項前宣告根級響應式
屬性,哪怕只是一個空值:
var vm = new Vue({
data:{
//宣告message為一個空值字串
message:''
}
template:'<div>{{message}}</div>'
})
//之後設定message
vm.message='Hello'


如果你在data選項中未宣告message,Vue將警告你渲染函式在試圖訪問的屬性不存在。








#過渡效果
vue在插入、更新或者移除DOM時,提供多種不同方式的應用過渡效果。
在css過度和動畫中自動應用class
可以配合使用第三方css動畫庫,如Animate.css
在過度鉤子函式中使用JavaScript直接操作DOM
可以配合使用第三方JavaScript動畫庫,如Velocity.js


#單元素/元件的過度
Vue提供了transition的封裝元件,在下列情形中。可以給任何元素和元件新增entering/
leaving過度
*條件渲染(使用v-if)
*條件展示(使用v-show)
*動態元件
*元件根節點


這是一個典型的例子
<div id="demo">
  <button v-on:click="show=!show">
    Toggle
  </button>
  <transition name="fade">
    <p v-if="show">hello</p>
  </transition>
</div>
new Vue({
el:'#demo',
data:{
  show:true
  }
})


.fade-enter-active,.fade-leave-active{
  transition:opacity .5s
}
.fade-enter,.fade-leave-active{
  opacity:0
}
當插入或刪除包含在transition元件中的元素時,Vue將會做以下處理:
1.自動嗅探目標元素是否應用了css過度或者動畫,如果是,在恰當的時機新增/刪除
css雷鳴。
2.如果過度元件提供了JavaSWcript鉤子函式,這些鉤子函式將在恰當的時機被呼叫。
3.如果沒有找到JavaScript鉤子並且也沒有檢測到css過度/動畫,Dom操作(插入/刪除)
在下一幀中立即執行(注意:這個幀與Vue,和Vue的nextTick概念不同)


#過度的-css類名
會有4個(css)類名在enter/leave的過度中切換
1.v-enter:定義進入過度的開始狀態。在元素被插入時生效,在下一幀移除。
2.v-enter-active:定義進入過渡的結束狀態。在元素被插入時生效,在transition
/animation完成後移除。
3.v-leave:定義離開過度的開始狀態。在離開過度被觸發時生效,在下一幀移除。
4.v-leave-active:定義離開過度的結束狀態。在離開過度被觸發時生效,在
transition/animation完成後移除。


對於這些在enter/leave過度中切換的類名,v-是這些類名的字首。使用
<transition name="my-transition">可以充值字首。比如v-enter替換為
my-transition-enter。
v-enter-active和v-leave-active可以控制進入/離開過度的不同階段。


#css過度
常用的過度否是使用css過度。










#css動畫
css動畫用法同css過度,區別是在動畫中v-enter類名在節點插入DOM後不會立即刪
除,而是在animationend事件ain觸發時刪除。




#自定義過度名
我們可以通過一下特性來自定義過度類名:
*enter-class
*enter-active-class
*leave-class
*leave-active-class
他們的優先順序高於普通的類名,這對於vue的過度系統和其他第三方css動畫哭,如
Animate.css結合使用十分有用。


#同時使用Transitions和Animations
Vue為了知道過度的完成,必須設定響應的事件監聽器。他可以是transitionend
或者animationend,這取決於給元素應用的css規則。如果你是用其中任何一種,
Vue能自動識別型別並設定監聽。
但是在一些場景中,你餘姚給同一個元素同時舍子兩種過度效果,比如animation
很快的唄觸發並完成了,而transition效果還沒結束。在這種情況中,你就需要
使用type特性並設定animation或者transition來明確你需要vue監聽的型別。


#JavaScript鉤子
可以在屬性中聲名JavaScript鉤子
這些鉤子函式可以結合Css transition/animations使用,也可以單獨是使用。
當只用JavaScript過度時候,在enter和leave總,回掉函式done是必須的。否則,
他們會被同步呼叫,過度會立即完成
推薦對於僅使用JavaScript過度的元素新增v-bind:css="false",Vue會跳過css
的檢測。這也可以避免過渡過程中css的影響。


初始渲染的過度
可以通過apear特性設定節點的初始渲染的過度

相關推薦

vue筆記-----深入響應原理

模型層只是普通的JavaScript物件,修改它則更新時圖。這會讓狀態管理變得非常 簡單且直觀,不過理解它的工作原理以避免一些常見的問題也是很重要的。 如何追蹤變化 把一個普通的JavaScript物件傳給Vue例項的data選項,Vue將遍歷此物件的搜遊屬性 ,並使用Ob

深入淺出 - vue深入響應原理

高質量文章 談,前端框架的『御劍之道』 2018你應該知道的Web效能資訊採集指南 嗨,送你一張Web效能優化地圖 為什麼Vue使用非同步更新佇列? 聊聊我對現代前端框架的認知 深入淺出 - vue變化偵測原理 Vue 專案架構設計與工程化實踐 深

Vue.js 深入響應原理

深入響應式原理 現在是時候深入一下了!Vue 最獨特的特性之一,是其非侵入性的響應式系統。資料模型僅僅是普通的 JavaScript 物件。而當你修改它們時,檢視會進行更新。這使得狀態管理非常簡單直接,不過理解其工作原理同樣重要,這樣你可以迴避一些常見的問題。在這個章節,我們將進入一些 Vue

深入響應原理--Vue

執行 ide 格式 dev fun 添加屬性 類型 即使 develop Vue 最顯著的特性之一便是不太引人註意的響應式系統(reactivity system)。模型層(model)只是普通 JavaScript 對象,修改它則更新視圖(view)。這會讓狀態管理變

Vue深入響應原理(雙向繫結原理

    Vue用了快一年了,一直沒有花時間去了解過它的原理,對於雙向繫結這塊,也只知道在專案中怎麼使用。在網上百度了一波後,發現我有知識都沒接觸過,今天就來好好整理一下。   我理解的Vue雙向繫結的大致思路如下: (1)Vue會使用documentfragment劫持根

vue 資料劫持 響應原理 Observer Dep Watcher

1、vue響應式原理流程圖概覽   2、具體流程 (1)vue示例初始化(原始碼位於instance/index.js) import { initMixin } from './init' import { stateMixin } from './state' import

vuejs檢視不能及時更新的問題 ,深入響應原理

最近三個多月,我和我的同事一起用vuejs 做公司的專案管理系統,因為是第一次用這種雙向繫結的框架,難免遇到一些問題。 在做專案時,發現數據並沒有實時更新,比如說你用element-ui的時間控制元件或者上傳外掛,你雖然更改了時間,或者更改了日期,但是檢視並沒有更新,奇怪的

手寫實現vue的MVVM響應原理

  MVVM響應式實現原理:   1.模板編譯   2.資料劫持   3.watcher   MVVM------------------檢視-----模型----檢視模型   三者與Vue的對應:view對應template,vm對應newVue({…}),model對應data   文中應用到的資料名詞:

深入解析vue.js響應原理與實現

vue.js響應式原理解析與實現。angularjs是通過髒檢查來實現資料監測以及頁面更新渲染。之後,再接觸了vue.js,當時也一度很好奇vue.js是如何監測資料更新並且重新渲染頁面。vue.js響應式原理解析與實現 Object.defineProperty es5新增了

Vue響應原理(MVVM)深入解析

1. 如何實現一個響應式物件 最近在看 Vue 的原始碼,其中最核心基礎的一塊就是 Observer/Watcher/Dep, 簡而言之就是,Vue 是如何攔截資料的讀寫, 如果實現對應的監聽,並且特定的監聽執行特定的回撥或者渲染邏輯的。總的可以拆成三大塊來說

深入解析vue響應原理

摘要:本文主要通過結合vue官方文件及原始碼,對vue響應式原理進行深入分析。 1.定義 作為vue最獨特的特性,響應式可以說是vue的靈魂了,表面上看就是資料發生變化後,對應的介面會重新渲染,那麼響應式系統的底層細節到底是怎麼一回事呢? Tips:vue的響應式系統在vue2.0和vue3.0版本中的底層實

Vue響應原理

允許 clas 沒有 改變 $set 開發 轉化 閱讀 提前 前面的話   Vue最顯著的特性之一便是不太引人註意的響應式系統(reactivity system)。模型層(model)只是普通JS對象,修改它則更新視圖(view)。這會讓狀態管理變得非常簡單且直觀,不過

Vue 及框架響應系統原理

dev 方法 writable 技術分享 構造函數 問題 color 子節點 跨平臺 個人bolg地址 全局概覽 Vue運行內部運行機制 總覽圖: 初始化及掛載 在 new Vue()之後。 Vue 會調用 _init 函數進行初始化,也就是這裏的 init 過程,它會初

關於vue響應原理

define fin data vue 轉化 數據 收集 get() 不支持 Vue 是基於Object.defineProperty()來實現數據響應的,而Object.defineProperty()是ES5無法 shim(修復) 的特性 這也就是Vue不支持 IE8以

vue.js響應原理解析與實現

github 遞歸 val 實現 mode 最新 中比 ava 新頁面 從很久之前就已經接觸過了angularjs了,當時就已經了解到,angularjs是通過臟檢查來實現數據監測以及頁面更新渲染。之後,再接觸了vue.js,當時也一度很好奇vue.js是如何監測數據更新並

vue 響應原理

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</tit

深入淺出Vue基於“依賴收集”的響應原理

原文地址: https://zhuanlan.zhihu.com/p/29318017 每當問到VueJS響應式原理,大家可能都會脫口而出“Vue通過Object.defineProperty方法把data物件的全部屬性轉化成getter/setter,當屬性被訪問或修改時

Vue 資料響應原理

Vue 資料響應式原理 Vue.js 的核心包括一套“響應式系統”。“響應式”,是指當資料改變後,Vue 會通知到使用該資料的程式碼。例如,檢視渲染中使用了資料,資料改變後,檢視也會自動更新。 舉個簡單的例子,對於模板: {{ name }} 建立一個 Vue 元件: var vm = new

vue.js響應原理解析與實現—實現v-model與{{}}指令

只需要 spl foreach 形式 pen for 元素節點 目標 @param 離線瀏覽器軟件 服務器遠程連接 1、可多站同時下載、多站同時扒 2、可單頁扒 3、可自定義, 重寫JS\圖片\CSS路徑 4、執行全站下載後,會下載到本程序根目錄下的html文件夾下。

vue響應原理(雙向繫結)-1

首先將該任務分為幾個子任務: 輸入框以及文字節點與data中的資料繫結 輸入框內容變化時,data中的資料同步變化。即view=>model的變化 data中的資料變化時,文字節點的內容同步變化。即model=>view的變化。 任務一:資料