1. 程式人生 > >【Vue原理】Props

【Vue原理】Props

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧

【Vue原理】Props - 原始碼版

今天記錄 Props 原始碼流程,哎,這東西,就算是研究過了,也真是會隨著時間慢慢忘記的。

幸好我做了詳細的文章,忘記了什麼的,回憶起來必然是很快的。

好的,回到正題,Props

請你在讀這篇之前,先去看看我的白話版

【Vue原理】Props - 白話版

在上面這篇文章中,也已經清楚地解決了一個問題

父元件 如何 把資料 當做 props 傳給子元件

所以今天,我們只需記錄 Props 的處理流程原始碼即可


初始化

在建立Vue例項的過程中,會呼叫 initState 處理options,比如 props,computed,watch 等

只要你 new Vue 建立例項之後,很快就會處理options

function Vue(){
    ... 其他處理
    initState(this)

    ...解析模板,生成DOM 插入頁面

}

function initState(vm) {    

    var opts = vm.$options;    

    if (opts.props) {

        initProps(vm, opts.props);
    }

    ... 處理 computed,watch,methods 等其他options

}

initProps

你看到處理 Props ,主要用到了一個方法 initProps,他就是本場的焦點了,讓我們來採訪下原始碼本碼

function initProps(vm, propsOpt) {    
   // 這是父元件給子元件傳入的 props 的具體值

   var propsData = vm.$options.propsData || {};    

   var props = vm._props = {};    

   for (var key in propsOpt){        

       // 給 props 的 key 設定 響應式

       defineReactive(props, key,  propsData[key]);        

       if (! (key in vm)) {            

           // 轉接訪問,訪問 vm 屬性,轉到訪問 vm._props 屬性
           proxy(vm, "_props", key);
       }
   }
}

上面的程式碼主要做了三件事

1、遍歷 props

2、給 props 設定響應式

3、給 props 設定代理

我們主要講兩件事

1、給 props 設定響應式

defineReactive(props, key,  propsData[key])

defineReactive 在這裡就不給太多原始碼了,你只需要記住他就是給 props 設定響應式的

function defineReactive(obj, key) {    

    Object.defineProperty(obj, key, {  

        get() { ...依賴收集 },
        set(newVal) { ....依賴更新 }
    });
}

如果你想了解響應式,就可以看我這篇文章

【Vue原理】響應式原理 - 白話版

Props 設定響應式,也是旨在資料改變時動態更新。

怎麼設定響應式嗎?看這裡

【Vue原理】依賴收集 - 原始碼版之基本資料型別

【Vue原理】依賴收集 - 原始碼版之引用資料型別

資料是直接從 父元件上傳過來的,沒有進行拷貝等處理,原樣傳過來

怎麼傳的?也可以看

【Vue原理】Props - 白話版

如果props 是基本型別

在 子元件例項上設定這個 props 屬性為響應式,跟 data 本質一樣,作用是監聽 props 修改

如果 props 是物件

也會在 子元件例項上 設定這個 props 屬性為響應式,作用也是監聽 props 修改

但是!

【不會遞迴物件】給物件內所有屬性設定響應式,因為該物件【已經在父元件中】完成響應式設定了

也就是說

如果你在 子元件中直接修改 props 物件內的資料,父元件也會跟著修改

在記錄的途中,我發現了一個問題,發現沒有想象中的那麼簡單,所以現在鄭重記錄

當 父元件資料 改變,子元件怎麼更新?

分型別的,說得比較詳細,可能有點繞?

1、 如果是基本型別,是這個流程

父元件資料改變,只會把新的資料傳給子元件

子元件拿到新資料,就會直接替換到原來的 props

替換就是直接等哈,看下原始碼,重要語句標紅

updateChildComponent 是子元件內部更新時會呼叫到的一個函式,這是其中更新 props 的一個片段

function updateChildComponent(

    vm, propsData

) {    

    if (propsData && vm.$options.props) {        

      // 儲存 props 的地方,用於訪問轉接,具體看文章下面

      var props = vm._props;        

      // 所有子元件上設定的 props 的 key

      var propKeys = vm.$options._propKeys || [];        

      for (var i = 0; i < propKeys.length; i++) {            

        var key = propKeys[i];

        props[key] = propsData[key]
      }
     vm.$options.propsData = propsData;
   }
}

而 props 在子元件中也是響應式的,【直接 等號 替換】導致觸發 set,set 再通知 子元件完成更新

公眾號

公眾號

資料是 基本型別,然後設定定時器修改資料

watcher1 是父元件,watcher2 是子元件

父元件內的 data num 通知 watcher1 更新 子元件內的 props child_num 通知 watcher2 更新

公眾號

2、如果是物件,是這個流程

條件

父元件傳 物件 給 子元件,並且父子元件 頁面都使用到了這個資料

結果

那麼這個物件,會收集到 父子元件的 watcher

所以

當 物件內部被修改的時候,會通知到 父和子 更新。

例子

父元件設定 obj 物件,並傳給子元件

公眾號

公眾號 定時修改父元件資料 obj.name ,可以看到是 obj.name 通知 父子更新

公眾號

當然,如果物件被整個替換了,而不是修改內部,那麼跟 基本型別一樣

區別是什麼?

1、基本型別是,子元件內部 props 通知 子元件更新的

2、引用型別是,父元件的資料 data 通知 子元件更新的

2、給 props 設定代理

在白話版中,我已經說得很清楚了, Props 有個移花接木的暗箱操作,就是訪問轉移

Data 也是這麼做的


【Vue原理】代理 Data - 原始碼版

你在專案中,會使用 http://this.xxx去訪問 props,props 已經當成了 例項的屬性,所以可以直接訪問

但是其實你訪問的是 【this._props.xxx】

為什麼 Vue 要這麼弄,目的就是為了方便開發啊,讓我們直接簡短了相關程式碼

而 React,訪問 props,還要 this.props.xxxx,寫這麼長,不嫌麻煩嗎?

那麼,是怎麼設定代理的呢,就是下面這行

proxy(vm, "_props", key);

proxy 是什麼也不要急,瓜就在下面,拿凳坐好

function proxy(

    target, sourceKey, key

) {    

  Object.defineProperty(target, key, {

      get() {            

          return this[sourceKey][key]

      },

      set(val) {            

          this[sourceKey][key] = val;

      }
  });
}

這段程式碼做了2 個事

1、使用 props 在 vm 上佔位,使得可以通過 http://vm.xxx 的形式訪問到 props

2、設定 [Object.defineProperty] 的 get 和 set ,間接獲取和賦值 vm._props

所有訪問賦值 props,轉接到 vm._props 上,直觀如下圖

公眾號 上個例項,方便大家看

公眾號

說完收工

相關推薦

Vue原理Props

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Props - 原始碼版 今天記錄 Props 原始碼流程,哎,這東西,就算是研究過了,也真是會隨著時間慢慢忘記的。 幸好我做了詳細的文章,忘記了什麼的,回憶起來必然是很快的。 好的,回到正題,Props 請你

Vue原理Watch

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Watch - 原始碼版 今天繼續探索 Watch 原始碼,廢話不多說了 帶著我的幾個疑問開始 1、什麼時候初始化 2、怎麼確定監聽哪些值 3、深度監聽怎麼回事 4、怎麼觸發我的函式 這些問題的答案會摻

Vue原理Mixins

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Mixins - 原始碼版 今天探索的是 mixins 的原始碼,mixins 根據不同的選項型別會做不同的處理 篇幅會有些長,你知道的,有很多種選項型別的嘛,但不是很難。只是涉及原始碼難免會有些煩, 不過這篇文

Vue原理依賴更新

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】依賴更新 - 原始碼版 如果對依賴收集完全沒有概念的同學,可以先看我這篇白話版 響應式原理 - 白話版 我們已經講過了 依賴收集 【Vue原理】依賴收集 - 原始碼版之基本資料型別 【Vue

Vue原理VNode

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】VNode - 原始碼版 今天就來探索 VNode 的原始碼,VNode 是 Vue2 渲染機制中很重要的一部分,是深入Vue 必須瞭解的部分 我們以4個問題來開始我們的探索 1、vnode 是什麼及其作用

Vue原理Event

如果你覺得排版難看,請點選 下面連結 或者 拉到 下面關注公眾號也可以吧 【Vue原理】Event - 原始碼版 之 自定義事件 Vue 的自定義事件很簡單,就是使用 觀察者模式 進行事件的監聽和分發 Vue 封裝的這個觀察者模式,可以說是很完善了,這個可以獨立抽取出來的在其他專案中使用的程式碼,

Vue原理NextTick

寫文章不容易,點個讚唄兄弟 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,白話版助於理解工作原理,原始碼版助於瞭解內部詳

Vue原理Render

寫文章不容易,點個讚唄兄弟 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,白話版助於理解工作原理,原始碼版助於瞭解內部詳

Vue原理Diff

寫文章不容易,點個讚唄兄弟 <br> <br> 專注 Vue 原始碼分享,文章分為白話版和 原始碼版,

vue.js入門

emp 寫到 logs 組件 images href one mooc 渲染 慕課網視頻學習筆記:http://www.imooc.com/learn/694 1.將html、js、css寫到一個後綴名.vue的文件中,區分這三種類型是通過<template>、

底層原理四位計算機的原理及其實現

一點 led燈 waiting lean div rm2 src and nvt 你是否想過,計算機為什麽會加減乘除?或者更直接一點,計算機的原理到底是什麽? Waitingforfriday有一篇詳細的教程,講解了如何自己動手,制作一臺四位計算機。從中可以看到,二進制、數

計算機原理程序執行過程

進程 cnblogs div 空間 時間片 chat 內存管理 tro alt 本章主要介紹程序執行過程中操作系統、CPU都幹了什麽 運行前 程序在運行前,只是在硬盤上待著,此時就是一堆二進制代碼而已,沒有任何作用。 程序只有進入了內存才能運行,但是要進入內存,則需要服從操

計算機原理CPU部分.md

工作 信號 通過 臃腫 流水線 處理 2.6 操作 ade 本文由CPU阿甘改編而得,主要講的是系統啟動和程序執行時CPU做的工作。 CPU的構成 中央處理器(CPU,Central Processing Unit)由運算器、控制器、Cache等。 控制器:主要是對指令進

組成原理第一章 計算機系統概述

表示 運算 傳遞 intro 指令 掌握 周期 style 主存 重點掌握:MAR和MDR的含義,主存容量大小、CPU執行時間的計算,性能指標CPI、MIPS、主頻等等。 1. 存儲單元:CPU訪問存儲器的基本單位,每個單元有一個地址。通常是字節大小的整數倍。 2. CPU

編譯原理c++實現自下而上語法分析器

不可 acm times style size PC -i 表達式 鏈接 寫在前面:本博客為本人原創,嚴禁任何形式的轉載!本博客只允許放在博客園(.cnblogs.com),如果您在其他網站看到這篇博文,請通過下面這個唯一的合法鏈接轉到原文! 本博客全網唯一合法URL:ht

計數原理UVA11538 Chess Queen

put typename return col nbsp 題意 putchar cst putc 傳送門 Description   給你一個n*m的棋盤,在棋盤上放置一黑一白兩個皇後,求兩個皇後能夠互相攻擊的方案個數 Input   多組數據,每組數據包括:

MongoDB 復制集 第 二 部 之選舉原理

command primary red and 優先權 mongo mongodb 主機 set 目錄: 1·復制與選舉的原理與驗證2·oplog 日誌調整3·配置復制集的優先級4·部署認證的復制5·總結 復制與選舉的原理: 上一篇文章搭建了多臺實例,部署成復制集,

Memcached 主主復制 + Keepalived 高可用架構附上原理

ima pki nag ali event 主服務器 figure tel outer 目錄: 1·Memcached 主主復制概念2·Memcached 高可用的實現3·案例部署4·總結 Memcached 主主復制概念 (1)主主復制概念: Memcached

Windows原理非同步IO-_APC(非同步過程呼叫)

// 同步IO的缺點是, 在讀寫檔案時, 如果檔案太大, 或者讀寫的時間太長, 就會在讀寫函式中 // 阻塞住. // 非同步IO解決了這個問題, 非同步IO讀寫檔案時, 檔案再大也不會阻塞住 // 但是非同步IO要完成這樣的特性是有一點付出的 // 非同步讀寫檔案後, 需要通過一些方式

Windows原理IO非同步-等待事件物件

/* 同步IO的缺點是, 在讀寫檔案時, 如果檔案太大, 或者讀寫的時間太長, 就會在讀寫函式中 阻塞住. 非同步IO解決了這個問題, 非同步IO讀寫檔案時, 檔案再大也不會阻塞住 但是非同步IO要完成這樣的特性是有一點付出的 非同步讀寫檔案後, 需要通過一些方式才能知道檔案讀寫(IO