Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÉîÈëVueʵÏÖÔ­Àí£¬ÊµÏÖÒ»¸öÏìӦʽ¿ò¼Ü
 
×÷ÕߣºLGD_Sunday
  2122  次浏览      30
  2019-12-16
 
±à¼­ÍƼö:
±¾ÎÄÖ÷ÒªÏêϸ½éÉÜÁËVueµÄÉúÃüÖÜÆÚ¡¢VueµÄÊý¾ÝÏìÓ¦¡¢VueµÄäÖȾÁ÷³ÌµÈµÈ£¬Ï£Íû¶ÔÄúÄÜÓÐËù°ïÖú¡£
±¾ÎÄÀ´×ÔÓÚ¼òÊé,ÓÉ»ðÁú¹ûÈí¼þDelores±à¼­ÍƼö¡£

ÔÚÇ°ÃæµÄÕ½ÚÖÐÎÒÃÇÒѾ­Ñ§Ï°ÁËVue.jsµÄ»ù´¡ÄÚÈݲ¢ÇÒÁ˽âÁËVue.jsµÄÔ´ÂëʵÏÖ£¬°üÀ¨£ºVueµÄÉúÃüÖÜÆÚ¡¢VueµÄÊý¾ÝÏìÓ¦¡¢VueµÄäÖȾÁ÷³ÌµÈµÈ£¬ÔÚÕâÒ»Õ½ÚÎÒÃÇ»áºÍ´ó¼ÒÒ»ÆðȥʵÏÖÒ»¸öÏìӦʽµÄ¿ò¼Ü -- MVue£¬MVue »á×ñÑ­VueµÄ´úÂëÂß¼­ºÍʵÏÖ˼·£¬ÎÒÃÇÏ£ÍûÄܹ»½èÖúMVueÀ´Èôó¼Ò¸üºÃµÄÀí½âÕû¸öVueµÄºËÐÄ˼Ï룺ÏìӦʽÊý¾ÝäÖȾ¡£

ÔÚ¿ªÊ¼ÎÒÃǵÄMVue¿ª·¢Ö®Ç°£¬ÎÒÃÇÐèÒªÏÈÁ˽âһЩ±Ø±¸µÄ֪ʶ¡£Ê×ÏÈÊÇObject.defineProperty(obj, prop, descriptor)£¬Õâ¸ö·½·¨¿ÉÒÔÓÃÀ´¶¨Òå¶ÔÏóµÄÊôÐÔÃèÊö·û£¬ÎÒÃÇ¿ÉÒÔµã»÷ÕâÀïÀ´²é¿´Õâ¸ö·½·¨µÄÏêϸ¶¨Òå¡£ÎÒÃÇÕâÀïÖ÷ҪʹÓõ½µÄÊÇget¡¢setÃèÊö·û£¬ÎÒÃÇ¿ÉÒÔʹÓÃget¡¢setÀ´¼àÌý¶ÔÏóµÄÊôÐÔsetter¡¢getterµÄµ÷ÓÃʼþ¡£ÎÒÃÇ¿´Ò»ÏÂÏÂÃæµÄÕâ¶Î´úÂ룺

<div>
<input type="text" id="input-msg">
<p id="output-msg"></p>
</div>
<script>
var obj = {
msg: 'hello'
};
var key = 'msg';
var val = obj[key];


Object.defineProperty
(obj, key,{
enumerable: true,
configurable: true,
set: function (newValue){
val = newValue;
console.log('setter');
},
get: function () {
console.log('getter');
return val;
}
})
</script>

ÔÚÉÏÃæµÄ´úÂëÖÐÎÒÃÇÀûÓÃObject.defineProperty¼àÌýÁËobj.msgµÄsetter¡¢getterʼþ¡£ËùÓе±ÎÒÃÇÔÚ¿ØÖÆÌ¨È¥µ÷ÓÃobj.msgµÄʱºò¾Í»áµ÷ÓÃconsole.log('getter');£¬µ±ÎÒÃǵ÷ÓÃobj.msg = '123' µÄʱºò¾Í»áµ÷ÓÃconsole.log('setter');£¬ÓÉ´ËÎÒÃǾͳɹ¦µÄ¼àÌýÁËobj.msgµÄÊý¾Ý±ä»¯¡£ÄÇôÕâÓÐʲôÒâÒåÄØ£¿ÎÒÃÇ¿ÉÒÔÀûÓÃÕâ¸ö¹¦ÄÜÀ´×öÐ©Ê²Ã´ÄØ£¿ÎÒÃÇ¿´Ò»ÏÂÏÂÃæµÄ´úÂ룺

<div>
<input type="text" id="input-msg">
<p id="output-msg"></p>
</div>
<script>
var inputMsg = document.get
ElementById('input-msg'),
outputMsg = document.get
ElementById('output-msg');
var obj = {
msg: 'hello'
};
var key = 'msg';
var val = obj[key];
Object.defineProperty
(obj,key£¬{
enumerable: true,
configurable: true,
set: function (newValue) {
val = newValue;
outputMsg.innerText = obj[key];
},
get: function () {
console.log('getter');
return val;
}
});
inputMsg.addEventListener
('input', function (event){
var newVal = event.target.value;
obj[key] = newVal;
});
</script>

ÔÚÉÏÃæµÄ´úÂëÖУ¬ÎÒÃÇͨ¹ý¼àÌýinputµÄinputʼþÀ´È¥¸Ä±äobj[key]µÄÖµ£¬Ê¹obj[key]µÄֵʼÖÕµÈÓÚÓû§ÊäÈëµÄÖµ£¬µ±obj[key]µÄÖµÒòΪÓû§µÄÊäÈë¶ø·¢ÉúÁ˸ıäµÄʱºò£¬»á¼¤»îObject.definePropertyÖеÄsetterʼþ£¬È»ºóÎÒÃÇ»ñÈ¡µ½×îеÄobj[key]µÄÖµ²¢°ÑËü¸³Öµ¸øoutputMsg¡£ÕâÑùµ±ÎÒÃÇÔÚinputÖнøÐÐÊäÈëµÄʱºò£¬

ÖеÄÖµÒ²»á¸úËæÎÒÃǵÄÊäÈë±ä»¯¡£ÕâÖÖͨ¹ýObject.definePropertyÀ´¼àÌýÊý¾Ý±ä»¯µÄ·½Ê½¾ÍÊÇVueÖÐÊý¾ÝÏìÓ¦µÄºËÐÄ˼Ïë¡£

Æä´Î´ó¼ÒÐèÒªÁ˽âµÄ¾ÍÊǹ۲ìÕßģʽ£¬´ó¼Ò¿ÉÒÔµã»÷ÕâÀïÀ´²é¿´¹Û²ìÕßģʽµÄÏêϸ½âÊÍ£¬ÏàÐÅÕâÀï»á±ÈÎÒ½âÊ͵ĸü¼ÓÇå³þ¡£

µ±´ó¼ÒÁ˽âÍê¹Û²ìÕßģʽ֮ºóÎÒÃǾͿÉÒÔÕýʽ¿ªÊ¼ÎÒÃǵÄMVueµÄ¿ª·¢¹¤×÷¡£

˼·ÕûÀí

Õû¸ö¿ò¼ÜµÄ˼·±»·Ö³ÉÈý´ó¿é¡£

Ê×ÏȾÍÊÇÊÓͼäÖȾ£¬ÎÒÃÇÔÚhtml»òÕß< template >< /template >ÖнøÐÐhtmlÄÚÈݱàдµÄʱºò£¬ÍùÍùÊÇÕâÑù£º

<div id="app">
<input type="text" v-model='msg'>
<div>
<p>{{msg}}</p>
</div>
</div>

ÆäÖеÄv-model='msg' ºÍ {{msg}} ä¯ÀÀÆ÷ÊÇÎÞ·¨½âÎöµÄ£¬ÄÇôÎÒÃǾÍÐèÒª°Ñ ä¯ÀÀÆ÷²»ÈÏʶµÄÄÚÈÝת»¯Îªä¯ÀÀÆ÷¿ÉÒÔ½âÎöµÄÄÚÈÝ£¬ÔÚVueÖУ¬Vueͨ¹ýÐéÄâDOM£¨VNode£©ÃèÊöÕæÊµDOM£¬È»ºóͨ¹ý_updateÀ´½øÐоßÌåäÖȾ¡£ÎÒÃÇÕâÀﲻȥÃèÊöÕâ¸öVNodeÖ±½Óͨ¹ý_update·½·¨À´¶ÔDOM½øÐÐäÖȾ²Ù×÷£¬Õâ¸ö¶¯×÷ÊÇ·¢ÉúÔÚCompileÖС£Compile»á½âÎöÎÒÃǵľßÌåÖ¸Á²¢ÖØÐÂäÖȾDOM¡£

Æä´ÎÊǼàÌýÎÒÃǵÄÊý¾Ý±ä»¯£¬ÔÚ×î³õµÄÀý×ÓÖÐÎÒÃÇÒѾ­ÖªµÀÎÒÃÇ¿ÉÒÔͨ¹ýObject.defineProperty(obj, prop, descriptor)À´ÊµÏÖÊý¾ÝµÄ¼àÌý£¬ÄÇô¾ÍÐèÒªÒ»¸öObserverÀàÀ´½øÐÐÊý¾Ý½Ù³ÖµÄ¹¤×÷£¬ÕâʱObserver³Ðµ£µÄ¾ÍÊÇ·¢²¼ÕߵŤ×÷¡£µ±ÎÒÃÇͨ¹ýObserverÀ´¼àÌýµ½Êý¾Ý±ä»¯Ö®ºó£¬ÎÒÃÇÐèҪ֪ͨÎÒÃǵĹ۲ìÕߣ¬µ«ÊǶÔÓÚÎÒÃǵķ¢²¼ÕßÀ´Ëµ£¬Ëü²¢²»ÖªµÀË­ÊÇÕâ¸ö¹Û²ìÕߣ¬Õâ¸ö¹Û²ìÕßÊÇÒ»¸ö»¹ÊǶà¸ö£¿ËùÒÔÕâ¸öʱºò£¬¾ÍÐèÒªÓÐÒ»¸öÈËÀ´¸ºÔðÈ¥ÊÕ¼¯ÕâЩÒÀÀµµÄ¹¤×÷£¬Õâ¸öÈ˾ÍÊÇDep£¨Dependency£©£¬ÎÒÃÇͨ¹ýDepÀ´È¥Í¨Öª¹Û²ìÕßWatcher£¬Watcher¶©ÔÄDep£¬Dep³ÖÓÐWatcher£¬Á½Õß»¥ÏàÒÀÀµÐγÉÒ»¸öÏûÏ¢ÖÐתվ¡£µ±Watcher½ÓÊÕµ½ÏûÏ¢£¬ÐèÒª¸ü¸ÄÊÓͼµÄʱºò£¬ÄÇô¾Í»á·¢²¼¾ßÌåµÄÏûÏ¢¸ù¾Ý¾ßÌåÖ¸ÁîµÄ²»Í¬£¨Directive£©À´Ö´ÐоßÌåµÄ²Ù×÷Patch¡£Õâ¾ÍÊÇÎÒÃǵÄÕû¸ö´Ó¼àÌýµ½äÖȾµÄ¹ý³Ì£¬ÈçÏÂͼ£º

×îºóÎÒÃÇÐèÒª°ÑËùÓеĶ«Î÷ÕûºÏÆðÀ´ÐγÉÒ»¸öÈë¿Úº¯Êý£¬Êä³ö¸øÓû§·½±ãÓû§½øÐе÷Ó㬾ͺÃÏñVueÖеÄnew Vue({})²Ù×÷£¬ÕâÀïÎÒÃǽÐËüMVue¡£

×ÛºÏÒÔÉϵÄÄÚÈÝ£¬ÎÒÃÇÐèÒªÍê³ÉµÄ´úÂëÄÚÈݰüÀ¨

©À©¤©¤ compile.js äÖȾDOM£¬½âÎöÖ¸Áî
©À©¤©¤ dep.js ÊÕ¼¯ÒÀÀµ
©À©¤©¤ directive.js ËùÓÐÖ§³Öµ½µÄÖ¸Áî
©À©¤©¤ mvue.js Èë¿Úº¯Êý
©À©¤©¤ observer.js Êý¾Ý½Ù³Ö
©À©¤©¤ patch.js ¸ù¾Ý¾ßÌåµÄÖ¸ÁîÀ´ÐÞ¸ÄäÖȾµÄÄÚÈÝ
©¸©¤©¤ watcher.js ¹Û²ìÕß¡£¶©ÔÄDep£¬·¢²¼ÏûÏ¢

ÎÒÃÇÔ¤ÆÚµÄÍê³ÉЧ¹ûÓ¦¸ÃÊÇÕâÑù

<div id="app">
<input type="text" v-model='msg'>
<div>
<p>{{msg}}</p>
</div>
</div>
<script>
var vm = new MVue({
el: '#app',
data: {
msg: 'hello'
}
});
</script>

Èë¿Úº¯Êý

Ê×ÏÈÎÒÃÇÐèÒªÏÈÉú³ÉMVueµÄÈë¿Úº¯Êý£¬ÎÒÃÇ·ÂÕÕVueµÄд·¨£¬´´½¨Ò»¸öMVueµÄÀ࣬²¢»ñÈ¡´«ÈëµÄoptions¡£

function MVue (options){
this.$options = options;
this._data = options.data||{};
}
MVue.prototype = {
_getVal: function (exp){
return this._data[exp];
},


_setVal: function (exp, newVal){
this._data[exp] = newVal;
}
}

Ê×ÏÈÎÒÃÇʵÏÖÒ»¸öMVueµÄ¹¹Ô캯Êý£¬²¢ÎªËüÌṩÁËÁ½¸ö˽ÓеÄÔ­ÐÍ·½·¨_getValºÍ_setValÓÃÓÚ»ñÈ¡ºÍÉèÖÃdataÖжÔÓ¦keyµÄÖµ¡£ÕâʱÎÒÃǾͿÉÒÔͨ¹ýÏÂÃæµÄ´úÂëÀ´´´½¨¶ÔÓ¦µÄMVueʵÀý¡£

var vm = new MVue({
el: '#app',
data: {
msg: 'hello'
}
});

È»ºóÎÒÃǾͿÉÒÔÔÚMVueµÄ¹¹Ô캯ÊýÖ®ÖÐÈ¥½øÐÐÎÒÃÇµÄ ÊÓͼäÖȾ ºÍ Êý¾Ý¼àÌý µÄ²Ù×÷¡£

ÊÓͼäÖȾ

È»ºóÎÒÃǽøÐÐÎÒÃǵÄÊÓͼäÖȾ£¬ÎÒÃÇÔÙÀ´»Ø¹ËÒ»ÏÂÎÒÃÇÐèÒª½âÎöµÄÊÓͼ½á¹¹

<div id="app">
<input type="text" v-model='msg'>
<div>
<p>{{msg}}</p>
</div>
</div>

ÔÚÕâ¶ÎhtmlÖ®ÖÐv-modelºÍ{{msg}}ÊÇÎÒÃÇMVueÖеÄ×Ô¶¨ÒåÖ¸ÁÕâЩָÁîÎÒÃǵÄä¯ÀÀÆ÷ÊÇÎÞ·¨½âÎöµÄ£¬ËùÒÔÐèÒªÎÒÃǰÑÕâЩָÁî½âÎöΪä¯ÀÀÆ÷¿ÉÒÔ½âÎöµÄhtml´úÂë¡£ÒÔ< p >{{msg}}< /p >ΪÀý£¬µ±ÎÒÃÇÉùÃ÷data: {msg: 'hello'}µÄʱºò£¬Ó¦½âÎöΪ< p >hello< /p >¡£

ÎÒÃǵÄÄ£°å½âÎöµÄ²Ù×÷ÊÇͨ¹ýcompile.jsÀ´Íê³ÉµÄ¡£

function Compile (vm, el) {
this.$vm = vm;
el = this.$el = this.isElementNode(el)
el : document.querySelector(el);
if (!el) {
return;
}
this._update(el);
};
Compile.prototype = {
/**
* VueÖÐʹÓÃvm._renderÏȸù¾ÝÕæÊµDOM´´½¨ÁË
ÐéÄâDOM£¬È»ºóÔÚvm._update
°ÑÐéÄâDOMת»¯ÎªÕæÊµDOM²¢äÖȾ,
* ÎÒÃÇÕâÀïûÓÐÐéÄâDOM£¬ËùÒÔÖ±½Óͨ¹ý
createElm·½·¨´´½¨Ò»¸öfragmentÓÃÒÔäÖȾ
*/
_update: function (el) {
this.$fragment = document.
createDocumentFragment();
// ¸´ÖÆelµÄÄÚÈݵ½´´½¨µÄfragment
this.createElm(el);
// °Ñ½âÎöÖ®ºóµÄfragment·ÅÈëelÖУ¬
´ËʱfragmentÖеÄËùÓÐÖ¸ÁîÒѾ­±»½âÎö
Ϊ¾ßÌåÊý¾Ý
el.appendChild(this.$fragment);
},
/**
* ´´½¨ÐµÄDOM ÓÃÀ´Ìæ»» Ô­DOM
*/
createElm: function (node) {
var childNode = node.firstChild;
if (childNode) {
this.$fragment.appendChild(childNode);
this.createElm(node);
}
}
}

ÎÒÃÇÉùÃ÷ÁËÒ»¸öCompileµÄ¹¹Ôì·½·¨£¬²¢µ÷ÓÃÁËËüµÄ_updateÔ­Ðͺ¯Êý£¬ÔÚ_updateÖÐÎÒÃÇÉùÃ÷ÁËÒ»¸öfragmentÓÃÓÚ³ÐÔØ½âÎöÖ®ºóµÄÄ£°åÄÚÈÝ£¬Í¨¹ýcreateElmµÄµÝ¹éµ÷ÓûñÈ¡elÖеÄÔªËØ£¬²¢°Ñ»ñÈ¡³öµÄÔªËØ·ÅÈëfragmentÖУ¬×îºó°ÑfragmentÌí¼Óµ½elÀïÃæ¡£ÖÁ´ËÎÒÃÇÒѾ­³É¹¦µÄ»ñÈ¡µ½ÁËelÖеÄÔªËØ£¬²¢°ÑÕâÐ©ÔªËØÖØÐ¹æÖÆ¡£

½ÓÏÂÀ´ÎÒÃǾÍÐèÒª¶Ô»ñÈ¡³öÀ´µÄÔªËØ½øÐнâÎö²Ù×÷£¬Æäʵ¾ÍÊǶÔv-modelºÍ{{*}}µÈÖ¸Áî½øÐнâÎö£¬Õâ¸ö½âÎöµÄʱ»úÓ¦¸ÃÔÚ ±éÀú³öËùÓеÄÔªËØÖ®ºó£¬Ìí¼Ófragmentµ½el֮ǰ¡£ÎÒÃÇ¿´Ò»Ï½âÎöDOMµÄ´úÂ룺

Compile.prototype = {
_update: function (el) {
...
// ½âÎö±»´´½¨Íê³ÉµÄfragment£¬
´ËʱfragmentÒѾ­ÓµÓÐÁËelÄÚËùÓеÄÔªËØ
this.compileElm();
...
},
...
/**
* ¶ÔDOM½øÐнâÎö
*/
compileElm: function (childNodes){
var reg = /\{\{(.*)\}\}/;
if (!childNodes) {
childNodes = this.$fragment.childNodes;
}
[].slice.call(childNodes).
forEach(node => {
if (node.childNodes.length > 0) {
// µü´úËùÓеĽڵã
this.compileElm(node.childNodes);
}
// »ñÈ¡elementNode½Úµã
if (this.isElementNode(node)) {
if (reg.test(node.textContent)) {
// Æ¥Åä {{*}}
this.compileTextNode(node, RegExp.$1);
}
// Æ¥ÅäelementNode
this.compileElmNode(node);
}
});
},
/**
* ½âÎöelementNode£¬»ñÈ¡elmµÄ
ËùÓÐÊôÐÔÈ»ºó±ãÀû£¬¼ì²éÊôÐÔÊÇ·ñ
ÊôÓÚÒѾ­×¢²áµÄÖ¸Áî,
* Èç¹û²»ÊÇÎÒÃǵÄ×Ô¶¨ÒåÖ¸Á
ÄÇô¾Í²»ÐèҪȥ´¦ÀíËüÁË
* Èç¹ûÊÇÒÑ×¢²áµÄÖ¸Á
ÎÒÃǾͽ»¸ødirectiveÈ¥´¦Àí¡£
£¨ÑÝʾֻÓÐÒ»¸öv-model£©
*/
compileElmNode: function (node) {
var attrs = [].slice.call
(node.attributes),
$this = this;
attrs.forEach(function (attr) {
if (!$this.isDirective(attr.nodeName)){
return;
}

var exp = attr.value;
// Æ¥Åäv-modelÖ¸Áî
directives.model($this.$vm, node, exp);
// È¥µô×Ô¶¨ÒåÖ¸Áî
node.removeAttribute(attr.name);
});
},
/**
* ½âÎö{{*}}
*/
compileTextNode: function (node, exp){
directives.text(this.$vm, node, exp);
},
/**
* ÅжÏÊÇ·ñÊÇÒÑ×¢²áµÄÖ¸Á
ÕâÀï¾ÍÅжÏÊÇ·ñ°üº¬ v-
*/
isDirective: function (attrNodeName) {
return attrNodeName.indexOf('v-') === 0;
},
/**
* ÅжÏelmNode½Úµã
*/
isElementNode: function (node) {
return node.nodeType === 1;
}
}

ÓÉÉÏÃæµÄ´úÂë¿ÉÒÔ¿´³ö£¬½âÎöµÄ²Ù×÷Ö÷ÒªÔÚcompileElm·½·¨ÖнøÐУ¬Õâ¸ö·½·¨Ê×ÏÈ»ñÈ¡µ½fragmentµÄchildNodes£¬È»ºó¶ÔchildNodes½øÐÐÁËforEach²Ù×÷£¬Èç¹ûÆäÖеÄnode»¹ÓÐ×Ó½ÚµãµÄ»°£¬Ôò»áÔٴε÷ÓÃcompileElm·½·¨£¬È»ºó½âÎöÕâ¸önode£¬Èç¹ûÊÇÒ»¸öElementNode½Úµã£¬ÔòÔÙÈ¥ÅжÏÊÇ·ñΪ{{*}}Ë«´óÀ¨ºÅ½á¹¹£¬Èç¹ûÊÇÔò»áÖ´ÐÐcompileTextNodeÀ´½âÎö{{*}}£¬È»ºóͨ¹ýcompileElmNodeÀ´½âÎöElmNodeÖеÄÖ¸Áî¡£

compileTextNodeÖеÄʵÏֱȽϼòµ¥£¬Ö÷ÒªÊǵ÷ÓÃÁËdirectives.text(vm, node, exp)½øÐнâÎö£¬ÕâÀïÎÒÃÇÉÔºóÔÙ¿´£¬ÎÒÃÇÏÈÖ÷ÒªÀ´¿´ÏÂcompileElmNode×öÁËʲô¡£

compileElmNodeÊ×ÏȰÑnodeÖÐËùÓеÄÊôÐÔת³ÉÁËÊý×é²¢¿½±´¸øÁËattrs£¬È»ºó¶Ôattrs½øÐбéÀú»ñÈ¡ÆäÖеÄÖ¸ÁÒòΪÎÒÃÇĿǰֻÓÐÒ»¸öv-modelÖ¸ÁËùÒÔÎÒÃDz»ÐèÒªÔÚ¶ÔÖ¸Áî½øÐÐÅжϣ¬¿ÉÒÔÖ±½Óµ÷ÓÃdirectives.model(vm, node, exp)À´½øÐÐv-modelµÄÖ¸Áî½âÎö£¬×îºóÔÚDOMÖÐɾ³ýÎÒÃǵÄ×Ô¶¨ÒåÖ¸Áî¡£

ÖÁ´ËÎÒÃǾ͸´ÖÆÁËelµÄËùÓÐÔªËØ£¬²¢¸ù¾Ý²»Í¬µÄÖ¸Áî°ÑËüÃǽ»ÓÉdirectivesÖжÔÓ¦µÄÖ¸Áî½âÎö·½·¨½øÐнâÎö£¬Õâ¾ÍÊÇÎÒÃÇcompile.jsÖÐËù×öµÄËùÓÐÊÂÇé¡£½ÓÏÂÀ´ÎÒÃÇ¿´Ò»ÏÂdirectivesÊÇÈçºÎ½øÐÐÖ¸Áî½âÎö²Ù×÷µÄ£¬´úÂëÈçÏ£º

// directives.js
/**
* Ö¸ÁºÍ
*
* v-model
*/
var directives = {
/**
* Á´½Ópatch·½·¨£¬
½«Ö¸Áîת»¯ÎªÕæÊµµÄÊý¾Ý²¢Õ¹Ê¾
*/
_link: function (vm, node, exp, dir) {
var patchFn = patch(vm, node, exp, dir);
patchFn && patchFn(node, vm._getVal(exp));
},
/**
* v-modelʼþ´¦Àí£¬ÕâÀïµÄv-model
Ö»Õë¶ÔÁË<input type='text'>
*/
model: function (vm, node, exp) {
this._link(vm, node, exp, 'model');

var val = vm._getVal(exp);
node.addEventListener('input',
function (e) {
var newVal = e.target.value;
if (newVal === val) return;
vm._setVal(exp,newVal);
val = newVal;
});
},
/**
* {{}}ʼþ´¦Àí
*/
text: function (vm, node, exp) {
this._link(vm, node, exp, 'text');
}
}

ÓÉÉÏÃæµÄ´úÂëÎÒÃÇ¿ÉÒÔ¿´³ö£¬ÎÒÃÇÊ×Ïȶ¨ÒåÁËÒ»¸ödirectives±äÁ¿£¬Ëü°üº¬ÁË_link¡¢model¡¢textÈý¸öÖ¸Áî·½·¨£¬ÆäÖÐ_linkΪ˽Óз½·¨£¬model¡¢textΪ¹«¿ªµÄÖ¸Áî·½·¨£¬¹ØÓÚ_linkÎÒÃÇ×îºóÔÚ·ÖÎö£¬ÎÒÃÇÏÈÀ´¿´Ò»ÏÂmodel¡£

modelÖ¸Áî·½·¨¶ÔÓ¦µÄΪv-modelÖ¸ÁËü½ÓÊÜÈý¸ö²ÎÊý£¬vmΪÎÒÃǵÄMVueʵÀý£¬nodeΪ°ó¶¨¸ÃÖ¸ÁîµÄ¶ÔÓ¦½Úµã£¬expΪ°ó¶¨Êý¾ÝµÄkey¡£ÎÒÃÇÏȲ»È¥¹Üthis._linkµÄµ÷Ó㬴ó¼ÒÏÈÀ´ÏëÒ»ÏÂÎÒÃÇÔÚindex.htmlÖжÔÓÚv-modelµÄʹÓã¬ÎÒÃǰÑv-model='msg'°ó¶¨µ½ÁËÎÒÃǵÄinput±êÇ©ÉÏ£¬ÒâΪµ±ÎÒÃÇÔÚinputÉϽøÐÐÊäÈëµÄʱºòmsgʼÖÕµÈÓÚÎÒÃÇÊäÈëµÄÖµ¡£ÄÇôÎÒÃÇÔÚmodelÖ¸Áî·½·¨ÖÐËùÒª×öµÄÊÂÇé¾ÍºÜÃ÷È·ÁË£¬Ê×ÏÈÎÒÃÇͨ¹ývm._getVal(exp);»ñÈ¡µ½msgµ±Ç°Öµ£¬È»ºóÎÒÃǼàÌýÁËnodeµÄinputʼþ£¬»ñÈ¡µ±Ç°Óû§ÊäÈëµÄ×îÐÂÖµ£¬È»ºóͨ¹ývm._setVal(exp,newVal)ÅäÖõ½vm._dataÖУ¬×îºóͨ¹ýval = newValÖØÐÂÉèÖÃvalµÄÖµ¡£

È»ºóÊÇtextÖ¸Áî·½·¨£¬Õâ¸ö·½·¨Ö±½Óµ÷ÓÃÁËthis._link£¬²¢ÇÒÎÒÃÇ»¹¼ÇµÃÔÚmodelÖ¸Áî·½·¨ÖÐÒ²µ÷ÓÃÁËthis._link£¬ÄÇôÎÒÃÇÀ´¿´Ò»ÏÂ_linkµÄʵÏÖ¡£

ÔÚ_linkÖУ¬Ëû½ÓÊÕËĸö²ÎÊý£¬ÆäÖÐdirΪÎÒÃǵÄÖ¸Áî´úÂ룬ȻºóËüµ÷ÓÃÁËÒ»¸öpatch·½·¨£¬»ñÈ¡µ½ÁËÒ»¸öpatchFnµÄ±äÁ¿£¬Õâ¸öpatch·½·¨Î»ÓÚpatch.jsÖС£

// patch.js
/**
* ¸ü¸Änode value£¬ÔÚ±àÒë֮ǰ£¬
Ìæ»» v-model {{*}} ÎªÕæÊµÊý¾Ý
* @param {*} vm
* @param {*} node
* @param {*} exp
* @param {*} dir
*/
function patch
(vm, node, exp, dir) {
switch (dir) {
case 'model':
/**
* input / textear
*/
return function (node , val){
node.value = typeof val
=== 'undefined' ? '' : val;
}
case 'text':
/**
* {{*}}
*/
return function (node , val) {
node.textContent = typeof val
=== 'undefined' ? '' : val;
}
}
}

patchµÄ·½·¨ÊµÏֱȽϼòµ¥£¬ËüÊ×ÏÈÈ¥ÅжÏÁË´«ÈëµÄÖ¸ÁȻºó¸ù¾Ý²»Í¬µÄÖ¸Áî·µ»ØÁ˲»Í¬µÄº¯Êý¡£±ÈÈçÔÚmodelÖ¸Áî·½·¨ÖУ¬ÒòΪÎÒÃÇÖ»Ö§³Öinput¡¢ textear£¬ËùÒÔÎÒÃǽÓÊÕµ½µÄnodeÖ»»áÊÇËüÃÇÁ½¸öÖеÄÒ»¸ö£¬È»ºóÎÒÃÇͨ¹ýnode.value = valÀ´¸Ä±änodeÖеÄvalue¡£

ÎÒÃÇÔÚdirectives.jsÖлñÈ¡µ½ÁËpatchµÄ·µ»Øº¯ÊýpatchFn£¬È»ºóÖ´ÐÐpatchFn¡£ÖÁ´ËÎÒÃǵÄÄ£°åÒѾ­±»½âÎöΪä¯ÀÀÆ÷¿ÉÒÔ¶Á¶®µÄhtml´úÂë¡£

<div id="app">
<input type="text">
<div>
<p>hello</p>
</div>
</div>

Êý¾Ý¼àÌýʵÏÖ

È»ºóÎÒÃÇÀ´¿´Ò»Ï Êý¾Ý¼àÌýÄ£¿éµÄʵÏÖ £¬ÎÒÃǸù¾ÝÉÏÃæµÄ ˼·ÕûÀí ÏëÒ»ÏÂÕâ¸öÊý¾Ý¼àÌýÓ¦¸ÃÈçºÎȥʵÏÖ£¿ÎÒÃÇÖªµÀÁËÎÒÃÇÓ¦¸ÃÔÚobserverÀïÃæÈ¥ÊµÏÖËü£¬µ«ÊǾßÌåÓ¦¸ÃÔõô×öÄØ£¿

ÔÙÀ´Ã÷È·Ò»ÏÂÎÒÃǵÄÄ¿±ê£¬ÎÒÃÇÏ£Íû ͨ¹ýobserverÄܹ»¼àÌýµ½ÎÒÃÇÊý¾ÝdataµÄ±ä»¯£¬µ±ÎÒÃǵ÷ÓÃdata.msg»òÕßdata.msg = '123'µÄʱºò£¬»á·Ö±ð¼¤»îgetter»òÕßsetter·½·¨¡£ÄÇôÎÒÃǾÍÐèÒª¶ÔÕû¸ödata½øÐмàÌý£¬µ±ÎÒÃÇ»ñÈ¡µ½data¶ÔÏóÖ®ºó£¬À´±éÀúÆäÖеÄËùÓÐÊý¾Ý£¬²¢·Ö±ðΪËüÃÇÌí¼ÓÉÏgetterºÍsetter·½·¨¡£

// observer.js
function observer (value) {
if (typeof value !== 'object'){
return;
}
var ob = new Observer(value);
}
function Observer (data) {
this.data = data;
this.walk();
}
Observer.prototype = {
walk: function () {
var $this = this;
var keys = Object.keys
(this.data);
keys.forEach(function (key) {
$this.defineReactive(key,
$this.data[key]);
});
},
defineReactive: function
(key, value) {
var dep = new Dep();
Object.defineProperty
(this.data, key, {
enumerable: true,
configurable: true,
set: function (newValue) {
if (value === newValue) {
return;
}
value = newValue;
dep.notify();
},
get: function () {
dep.depend();
return value;
}
});
},
}

ÔÚobserver.jsÖÐÎÒÃÇͨ¹ýobserver (value)·½·¨À´Éú³ÉObserver¶ÔÏ󣬯äÖд«ÈëµÄvalueΪdata: {msg: 'hello'}¡£È»ºóµ÷ÓÃObserverµÄÔ­ÐÍ·½·¨walk£¬±éÀúdataµ÷ÓÃdefineReactive£¬Í¨¹ýObject.definePropertyΪÿÌõÊý¾Ý¶¼Ìí¼ÓÉÏsetter¡¢getter¼àÌý£¬Í¬Ê±ÎÒÃÇÉùÃ÷ÁËÒ»¸öDep¶ÔÏó£¬Õâ¸öDep¶ÔÏó»á¸ºÔðÊÕ¼¯ÒÀÀµ²¢ÇÒÅÉ·¢¸üС£´ó¼Ò½áºÏÎÒÃǵÄ˼·ÕûÀíÏëһϣ¬ÎÒÃÇÓ¦¸ÃÔÚʲôʱºòÈ¥ÊÕ¼¯ÒÀÀµ£¿Ê²Ã´Ê±ºòÈ¥ÅÉ·¢¸üУ¿

µ±Óû§Í¨¹ýinput½øÐÐÊäÈëÐÞ¸ÄÊý¾ÝµÄʱºò£¬ÎÒÃÇÊDz»ÊÇÓ¦¸Ã¼°Ê±¸üÐÂÊÓͼ£¿ËùÒÔÔÚsetter·½·¨±»¼¤»îµÄʱºò£¬ÎÒÃÇÓ¦¸Ãµ÷ÓÃdep.notify()·½·¨£¬ÓÃÓÚÅÉ·¢¸üÐÂʼþ¡£

µ±ÎÒÃǵÄÊý¾Ý±»Õ¹Ê¾³öÀ´µÄʱºò£¬Ò²¾ÍÊÇÔÚgetterʼþ±»¼¤»îµÄʱºò£¬ÎÒÃÇÓ¦¸ÃÈ¥ÊÕ¼¯ÒÀÀµ£¬Ò²¾ÍÊǵ÷ÓÃdep.depend()·½·¨¡£

È»ºóÎÒÃÇÀ´¿´Ò»ÏÂDep·½·¨µÄʵÏÖ£¬ÔÚDep.jsÖС£

// Dep.js
var uid = 0;
function Dep () {
// ³ÖÓеÄwatcher¶©ÔÄÕß
this.subs = [];
this.id = uid++;
}
Dep.prototype = {
// ʹdepÓëwatcher»¥Ïà³ÖÓÐ
depend () {
// Dep.targetΪwatcherʵÀý
if (Dep.target) {
Dep.target.addDep(this)
}
},
// Ìí¼Ówatcher
addSub: function (sub) {
this.subs.push(sub);
},
// ֪ͨËùÓеÄwatcher½øÐиüÐÂ
notify: function () {
this.subs && this.subs.
forEach(function (sub) {
sub.update();
});
}
}

Dep.jsµÄʵÏֱȽϼòµ¥£¬ËüÖ÷ÒªÊǾ͸ºÔðÊÕ¼¯ÒÀÀµ£¨watcher£©²¢ÇÒÅÉ·¢¸üУ¨watcher.update()£©£¬ÎÒÃÇ¿ÉÒÔ¿´µ½DepÊ×ÏÈÉùÃ÷ÁËsubsÓÃÓÚ±£´æ¶©ÔÄÁËDepµÄwatcherʵÀý£¬È»ºó¸øÃ¿¸öDepʵÀý´´½¨ÁËÒ»¸öid£¬È»ºóÎÒÃÇΪDepÉùÃ÷ÁËÈý¸öÔ­ÐÍ·½·¨£¬µ±µ÷ÓÃnotifyµÄʱºò£¬Dep»ØÈ¥±éÀúËùÓеÄsubsÈ»ºóµ÷ÓÃËûµÄupdate()·½·¨£¬µ±µ÷ÓÃdependµÄʱºò»áµ÷ÓÃwatcherµÄaddDep·½·¨Ê¹DepÓëWatcher»¥Ïà³ÖÓС£ÆäÖеÄDep.targetºÍsub¶¼ÎªWatcherʵÀý¡£

È»ºóÎÒÃÇÀ´¿´Ò»ÏÂWatcher.jsµÄ´úÂëʵÏÖ¡£

// watcher
function Watcher
(vm, exp, patchFn){
this.depIds = {};
this.$patchFn = patchFn;
this.$vm = vm;
this.getter = this.parsePath(exp)
this.value = this.get();
}
Watcher.prototype = {
// ¸üÐÂ
update: function () {
this.run();
},
// Ö´ÐиüвÙ×÷
run: function () {
var oldVal = this.value;
var newVal = this.get();
if (oldVal === newVal) {
return;
}
this.$patchFn.call
(this.$vm, newVal);
},
// ¶©ÔÄDep
addDep: function (dep) {
if (this.depIds.hasOwnProperty
(dep.id)) {
return;
}
dep.addSub(this);
this.depIds[dep.id] = dep;
},
// »ñÈ¡exp¶ÔÓ¦Öµ£¬
Õâʱ»á¼¤»îobserverÖеÄgetʼþ
get: function () {
Dep.target = this;
var value = this.getter.call
(this.$vm, this.$vm._data);
Dep.target = null;
return value;
},
/**
* »ñÈ¡expµÄ¶ÔÓ¦Öµ£¬Ó¦¶Ôa.b.c
*/
parsePath: function (path) {
var segments = path.split('.');
return function (obj) {
for (let i = 0;
i < segments.length; i++) {
if (!obj) return
obj = obj[segments[i]]
}
return obj
}
}
}

ÔÚWatcher.jsÖÐËüÖ±½Ó½ÓÊÕÁËpatchFn£¬´ó¼Ò»¹¼ÇµÃÕâ¸ö·½·¨ÊǸÉʲôµÄ°É£¿patchFnÊǸü¸Änode value£¬ÔÚ±àÒë֮ǰ£¬Ìæ»» v-model ¡¢ {{*}} ÎªÕæÊµÊý¾ÝµÄ·½·¨£¬ÔÚWatcher.js½ÓÊÕÁËpatchFn£¬²¢°ÑËü¸³Öµ¸øthis.$patchFn£¬µ±ÎÒÃǵ÷ÓÃthis.$patchFnµÄʱºò£¬¾Í»á¸Ä±äÎÒÃǵÄDOMäÖȾ¡£

È»ºóÎÒÃǵ÷ÓÃparsePathÓÃÓÚ½âÎö¶ÔÏóÊý¾Ý£¬²¢·µ»ØÒ»¸ö½âÎöº¯Êý£¬È»ºó°ÑËü¸³Öµ¸øthis.getter¡£×îºóÎÒÃǵ÷ÓÃget()·½·¨£¬ÔÚget()ÖÐÎÒÃǸøDep.target³ÖÓÐÁËWatcher£¬²¢¼¤»îÁËÒ»´Îgetter·½·¨£¬Ê¹ÎÒÃÇÔÚobserverÖмàÌýµÄgetterʼþ±»¼¤»î£¬»áµ÷ÓÃdep.depend()·½·¨£¬È»ºóµ÷ÓÃwatcher.addDep(dep)£¬Ê¹DepÓëWatcher»¥Ïà³ÖÓУ¬Ï໥ÒÀÀµ¡£

È»ºóÎÒÃÇ¿´Ò»ÏÂupdate·½·¨µÄʵÏÖ£¬ÎÒÃÇÖªµÀµ±Êý¾ÝµÄsetterʼþ±»¼¤»îµÄʱºò£¬»áµ÷ÓÃdep.notify(),dep.notify()ÓÖ»á±éÀúËùÓеĶ©ÔÄwatcherÖ´ÐÐupdate·½·¨£¬ÄÇôÔÚupadte·½·¨ÖУ¬Ö±½ÓÖ´ÐÐÁËthis.run£¬ÔÚrun()·½·¨ÖУ¬Ê×ÏÈ»ñÈ¡ÁË µ±Ç°watcherËù¹Û²ìµÄexpµÄ¸Ä±äǰֵoldValºÍÐ޸ĺóÖµnewVal£¬È»ºóͨ¹ýpatchFnÈ¥ÐÞ¸ÄDOM¡£

ÒÔÉϾÍÊÇÎÒÃÇÕû¸öÊý¾Ý¼àÌýµÄÁ÷³Ì£¬ËüÊ×ÏÈͨ¹ýobserverÀ´¼àÌýÊý¾ÝµÄ±ä»¯£¬È»ºóµ±Êý¾ÝµÄgetterʼþ±»¼¤»îµÄʱºò£¬µ÷ÓÃdep.depend()À´½øÐÐÒÀÀµÊÕ¼¯£¬µ±Êý¾ÝµÄsetterʼþ±»¼¤»îµÄʱºò£¬µ÷ÓÃdep.notify()À´½øÐÐÅÉ·¢¸üУ¬ÕâЩµÄ¾ßÌå²Ù×÷¶¼ÊÇÔÚÎÒÃǵĹ۲ìÕßwatcherÖÐÍê³ÉµÄ¡£

ÕûºÏMVue

×îºóÎÒÃǾÍÐèÒª°ÑÎÒÃÇµÄ ÊÓͼäÖȾ ºÍ Êý¾Ý¼àÌý Á´½ÓÆðÀ´£¬ÄÇôÕâ¸öÁ¬½ÓµÄ½ÚµãÓ¦¸ÃÔÚÄÄÀïÄØ£¿ÎÒÃÇÔÙÀ´ÞÛÒ»ÏÂÎÒÃǵÄÁ÷³Ì¡£

µ±Óû§±àдÁËÎÒÃǵÄÖ¸Áî´úÂë

<div id="app">
<inputtype="text" v-model='msg'>
<div>
<p>{{msg}}</p>
</div>
</div>

µÄʱºò£¬ÎÒÃÇͨ¹ýCompile½øÐнâÎö£¬µ±·¢ÏÖÁËÎÒÃǵÄ×Ô¶¨ÒåÖ¸Áîv-model¡¢{{*}}µÄʱºò£¬»á½øÐÐdirectives½øÐÐÖ¸Áî½âÎö£¬ÆäÖмàÌýµÄÓû§µÄÊäÈëʼþ£¬²¢µ÷ÓÃÁËvm._setVal()·½·¨£¬´Ó¶ø»á¼¤»îÔÚobserverÖж¨ÒåµÄsetterʼþ£¬setter»á½øÐÐÅÉ·¢¸üеIJÙ×÷£¬µ÷ÓÃdep.notify()·½·¨£¬È»ºó±ãÀûsubsµ÷ÓÃupdate·½·¨¡£

½áºÏÉÏÃæµÄÃèÊö£¬ÎÒÃÇÓ¦¸ÃÔÚÁ½¸öµØ·½È¥Íê³ÉÁ¬½Ó½Úµã¡£Ê×ÏÈÊÇÔÚµ÷ÓÃvm._setVal()·½·¨µÄʱºò£¬ÎÒÃÇÐèÒª±£Ö¤observerÖеÄsetterʼþ¿ÉÒÔ±»¼¤»î£¬ÄÇôÎÒÃÇ×îºÃÔÚÈë¿Úº¯ÊýÖÐÈ¥ÉùÃ÷Õâ¸öobserver£º

function MVue (options) {
this.$options = options;
this._data = options.data ||{};
observer(this._data);
new Compile(this,
this.$options.el);
}
MVue.prototype = {
_getVal: function (exp) {
return this._data[exp];
},
_setVal: function (exp, newVal){
this._data[exp] = newVal;
}
}

È»ºóµ±setterʼþ±»¼¤»î֮ǰ£¬ÎÒÃÇÐèÒª³õʼ»¯Íê³ÉwatcherʹÆäÓµÓÐvm¡¢exp¡¢patchFn,ÄÇô×îºÃµÄʱ»úÓ¦¸ÃÔÚ»ñÈ¡µ½patchFnÕâ¸ö·µ»Øº¯ÊýµÄʱºò£¬ËùÒÔÓ¦¸ÃÔÚ£º

var directives = {
_bind: function (vm, exp, patchFn){
new Watcher(vm,exp, patchFn);
},
/**
* Á´½Ópatch·½·¨£¬½«Ö¸Áîת»¯Îª
ÕæÊµµÄÊý¾Ý²¢Õ¹Ê¾
*/
_link: function
(vm, node, exp, dir) {
var patchFn = patch
(vm, node, exp, dir);
patchFn && patchFn
(node, vm._getVal(exp));
this._bind(vm, exp, function (value){
patchFn && patchFn(node, value);
});
},
...
}

ͨ¹ý_bind·½·¨À´È¥³õʼ»¯watcher¡£

ʹÓÃÓëÀ©Õ¹

ÖÁ´ËÎÒÃǵÄMVue¿ò¼Ü¾ÍÒѾ­±»¿ª·¢Íê³ÉÁË£¬ÎÒÃÇ¿ÉÒÔµã»÷ÕâÀïÀ´»ñÈ¡±¾¿Î³ÌÖÐËùÓеĴúÂ룬µ±ÎÒÃÇÐèҪʹÓÃÎÒÃǵÄMVueµÄʱºò£¬ÎÒÃÇ¿ÉÒÔÕâô×ö£º

<script src="./mvue3/patch.js">
</script>
<script src="./mvue3/dep.js">
</script>
<script src="./mvue3/directive.js"
></script>
<script src="./mvue3/watcher.js">
</script>
<script src="./mvue3/observer.js">
</script>
<script src="./mvue3/compile.js">
</script>
<script src="./mvue3/mvue.js">
</script>
<div id="app">
<input type="text" v-model='msg'>
<div>
<p>{{msg}}</p>
</div>
</div>
<script>
var vm = new MVue({
el: '#app',
data: {
msg: 'hello'
}
});
</script>

ÒòΪÎÒÃǵÄMVue²¢Ã»ÓнøÐÐÄ£¿é»¯£¬ËùÒÔÐèÒª°ÑËùÓеÄJSÈ«²¿ÒýÈë²ÅÄÜʹÓᣴó¼ÒÒ²¿ÉÒÔ³¢ÊÔһϰÑMVue½øÐÐÄ£¿é»¯£¬ÕâÑù¾Í¿ÉÒÔֻͨ¹ýÒýÈë< script src="./mvue3/mvue.js">< /script >À´Ê¹ÓÃMVueÁË¡£

ÏÖÔÚÎÒÃǵÄMVue»¹·Ç³£µÄ¼òµ¥£¬´ó¼Ò¿ÉÒÔÏëÒ»ÏÂÈçºÎΪÎÒÃǵÄMVueÔö¼Ó¸ü¶àµÄ¹¦ÄÜ£¬±ÈÈç˵¸ü¶àµÄÖ¸Áî»òÕßÌí¼Óv-on:clickµÄʼþ´¦Àí£¿ÕâÀï¸ø´ó¼ÒÁôÏÂÈý¸öÎÊÌ⣬ĿµÄÊÇÏ£Íû´ó¼ÒÄܹ»Ç××ÔдһÏÂÕâ¸öÏîÄ¿£¬¿ÉÄÜ»áÈôó¼ÒÓиü¶àµÄÀí½â¡£

1¡¢ÊµÏÖv-showÖ¸Áî

2¡¢ÊµÏÖv-on:clickʼþ¼àÌý

3¡¢ÈçºÎºÍVueÒ»Ñù¿ÉÒÔÖ±½Óͨ¹ýthis.msgÀ´»ñÈ¡ÎÒÃÇÔÚdataÖж¨ÒåµÄÊý¾Ý

ÕâÈý¸öÎÊÌâµÄ½â¾ö·½°¸¶¼ÔÚÎÒÃǵĴúÂëÖУ¬´ó¼Ò¿ÉÒÔ×÷Ϊ²Î¿¼¡£

ÕâÒ»ÕÂΪVue.jsµÄ×îºóÒ»Õ£¬´ÓÏÂÒ»Õ¿ªÊ¼ÎÒÃÇ¾Í»á½øÈëVueÖܱßÉú̬µÄѧϰ£¬Ï£Íû´ó¼ÒÒ»¶¨ÒªÇ××ÔʵÏÖÒ»ÏÂMVueµÄ´úÂë¡£

ǰ¶Ë¼¼ÊõÈÕÐÂÔÂÒ죬ÿһÖÖеÄ˼Ïë³öÏÖ£¬¶¼´ú±íÁËÒ»ÖÖ¼¼ÊõµÄÔ¾½ø¡¢¼Ü¹¹µÄ±ä»¯£¬ÄÇô¶ÔÓÚĿǰµÄǰ¶Ë¼¼Êõ¶øÑÔ£¬MVVM µÄ˼ÏëÒѾ­¿ÉÒÔ´ú±íµ±½ñǰ¶ËÁìÓòµÄÇ°ÑØË¼ÏëÀíÄAngular¡¢React¡¢Vue µÈ»ùÓÚ MVVM ˼ÏëµÄ¾ßÌåʵÏÖ¿ò¼Ü£¬Ò²³ÉΪÁËÈËÃÇÕùÏàѧϰµÄÒ»¸öÈȵ㡣¶ø Vue ×÷ΪÆäÖÐΨһûÓдó¹«Ë¾Ö§³Öµ«È´ÄÜÓëËüÃDz¢¼ÝÆëÇý²¢ÇÒÒþÒþÓг¬Ô½Í¬ÀàµÄÇ÷ÊÆ£¬²»µÃ²»ËµÕâÖÖÔö³¤ÈÃÈ˸е½¾ªÆæ¡£

±¾ÏµÁпγÌÄÚÈݽ«»á´øÁì´ó¼ÒÓÉdzÈëÉîµÄѧϰ Vue µÄ»ù´¡ÖªÊ¶£¬Á˽â Vue µÄÔ´ÂëÉè¼ÆºÍʵÏÖÔ­Àí£¬ºÍ´ó¼ÒÒ»Æð¿´Ò»ÏÂÓÈÓêϪÏÈÉúµÄ±à³Ì˼Ïë¡¢¼Ü¹¹Éè¼ÆÒÔ¼°ÈçºÎ½øÐдúÂëʵÏÖ¡£±¾ÏµÁпγÌÄÚÈÝÖ÷Òª·ÖΪÈý´ó²¿·Ö£º

Vue µÄ»ù´¡ÖªÊ¶£ºÔÚÕâÒ»²¿·Ö½«Ñ§Ï° Vue µÄ»ù´¡Óï·¨¼°ÆäÔ´ÂëµÄʵÏÖ¡£ÀýÈ磬Vue µÄÉúÃüÖÜÆÚ¹³×ÓÈçºÎÉè¼Æ£¿µ±ÉùÃ÷ÁËÒ»¸ö directive ʱ£¬Vue ¾¿¾¹Ö´ÐÐÁËʲô£¿ÎªÊ²Ã´Ö»ÓÐͨ¹ý vue.set º¯Êý²ÅÄÜΪÏìӦʽ¶ÔÏóÌí¼ÓÏìӦʽÊôÐÔ£¿Èç¹ûÎÒÃÇ×Ô¼ºÒªÊµÏÖÒ»¸öÏìӦʽµÄ¿ò¼ÜµÄ»°£¬Ó¦¸ÃÈçºÎÏÂÊÖ¡¢ÈçºÎ˼¿¼µÈ¡£

VueµÄÖܱßÉú̬£ºÔÚÕâÒ»²¿·Ö½«Ñ§Ï° Vue µÄÖܱßÉú̬Ȧ£¬°üÀ¨ÓÐÄÄЩ UI ¿â¿ÉÒÔºÍ Vue ÅäºÏ¿ìËÙ¹¹½¨½çÃæ¡¢ÈçºÎʹÓà vue-router¹¹½¨Ç°¶Ë·ÓÉ¡¢ÈçºÎʹÓà Vuex ½øÐÐ״̬¹ÜÀí¡¢ÈçºÎʹÓà Axios ½øÐÐÍøÂçÇëÇó¡¢ÈçºÎʹÓà Webpack¡¢Ê¹Óà vue-cli ¹¹½¨³öµÄÏîÄ¿ÀïµÄ¸÷ÖÖÅäÖÃÓÐʲôÒâÒ壿

ÏîĿʵս£ºÔÚÕâÒ»²¿·Ö½«»áͨ¹ýÒ»¸öÓÐÒâ˼µÄ×Ô¶¯¶Ô»°ÏµÍ³À´½øÐÐÏîĿʵս£¬Õùȡͨ¹ýÕâ¸öСÏîÄ¿°Ñѧµ½µÄ֪ʶµã½øÐÐÒ»¸öÕûºÏ¡£

 
   
2122 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì