


Mari kita bincangkan tentang masalah penunjuk ini dalam vue2.x Mengapakah ia menunjuk kepada contoh vue?
Artikel ini akan membincangkan masalah penunjuk ini dalam vue2.x, dan memperkenalkan sebab ini menunjukkan contoh vue. Saya harap ia akan membantu semua orang.
Laluan kod dalam kumpulan secara tidak sengaja menyebut mengapa ini boleh dipanggil terus ke nilai dalam data, kaedah, prop dan dikira, kemudian semua orang mempunyai beberapa tekaan. tetapi tiada satu pun daripada mereka yang jelas untuk menjelaskan soalan ini, saya menyemak kod sumber vue saya mempunyai sedikit pemahaman dan menulis artikel untuk merekodkannya.
Timbulkan soalan
Biasanya bangunkan kod vue, hampir selalu tulis seperti ini
export default { data() { return { name: '彭鱼宴' } }, methods: { greet() { console.log(`hello, 我是${this.name}`) } } }
Mengapa this.name di sini boleh diakses terus ? Bagaimana pula dengan nama yang ditakrifkan dalam data, atau this.someFn boleh terus mengakses fungsi yang ditakrifkan dalam kaedah Dengan memikirkan soalan ini, saya mula melihat kod sumber vue2.x untuk mencari jawapannya.
Analisis kod sumber
Berikut ialah alamat kod sumber vue kod sumber vue. Mari kita lihat pada pembina contoh vue Pembina berada dalam direktori kod sumber /vue/src/core/instance/index.js Tidak banyak kod tersebut 🎜>
Struktur ini sangat mudahfunction Vue (options) { if (process.env.NODE_ENV !== 'production' && !(this instanceof Vue) ) { warn('Vue is a constructor and should be called with the `new` keyword') } this._init(options) } initMixin(Vue) stateMixin(Vue) eventsMixin(Vue) lifecycleMixin(Vue) renderMixin(Vue) export default Vue
digunakan untuk memanggil pembina, amaran dilemparkan di sini. Jika kata kunci if (!(this instanceof Vue)){}
digunakan seperti biasa, maka fungsi new
digunakan bukankah ia sangat mudah? this
new
_init
fungsi _init agak panjang dan melakukan banyak perkara, jadi saya tidak akan menerangkannya satu demi satu di sini Kandungan yang berkaitan dengan penerokaan ini harus berada dalam fungsi initState(vm).
let uid = 0 export function initMixin (Vue: Class<Component>) { Vue.prototype._init = function (options?: Object) { const vm: Component = this // a uid vm._uid = uid++ let startTag, endTag /* istanbul ignore if */ if (process.env.NODE_ENV !== 'production' && config.performance && mark) { startTag = `vue-perf-start:${vm._uid}` endTag = `vue-perf-end:${vm._uid}` mark(startTag) } // a flag to avoid this being observed vm._isVue = true // merge options if (options && options._isComponent) { // optimize internal component instantiation // since dynamic options merging is pretty slow, and none of the // internal component options needs special treatment. initInternalComponent(vm, options) } else { vm.$options = mergeOptions( resolveConstructorOptions(vm.constructor), options || {}, vm ) } /* istanbul ignore else */ if (process.env.NODE_ENV !== 'production') { initProxy(vm) } else { vm._renderProxy = vm } // expose real self vm._self = vm initLifecycle(vm) initEvents(vm) initRender(vm) callHook(vm, 'beforeCreate') initInjections(vm) // resolve injections before data/props initState(vm) initProvide(vm) // resolve provide after data/props callHook(vm, 'created') /* istanbul ignore if */ if (process.env.NODE_ENV !== 'production' && config.performance && mark) { vm._name = formatComponentName(vm, false) mark(endTag) measure(`vue ${vm._name} init`, startTag, endTag) } if (vm.$options.el) { vm.$mount(vm.$options.el) } } }
Dapat dilihat bahawa initState melakukan 5 perkara
export function initState (vm: Component) { vm._watchers = [] const opts = vm.$options if (opts.props) initProps(vm, opts.props) if (opts.methods) initMethods(vm, opts.methods) if (opts.data) { initData(vm) } else { observe(vm._data = {}, true /* asRootData */) } if (opts.computed) initComputed(vm, opts.computed) if (opts.watch && opts.watch !== nativeWatch) { initWatch(vm, opts.watch) } }
Memulakan prop
- Memulakan kaedahMemulakan dataMemulakan pengiraanMemulakan jam tangan
- Mari kita fokus pada kaedah permulaan dahulu
kaedah permulaan initMethods
initMethods terutamanya beberapa pertimbangan:
function initMethods (vm, methods) { var props = vm.$options.props; for (var key in methods) { { if (typeof methods[key] !== 'function') { warn( "Method \"" + key + "\" has type \"" + (typeof methods[key]) + "\" in the component definition. " + "Did you reference the function correctly?", vm ); } if (props && hasOwn(props, key)) { warn( ("Method \"" + key + "\" has already been defined as a prop."), vm ); } if ((key in vm) && isReserved(key)) { warn( "Method \"" + key + "\" conflicts with an existing Vue instance method. " + "Avoid defining component methods that start with _ or $." ); } } vm[key] = typeof methods[key] !== 'function' ? noop : bind(methods[key], vm); } }
Kecuali pertimbangan yang dinyatakan di atas,
The perkara yang paling penting ialah untuk mentakrifkan semua kaedah dalam contoh vue, dan gunakan fungsi bind untuk menunjukkan fungsi ini kepada contoh Vue判断methods中定义的函数是不是函数,不是函数就抛warning; 判断methods中定义的函数名是否与props冲突,冲突抛warning; 判断methods中定义的函数名是否与已经定义在Vue实例上的函数相冲突,冲突的话就建议开发者用_或者$开头命名;
Ini menjelaskan mengapa ini boleh terus mengakses kaedah dalam kaedah.
data permulaan initData
Apakah yang dilakukan oleh initdata:
function initData (vm) { var data = vm.$options.data; data = vm._data = typeof data === 'function' ? getData(data, vm) : data || {}; if (!isPlainObject(data)) { data = {}; warn( 'data functions should return an object:\n' + 'https://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( ("Method \"" + key + "\" has already been defined as a data property."), vm ); } } if (props && hasOwn(props, key)) { warn( "The data property \"" + key + "\" is already declared as a prop. " + "Use prop default value instead.", vm ); } else if (!isReserved(key)) { proxy(vm, "_data", key); } } // observe data observe(data, true /* asRootData */); }
Pertama tetapkan nilai kepada instance_data, fungsi getData Fungsi pemprosesan data mengembalikan objek
- untuk menilai data terakhir yang diperoleh, dan bukan objek untuk memberi amaran. Tentukan sama ada fungsi dalam kaedah bercanggah dengan kunci dalam data Tentukan sama ada terdapat konflik antara prop dan kunci dalam data Tentukan sama ada ia adalah peribadi dalaman atribut terpelihara. Jika tidak, buat lapisan proksi, proksi kepada _dataAkhir sekali dengar data dan jadikan ia data responsif
- Lihat fungsi proksi:
Malah,
di sini digunakan untuk mentakrifkan objek Tujuanfunction noop (a, b, c) {} var sharedPropertyDefinition = { enumerable: true, configurable: true, get: noop, set: noop }; 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); }
Object.defineProperty
adalah untuk menjadikan
<.>proxy
Fungsi observe bukan dalam skop perbincangan ini kawan-kawan yang berminat boleh menyemak sendiri source code. this.name
this._data.name
Kembali kepada soalan yang dibangkitkan pada permulaan dan berikan jawapan: Kaedah dalam
pas- menentukan
- sebagai contoh Vue baharu (
), dan fungsi dalam kaedah juga ditakrifkan pada
Objek data yang dikembalikan oleh fungsi juga disimpan dalammethods
, jadi anda boleh mengakses terus fungsi dalambind
melaluithis
.vm
vm
this
methods
pada contoh Vue baharu ( - ), yang sebenarnya diakses apabila mengakses
Ia ialah
[Cadangan berkaitan:data
selepas proksi.vm
_data
this.name
Object.defineProperty
Mengenai kelebihan dan kekurangan corak reka bentuk data ini, anda boleh terus meneroka, lagipun, ia bukan sebahagian daripada perbincangan ini.this._data.name
tutorial video vue.js
Atas ialah kandungan terperinci Mari kita bincangkan tentang masalah penunjuk ini dalam vue2.x Mengapakah ia menunjuk kepada contoh vue?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Seorang rakan sekerja tersekat kerana pepijat yang ditunjukkan oleh masalah penunjuk Vue2 ini menyebabkan fungsi anak panah digunakan, mengakibatkan ketidakupayaan untuk mendapatkan prop yang sepadan. Dia tidak tahu apabila saya memperkenalkannya kepadanya, dan kemudian saya sengaja melihat kumpulan pertukaran bahagian hadapan Setakat ini, sekurang-kurangnya 70% pengaturcara bahagian hadapan masih tidak memahaminya anda pautan ini. Jika semuanya tidak jelas saya belum belajar bagaimana untuk melakukannya, sila berikan saya mulut yang besar.

Artikel ini akan membantu anda mentafsir kod sumber vue dan memperkenalkan sebab anda boleh menggunakan ini untuk mengakses sifat dalam pelbagai pilihan dalam Vue2. Saya harap ia akan membantu semua orang.

Penggunaan fleksibel kata kunci ini dalam jQuery Dalam jQuery, kata kunci ini adalah konsep yang sangat penting dan fleksibel Ia digunakan untuk merujuk kepada elemen DOM yang sedang dimanipulasi. Dengan menggunakan kata kunci ini secara rasional, kami boleh mengendalikan elemen pada halaman dengan mudah dan mencapai pelbagai kesan dan fungsi interaktif. Artikel ini akan menggabungkan contoh kod khusus untuk memperkenalkan penggunaan fleksibel kata kunci ini dalam jQuery. Mudah contoh ini Mula-mula, mari kita lihat contoh mudah ini. Katakan kita mempunyai a

1. kata kunci ini 1. Jenis ini: Objek yang dipanggil ialah jenis rujukan objek itu 2. Ringkasan penggunaan 1. this.data;//Atribut akses 2. this.func();//Kaedah akses 3.this ( );//Panggil pembina lain dalam kelas ini 3. Penjelasan penggunaan 1.this.data digunakan dalam kaedah ahli Mari kita lihat apa yang akan berlaku jika ini tidak ditambah classMyDate{publicintyear;publicintmonth;publicintday(intyear,. intmonth,intday){ye

Apa ini? Artikel berikut akan memperkenalkan anda kepada ini dalam JavaScript, dan bercakap tentang perbezaan antara ini dalam kaedah panggilan yang berbeza fungsi saya harap ia akan membantu anda!

Fungsi anak panah dalam JavaScript adalah sintaks yang agak baru Ia tidak mempunyai kata kunci ini sendiri Sebaliknya, fungsi anak panah ini menghala ke objek skop yang mengandunginya statik; 2. Fungsi Anak panah tidak boleh digunakan sebagai pembina 3. Fungsi anak panah tidak boleh digunakan sebagai kaedah.

1.rujukan ini 1.1 Mengapakah terdapat rujukan ini Mula-mula, mari tulis contoh kelas tarikh: publicclassclassCode{publicintyear;publicintmonth;publicintday;publicvoidsetDay(inty,intm,intd){year=y;month=m;day= d;}publicvoidprintDate (){System.out.println(year+"-"+month+"-"+day);}publicstatic

Bagaimanakah JavaScript mengubah penunjuk ini? Artikel berikut akan memperkenalkan kepada anda tiga kaedah untuk menukar penunjuk ini dalam JS. Saya harap ia akan membantu anda!
