一起学习理解vue源码
根据vue的官网介绍,可以得知vue是一个mvvm框架,且是响应式的。为了更深入了理解其内涵,本人以及理解实现了一个简单的mvvm学习的demo。下面分享给大家,欢迎大家一起讨论。
一、mvvm至少包含的内容
指令集合,如:text、model等
数据模型,与视图交互的数据
组件的支持:也就是部分html代码的动态更新
二、我的实现
1. 变量的定义与watch的实现
var directives = {}; //指令集合var vNodes = new Array(); //解析的Dom集合var dataModel = { name:"name", title: "title"}; //数据Modelvar Watch = { isInit: false, watchs: new Array(), run: function(newValue, expOrfn){ var self = this;if(!self.isInit){ expOrfn.call(vModel); }this.watchs.map(function(data,index){ data.nodes.map(function(d,i){if(self.isInit){ d.directive.init(newValue, d, data); //绑定初始化值, 以及初始化一些事件}else{ d.directive.update(newValue, d, data); //只更新值,此时run的调用来值value-set } }); }); self.watchs = []; }, push:function(watch){this.watchs.push(watch); } } //任务管理
说明:
Watch的push方法,用于依赖的添加,然后run来执行所以依赖,执行完成后,需要清理当前依赖的集合。在vue中依赖的收集是在dep中完成的,而watch提供的任务管理(不知道理解是否正确)
2. 指令的定义
directives.text = { init: function(value, vNode){ vNode.elm.textContent = value; }, update: function(value, vNode){ vNode.elm.textContent = value; } }//需要响应事件的怎么办directives.model ={ init: function(value, vNode, _watch){ vNode.elm.value = value; //判断自己发生的改变,不应该再改变自己 vNode.elm.addEventListener('keyup',function(evt){ vNode.model[_watch.key] = vNode.elm.value; }); }, update:function(){ } }
说明:
由于是demo学习示例,所以只定义了简单的text和model两个指定,text:用于数据的显示,而model用于input(输入框)的响应
3. vModel的生成
//转换vModel,暂支持一级var properties = Object.getOwnPropertyNames(dataModel);var vModel = {}, formSetting = false;for( var index in properties){ (function refreshData(_index){var key = properties[_index];var property = Object.getOwnPropertyDescriptor(dataModel, key);var setter = property.set;var getter = property.get;var _val = property.value;var _getter = function(){var val = getter ? getter.call(vModel) : _val;//收集依赖,与watch要分开 Watch.push({ key: key, nodes: vNodes.filter(function(data,index){return data.modelKey == key ? true : false; }), getter: _getter });return val; }; Object.defineProperty(vModel, key, { configurable: true, enumerable: true, set: function(value){if(setter){ setter.call(vModel, value); } //处理依赖 Watch.run(value, _getter);//this.value = value; }, get: _getter }) })(index); }
说明:
vModel是根据dataModel生成的,也就是自定义了每个属性的get和set方法,在es6中也可以用proxy实现(是否说对了)。
在属性set的时候,会先调用get方法来收集依赖。方便值改变后,能将所影响的内容都修改掉。
4. 解析dom为vNode
//解析vNodesvar app = document.getElementById('app'); app.childNodes.forEach(function(data,index){if(data.nodeType != 1) return;var hv = data.getAttribute('data-hv');var hvs = hv.split(','); hvs.forEach(function(item,row){var keyValue = item.split(':'); //vNode对象上一定要有model,这是方便vNode相应时候的找vModel vNodes.push({ directive: directives[keyValue[0]], modelKey: keyValue[1], model: vModel, elm: data }); }); });
说明:
这里说解析为vNode很是牵强,因为此只是收集了dom上data-hv指定的指令,并将对就的指令、元素、vModel等组成一个对象存储在vNodes中,以供vModel各属性的get方法收集依赖时引用。
5. 第一次初始化
//调用所有的get一次Watch.isInit = true;var _keys = Object.getOwnPropertyNames(vModel); _keys.map(function(key,data){var data = vModel[key]; Watch.run(data); }); Watch.isInit = false;
说明:
将初始化的vModel的值渲染到Dom上,这里是主动执行每个的get,然后运行watch.run方法。
此处设计和实现本人感觉与vue的思路不对,如有高人看见,麻烦提点与指引。
6. 被解析的dom
<div id="app"><span data-hv="text:title"></span><span data-hv="text:title"></span><input data-hv="model:title" /></div>
Atas ialah kandungan terperinci 一起学习理解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

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

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



Sebagai bahasa pengaturcaraan peringkat tinggi, bahasa Python mudah dipelajari, mudah dibaca dan ditulis, dan telah digunakan secara meluas dalam bidang pembangunan perisian. Walau bagaimanapun, disebabkan sifat sumber terbuka Python, kod sumber mudah diakses oleh orang lain, yang membawa beberapa cabaran kepada perlindungan kod sumber perisian. Oleh itu, dalam aplikasi praktikal, kita sering perlu mengambil beberapa kaedah untuk melindungi kod sumber Python dan memastikan keselamatannya. Dalam perlindungan kod sumber perisian, terdapat pelbagai amalan aplikasi untuk dipilih oleh Python. Di bawah adalah beberapa perkara biasa

Bagaimana untuk memaparkan kod sumber kod PHP dalam penyemak imbas tanpa ditafsir dan dilaksanakan? PHP ialah bahasa skrip sebelah pelayan yang biasa digunakan untuk membangunkan laman web dinamik. Apabila fail PHP diminta pada pelayan, pelayan mentafsir dan melaksanakan kod PHP di dalamnya dan menghantar kandungan HTML akhir kepada penyemak imbas untuk paparan. Walau bagaimanapun, kadangkala kami mahu memaparkan kod sumber fail PHP terus dalam penyemak imbas dan bukannya dilaksanakan. Artikel ini akan memperkenalkan cara untuk memaparkan kod sumber kod PHP dalam penyemak imbas tanpa ditafsir dan dilaksanakan. Dalam PHP, anda boleh menggunakan

Anda boleh menggunakan alat pembangun penyemak imbas untuk melihat kod sumber tapak web Dalam penyemak imbas Google Chrome: 1. Buka penyemak imbas Chrome dan lawati tapak web di mana anda ingin melihat kod sumber 2. Klik kanan di mana-mana di web halaman dan pilih "Periksa" atau tekan kekunci pintasan Ctrl + Shift + I untuk membuka alat pembangun 3. Dalam bar menu atas alat pembangun, pilih tab "Elemen" 4. Lihat sahaja kod HTML dan CSS daripada laman web tersebut.

Dengan memahami kod sumber rangka kerja Golang, pembangun boleh menguasai intipati bahasa dan mengembangkan fungsi rangka kerja. Mula-mula, dapatkan kod sumber dan biasakan diri dengan struktur direktorinya. Kedua, baca kod, jejak aliran pelaksanaan, dan fahami kebergantungan. Contoh praktikal menunjukkan cara menggunakan pengetahuan ini: cipta perisian tengah tersuai dan lanjutkan sistem penghalaan. Amalan terbaik termasuk pembelajaran langkah demi langkah, mengelakkan penampalan salin tanpa fikiran, menggunakan alatan dan merujuk kepada sumber dalam talian.

Vue boleh memaparkan kod sumber Kaedah melihat kod sumber dalam Vue ialah: 1. Dapatkan Vue melalui "git clone https://github.com/vuejs/vue.git" 2. Pasang dependensi melalui "npm i"; ; 3. Melalui " npm i -g rollup" untuk memasang rollup ;

Langkah-langkah untuk melihat kod sumber Tomcat dalam IDEA: 1. Muat turun kod sumber Tomcat; . Pembelajaran dan pengemaskinian berterusan 7. Gunakan alat dan pemalam 8. Mengambil bahagian dalam komuniti dan menyumbang. Pengenalan terperinci: 1. Muat turun kod sumber Tomcat Anda boleh memuat turun pakej kod sumber dari laman web rasmi Apache Tomcat Biasanya pakej kod sumber ini dalam format ZIP atau TAR, dsb.

Artikel ini meneroka analisis kod sumber dan pengoptimuman rangka kerja Go. Struktur kod sumber merangkumi empat pakej utama, yang melibatkan logik rangka kerja teras, konteks permintaan, pengikatan data dan pemaparan respons. Teknik pengoptimuman termasuk: 1. Gunakan pepohon penghalaan untuk mengoptimumkan pemprosesan laluan untuk meningkatkan kelajuan carian laluan dengan ketara. 2. Gunakan perisian tengah untuk caching dan pemampatan untuk mengurangkan beban pelayan dan masa tindak balas. 3. Elakkan melakukan operasi yang memakan masa dalam panggilan balik untuk mengekalkan tindak balas yang tinggi. 4. Dayakan pengelogan dan analisis permintaan perlahan untuk mengenal pasti kesesakan prestasi. 5. Kemas kini versi rangka kerja dengan kerap untuk memanfaatkan peningkatan prestasi terkini.

Ralat kod sumber PHP: Untuk menyelesaikan masalah ralat indeks, contoh kod khusus diperlukan Dengan perkembangan pesat Internet, pembangun sering menghadapi pelbagai masalah semasa menulis laman web dan aplikasi. Antaranya, PHP ialah bahasa skrip sebelah pelayan yang popular, dan ralat kod sumbernya merupakan salah satu masalah yang sering dihadapi oleh pembangun. Kadangkala, apabila kita cuba membuka halaman indeks tapak web, pelbagai mesej ralat akan muncul, seperti "InternalServerError", "Unde
