最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue實現(xiàn)數(shù)據(jù)控制視圖的原理解析

 更新時間:2020年01月07日 09:36:26   作者:laihuamin  
這篇文章主要介紹了vue如何實現(xiàn)的數(shù)據(jù)控制視圖的相關知識,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

這篇主要講的就是vue很重要的一塊知識點,雙向數(shù)據(jù)綁定是如何實現(xiàn)的。一開始看這一塊的內(nèi)容的時候比較迷茫,迷茫在以下幾個點:

  1. 這塊內(nèi)容該從哪邊入手
  2. 數(shù)據(jù)變化是如何驅(qū)動視圖層更新的
  3. 做題深化知識點

從哪邊著手去看響應式原理

我這邊提供三個方向,從這三個方向,你都可以看到watcher的使用,然后watcher的使用過程中,會摻雜到observer以及dep,然后以點帶面,對整體進行梳理

初始化的render流程去看

在lifecycle這個文件中的mountComponent這個方法里,創(chuàng)建了一個watcher。代碼如下:

new Watcher(vm, updateComponent, noop, {
 before () {
  if (vm._isMounted && !vm._isDestroyed) {
  callHook(vm, 'beforeUpdate')
  }
 }
}, true /* isRenderWatcher */)

可以透過這個傳參,梳理出整一個

  • 從watch的角度去看
  • 從computed的角度去看

數(shù)據(jù)變化是如何驅(qū)動視圖層更新的

這個問題其實可以分兩個方面去看:

如何知道數(shù)據(jù)變化了

如何知道某一塊視圖和數(shù)據(jù)有關,并更新他 如何知道數(shù)據(jù)變化了

答案:數(shù)據(jù)劫持

數(shù)據(jù)劫持的兩種方式

Object.defineProperty
proxy

Vue3.0中的數(shù)據(jù)劫持是用proxy來實現(xiàn)的,目前閱讀的源碼中,都是以 Object.defineProperty 這種方式來實現(xiàn)的。

如何知道某一塊視圖和數(shù)據(jù)有關,并更新他

答案:依賴收集以及訂閱更新

詳細解讀過程:用圖告訴你響應式原理

這里僅用一個簡單的例子和圖,來明確一下整個流程

<div id="app">
 {{ message }}
 {{ message1 }}
 <input type="text" v-model="message">
 <div @click="changeMessage">改變message</div>  
</div>
var app = new Vue({
 el: '#app',
 data: {
  message: '1',
  message1: '2',
 },
 methods: {
  changeMessage() {
   this.message = '2'
  }
 },
 watch: {
  message: function(val) {
   this.message1 = val
  }
 }
})

依賴收集流程圖

依賴收集的最終結(jié)果:

訂閱更新流程圖:

。

做題深化知識點

題目如下:

1、簡述Vue的響應式原理

2、計算屬性和watch的區(qū)別

3、Vue中給data中的對象屬性添加一個新的屬性時會發(fā)生什么,如何解決?

對于第一和第二在這里就不花篇幅去說明。

Vue中給data中的對象屬性添加一個新的屬性時會發(fā)生什么,如何解決?

我們在做業(yè)務的時候經(jīng)常會遇到這樣的情況,我舉一個簡單的例子:

<template>
 <div>
 <ul>
  <li v-for="value in obj" :key="value">
  {{value}}
  </li>
 </ul>
 <button @click="addObjB">添加obj.b</button>
 </div>
</template>
<script>
export default {
 data () {
 return {
  obj: {
  a: 'obj.a'
  }
 }
 },
 methods: {
 addObjB () {
  this.obj.b = 'obj.b'
  console.log(this.obj)
 }
 }
}
</script>
<style></style>

依賴收集流程:

從中我們可以發(fā)現(xiàn),renderWatch是有收集 Dep(obj)Dep(Obj.a) 的,但是當我們改變Obj的時候,并沒有觸發(fā)視圖的更新。因為我們在改變obj的值的時候,并沒有去觸發(fā)Dep(obj)。

產(chǎn)生問題的本質(zhì)原因:

1、vue會在state.js文件的initData的方法中,將data屬性中的每一個key都變成響應式屬性。

2、視圖在渲染過程中,會將renderWatcher收集到用到的值的dep中,方便依賴更新(不懂的在回過去看一下依賴收集流程)

3、當你額外添加一個屬性的時候,該屬性并不是響應式屬性。

那如何去改變:

addObjB () {
 // this.obj.b = 'obj.b'
 this.$set(this.obj, 'b', 'obj.b')
 console.log(this.obj)
}

總結(jié)

這篇文章是年度總結(jié)的開篇,后續(xù)會繼續(xù)總結(jié)初始化部分、render部分和patch部分。希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關文章

  • Element el-table的formatter和scope?template不能同時存在問題解決辦法

    Element el-table的formatter和scope?template不能同時存在問題解決辦法

    本文主要介紹了ElementUI?el-table?的?formatter?和?scope?template?不能同時存在問題解決辦法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-08-08
  • 命令行CLI一鍵生成各種煩人的lint配置實例

    命令行CLI一鍵生成各種煩人的lint配置實例

    這篇文章主要為大家介紹了命令行CLI一鍵生成各種煩人的lint配置實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • Vue.js每天必學之過渡與動畫

    Vue.js每天必學之過渡與動畫

    Vue.js每天必學之過渡與動畫,對Vue.js過渡與動畫進行深入學習,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • vue+express生成token方式

    vue+express生成token方式

    這篇文章主要介紹了vue+express生成token方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vue祖孫組件之間的數(shù)據(jù)傳遞案例

    vue祖孫組件之間的數(shù)據(jù)傳遞案例

    這篇文章主要介紹了vue祖孫組件之間的數(shù)據(jù)傳遞案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 從零擼一個pc端vue的ui組件庫( 計數(shù)器組件 )

    從零擼一個pc端vue的ui組件庫( 計數(shù)器組件 )

    這篇文章主要介紹了pc端vue的ui組件庫的實現(xiàn)方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • ElementUI的this.$notify.close()調(diào)用不起作用的解決

    ElementUI的this.$notify.close()調(diào)用不起作用的解決

    本文主要介紹了ElementUI的this.$notify.close()調(diào)用不起作用的解決,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • vue打包相關細節(jié)整理(小結(jié))

    vue打包相關細節(jié)整理(小結(jié))

    這篇文章主要介紹了vue打包相關細節(jié)整理(小結(jié)),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09
  • vue項目打包發(fā)布后接口報405錯誤的解決

    vue項目打包發(fā)布后接口報405錯誤的解決

    這篇文章主要介紹了vue項目打包發(fā)布后接口報405錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Vue.js實現(xiàn)文件上傳和進度條顯示功能

    Vue.js實現(xiàn)文件上傳和進度條顯示功能

    在現(xiàn)代Web開發(fā)中,文件上傳是一個常見而重要的需求,無論是在用戶上傳頭像、文檔或者其他類型的文件時,良好的用戶體驗都是至關重要的,在這篇博客中,我們將介紹如何使用Vue.js來實現(xiàn)文件上傳功能,同時顯示上傳進度條,需要的朋友可以參考下
    2024-11-11

最新評論

崇礼县| 万荣县| 宜宾市| 巴东县| 仲巴县| 安仁县| 沙湾县| 化州市| 永春县| 广宗县| 秦安县| 永德县| 平度市| 荥经县| 房山区| 隆子县| 剑河县| 抚松县| 天水市| 宁化县| 金坛市| 枣庄市| 定南县| 屯门区| 康马县| 芒康县| 大庆市| 海阳市| 鹰潭市| 金阳县| 洛浦县| 乌鲁木齐市| 呼玛县| 邯郸市| 南京市| 大竹县| 荔浦县| 普宁市| 合江县| 康保县| 英吉沙县|