| ±à¼ÍƼö: |
±¾ÎÄÖ÷ÒªÏêϸ½éÉÜÁË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 ¹¹½¨³öµÄÏîÄ¿ÀïµÄ¸÷ÖÖÅäÖÃÓÐʲôÒâÒ壿
ÏîĿʵս£ºÔÚÕâÒ»²¿·Ö½«»áͨ¹ýÒ»¸öÓÐÒâ˼µÄ×Ô¶¯¶Ô»°ÏµÍ³À´½øÐÐÏîĿʵս£¬Õùȡͨ¹ýÕâ¸öСÏîÄ¿°Ñѧµ½µÄ֪ʶµã½øÐÐÒ»¸öÕûºÏ¡£
|