Vue.js中this如何取到data和method里的屬性詳解
本篇文章介紹的是
Vue.js
如何取到data
和methods
里的屬性?
準備工作
- 克隆源碼到本地
git clone https://github.com/vuejs/vue.git
下載完畢后,用vscode
打開,目光移動到package.json
的scripts
屬性,我們看到有dev
和build
,dev
會啟動一個開發(fā)環(huán)境的服務,也就是說,我們在源碼里做的改動,都會及時生效。build
就是打包。和我們平時開發(fā)Vue.js
項目是一個道理。
我們首先安裝一下Vue.js
項目的依賴(使用pnpm
),然后運行npm run dev
。這樣的好處就是我們能隨時看到代碼改動后的效果。
- 接下來我們在
examples
目錄下創(chuàng)建一個html
文件,引入打包后的vue.js
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> </head> <body> <div id="app"> <h1 @click="changeMsg">hello {{msg}}</h1> </div> <script src="../dist/vue.js"></script> <script> const vm = new Vue({ el: '#app', data: { msg: 'world' }, methods: { changeMsg() { this.msg = 'me' } } }) </script> </body> </html>
- 安裝一個
serve
全局包啟動, 在根目錄運行一下serve
,就能看到頁面展示出來了。
調試源碼
我們這里使用谷歌瀏覽器調試,F12
找到sources
面板如下圖所示的位置打上斷點,接著刷新頁面,就進入了調試模式。
然后,我們就通過step into
按鈕進入new Vue
的函數(shù)內部。 接著進入_init
的內部,找到initState(vm)
,也就是當前文件代碼的4714行,這個函數(shù)的內部就是我們要研究的部分。
進入initState
內部,我們看到
if (opts.methods) initMethods(vm, opts.methods); if (opts.data) { initData(vm); }
initMethods
function initMethods(vm, methods) { var props = vm.$options.props; for (var key in methods) { { if (typeof methods[key] !== 'function') { warn$2("Method \"".concat(key, "\" has type \"").concat(typeof methods[key], "\" in the component definition. ") + "Did you reference the function correctly?", vm); } if (props && hasOwn(props, key)) { warn$2("Method \"".concat(key, "\" has already been defined as a prop."), vm); } if (key in vm && isReserved(key)) { warn$2("Method \"".concat(key, "\" conflicts with an existing Vue instance method. ") + "Avoid defining component methods that start with _ or $."); } } vm[key] = typeof methods[key] !== 'function' ? noop : bind$1(methods[key], vm); } }
- 首先判斷組件內部是否聲明了函數(shù)
- 其次判斷是否和
props
、保留鍵名的名字沖突了 - 最后是處理邏輯,如果對應值的類型是函數(shù)將傳入的
vm
對應的屬性賦值,否則為noop
,賦值的函數(shù)這里做了一個強綁(使用的bind
,this
指向vm
)。這個bind$
來自原生的bind
方法
var bind$1 = Function.prototype.bind ? nativeBind : polyfillBind;
initData
調試完了initMehtods
后,就開始initData
,我們使用step out
按鈕就跳出了當前函數(shù),接著進入initData
內部。
function initData(vm) { var data = vm.$options.data; data = vm._data = isFunction(data) ? getData(data, vm) : data || {}; if (!isPlainObject(data)) { data = {}; warn$2('data functions should return an object:\n' + 'https://v2.vuejs.org/v2/guide/components.html#data-Must-Be-a-Function', vm); } // proxy data on instance var keys = Object.keys(data); var props = vm.$options.props; var methods = vm.$options.methods; var i = keys.length; while (i--) { var key = keys[i]; { if (methods && hasOwn(methods, key)) { warn$2("Method \"".concat(key, "\" has already been defined as a data property."), vm); } } if (props && hasOwn(props, key)) { warn$2("The data property \"".concat(key, "\" is already declared as a prop. ") + "Use prop default value instead.", vm); } else if (!isReserved(key)) { proxy(vm, "_data", key); } } // observe data var ob = observe(data); ob && ob.vmCount++; }
邏輯和initMethods
類似,和props
、methods
做了比對,最后通過proxy
將data
,綁定到vm
上
function proxy(target, sourceKey, key) { sharedPropertyDefinition.get = function proxyGetter() { return this[sourceKey][key]; }; sharedPropertyDefinition.set = function proxySetter(val) { this[sourceKey][key] = val; }; Object.defineProperty(target, key, sharedPropertyDefinition); }
最終我們知道data
的值是通過Object.defineProperty
,實現(xiàn)綁定的。
結束語
我們要研究一個源碼,首先要準備源碼、serve、和調試工具(谷歌瀏覽器),然后進入代碼的內部,才能看的清楚明白,我們就此知道了Vue.js
的this
如何取到data
和methods
的屬性。
到此這篇關于Vue.js中this如何取到data和method里的屬性的文章就介紹到這了,更多相關Vue.js this取data和method屬性內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解在vue-cli中使用graphql即vue-apollo的用法
這篇文章主要介紹了詳解在vue-cli中使用graphql即vue-apollo的用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09vue 添加和編輯用同一個表單,el-form表單提交后清空表單數(shù)據(jù)操作
這篇文章主要介紹了vue 添加和編輯用同一個表單,el-form表單提交后清空表單數(shù)據(jù)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08vue?parseHTML函數(shù)源碼解析start鉤子函數(shù)
這篇文章主要為大家介紹了vue?parseHTML函數(shù)源碼解析start鉤子函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07vue.js模仿京東省市區(qū)三級聯(lián)動的選擇組件實例代碼
選擇省市區(qū)是我們大家在填寫地址的時候經(jīng)常會遇到的一個功能,下面這篇文章主要給大家介紹了關于利用vue.js模仿實現(xiàn)京東省市區(qū)三級聯(lián)動選擇組件的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來一起看看吧。2017-11-11vue2.0.js的多級聯(lián)動選擇器實現(xiàn)方法
下面小編就為大家分享一篇vue2.0.js的多級聯(lián)動選擇器實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02