Jadual Kandungan
一、mvvm至少包含的内容
二、我的实现
1. 变量的定义与watch的实现
2. 指令的定义
3. vModel的生成
4. 解析dom为vNode
5. 第一次初始化
6. 被解析的dom
Rumah hujung hadapan web tutorial js 一起学习理解vue源码

一起学习理解vue源码

Jun 26, 2017 am 09:50 AM
Kod sumber faham

      根据vue的官网介绍,可以得知vue是一个mvvm框架,且是响应式的。为了更深入了理解其内涵,本人以及理解实现了一个简单的mvvm学习的demo。下面分享给大家,欢迎大家一起讨论。

一、mvvm至少包含的内容

  1. 指令集合,如:text、model等

  2. 数据模型,与视图交互的数据

  3. 组件的支持:也就是部分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);
    }
} //任务管理
Salin selepas log masuk

说明:

  1. 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(){

    }   
}
Salin selepas log masuk

说明:

  1. 由于是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);
}
Salin selepas log masuk

说明:

  1. vModel是根据dataModel生成的,也就是自定义了每个属性的get和set方法,在es6中也可以用proxy实现(是否说对了)。

  2. 在属性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
        });
    });
});
Salin selepas log masuk

说明:

  1. 这里说解析为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;
Salin selepas log masuk

说明:

  1. 将初始化的vModel的值渲染到Dom上,这里是主动执行每个的get,然后运行watch.run方法。

  2. 此处设计和实现本人感觉与vue的思路不对,如有高人看见,麻烦提点与指引。

6. 被解析的dom

<div id="app"><span data-hv="text:title"></span><span data-hv="text:title"></span><input data-hv="model:title" /></div>
Salin selepas log masuk

Atas ialah kandungan terperinci 一起学习理解vue源码. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

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

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Amalan aplikasi Python dalam perlindungan kod sumber perisian Amalan aplikasi Python dalam perlindungan kod sumber perisian Jun 29, 2023 am 11:20 AM

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? Bagaimana untuk memaparkan kod sumber kod PHP dalam penyemak imbas tanpa ditafsir dan dilaksanakan? Mar 11, 2024 am 10:54 AM

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

Laman web untuk melihat kod sumber dalam talian Laman web untuk melihat kod sumber dalam talian Jan 10, 2024 pm 03:31 PM

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.

Panduan komprehensif untuk mempelajari dan menggunakan kod sumber rangka kerja golang Panduan komprehensif untuk mempelajari dan menggunakan kod sumber rangka kerja golang Jun 01, 2024 pm 10:31 PM

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.

Bolehkah vue memaparkan kod sumber? Bolehkah vue memaparkan kod sumber? Jan 05, 2023 pm 03:17 PM

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 ;

Bagaimana untuk melihat kod sumber tomcat dalam idea Bagaimana untuk melihat kod sumber tomcat dalam idea Jan 25, 2024 pm 02:01 PM

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.

Analisis dan pengoptimuman kod sumber rangka kerja Golang Analisis dan pengoptimuman kod sumber rangka kerja Golang Jun 02, 2024 pm 04:54 PM

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: menyelesaikan masalah ralat indeks Ralat kod sumber PHP: menyelesaikan masalah ralat indeks Mar 10, 2024 am 11:12 AM

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

See all articles