この記事では主にvueデータでアロー関数が使えない問題をソースコード解析を通して詳しく紹介していますので、必要な方は参考にしてください
まず、 a () {} と b: () => {}
は異なりますa() {}和 b: () => {}
是不同的
let obj = { a() {}, // 相当于 a:function() {}, b: () => {} }
1 VUE.js 源码解析
注意此处只设计核心代码
这段代码也是UMD实现原理,本文这里不是重点,有兴趣的可以自行探究。
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.Vue = factory()); }(this, (function (){ 'use strict'; console.log(this) //*undefined* })))
解析一:
对于javascript来说,非严格模式下函数都会有一个this指向,不清楚的这里有传送门this指向相关
说一下本文中涉及的this指向问题,如果不是严格模式,this应该指向window,但是由于vue作者使用的是严格模式,所以他指向了undefined
以下是vue中data的实现原理
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.Vue = factory()); }(this, (function (){ 'use strict'; function getData(data,vm) { return data.call(vm, vm) } function initData(params) { data = vm._data = typeof data === 'function' ? getData(data, vm) : data || {}; } initData() })))
也就是说每次新创建实例的时候都会去判断是否有data函数,如果有的话就会将其赋值给vm._data,心细的同学会发现对于Vmm实例来说是没有data,而是有vm._data
es5函数和es6箭头函数
var obj = { a: () => { 'use strict'; console.log(this,'a') }, b() { console.log(this,'b') }, c() { // window let e = () => { console.log(this,'e') } return e } } obj.a() // window obj.b() // obj obj.c()() // obj
对于普通函数(非严格模式下),this指向调用者,es6中的this指向声明时的上下文环境。
结合以上两点解析今天的问题
(function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : (global.Vue = factory()); }(this, (function (){ 'use strict'; let vm = {} var data = () => { console.log(this);//undefined return { a: 1 } } function getData(data,vm) { return data.call(vm, vm) } function initData(params) { data = vm._data = typeof data === 'function' ? getData(data, vm) : data || {}; } initData() console.log(vm); })))
以上代码说明你使用箭头函数给data: () => {} this指向undefined的时候,是会赋值给vm._data,但是他会相当于一个全局的,只要你不刷新页面他就会缓存你的data。
如果我们使用data() {}this
1 VUE。 js ソース コードの分析
ここではコア コードのみが設計されていることに注意してください このコードは UMD の実装原理でもありますので、興味のある方はご自身で調べてください。
以下は、におけるデータの実装原理ですvue
rrreee🎜🎜🎜 つまり、新しいインスタンスが作成されるたびに、data関数があるかどうかを判断し、あればvmに割り当てます。 _data. 注意深い学生は、Vmm インスタンス用の data 関数はないことに気づくでしょう。しかし、通常の関数には vm._data🎜🎜es5 関数と es6 arrow 関数があります🎜🎜🎜🎜非厳密モードでは)、this は呼び出し元を指し、es6 の this は宣言されたコンテキストを指します。 🎜🎜上記 2 つのポイントを組み合わせて今日の問題を分析しました🎜
🎜rrreee🎜🎜🎜上記のコードは、アロー関数を使用してデータを割り当てることを示しています: () => {} これが未定義を指しているとき、値 Give vm._data が割り当てられますが、これはページを更新しない限り、データをキャッシュします。 🎜🎜🎜data() を使用すると、{}this
は Vm インスタンスを指すため、インスタンスで更新されます。 🎜🎜上記がこの記事の全内容です。その他の関連コンテンツについては、PHP 中国語 Web サイトをご覧ください。 🎜🎜関連する推奨事項: 🎜🎜🎜Vue iview-admin フレームワークで第 2 レベルのメニューを第 3 レベルのメニューに変更する方法について🎜🎜🎜🎜🎜 vue.js カルーセル コンポーネントの使用方法について🎜🎜🎜🎜🎜 🎜🎜🎜🎜
以上がVue データではアロー関数の問題分析を使用できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。