鐨勮儗鏅€備竴鐩村vue涓殑watch鍜宑omputed鐣ユ湁浜嗚В銆傜煡閬撲竴鐐癸紙姣斿锛歸atch鍜宑omputed鐨勬湰璐ㄩ兘鏄痭ewWatcher锛屽苟涓攃omputed鏈夌紦瀛橈紝鍙湁璋冪敤渚濊禆鐨勬暟鎹彂鐢熷彉鍖栨墠浼氭墽琛岋紝浼氬啀娆¤Е鍙戙€傘€傘€傦級锛屼互鍙婄劧鍚庡氨娌℃湁浜嗐€備篃鐪嬩簡寰堝澶т浆浠啓鐨勬枃绔犮€傚垪鍑轰簡涓€澶ф鐨勬簮鐮侊紝鐪熸槸璁╂垜鑿滈笩涓€澶撮浘姘达紝涓嶆兂鐪嬩簡銆傛渶杩戝張寮€濮嬬爺绌秜ue鐨勬簮鐮侊紝鎵嶇湡姝f槑鐧戒簡瀹冧滑鐨勫疄鐜板師鐞嗐€俤ata(){return{msg:'helloguys',info:{age:'18'},name:'FinGet'}}watcher浠€涔堟槸watcher锛熷惉浼楋紵鏄彮绾э紒classWatcher{constructor(vm,exprOrFn,callback,options,isRenderWatcher){}}vmvueinstanceexprOrFn鍙兘鏄竴涓瓧绗︿覆锛屼篃鍙兘鏄竴涓洖璋冨嚱鏁帮紙鏈夌偣杩风硦鍥炲ご鐪嬬湅锛岀幇鍦ㄤ笉閲嶈锛塷ptions涓€涓厤缃」锛堥厤缃粈涔堬紝鐪嬪悗闈級isRenderWatcher鏄惁鍦ㄦ覆鏌揥athcerinitStateVue鍦ㄥ垵濮嬪寲鐨勬椂鍊欎細鎵ц涓€涓猧nitState鏂规硶锛屽叾涓渶鐔熸倝鐨勫氨鏄痠nitData锛屼篃灏辨槸Object.defineProperty鏁版嵁鍔寔銆傚鍑哄嚱鏁癷nitState(vm){constopts=vm.$options;//Vue鐨勬暟鎹簮灞炴€ф柟娉曟暟鎹绠楀睘鎬atchif(opts.props){initProps(vm);}if(opts.methods){initMethod(vm);}if(opts.data){initData(vm);}if(opts.computed){initComputed(vm);}if(opts.watch){initWatch(vm,opts.watch);}}鍦ㄦ暟鎹姭鎸佽繃绋嬩腑鐢靛奖涓紝Watcher鐨勫ソ鏈嬪弸Dep鍑虹幇浜嗭紝Dep鏄负浜嗘晳Watcher銆俧unctiondefineReactive(data,key,val){letdep=newDep();Object.defineProperty(data,key,{get(){if(Dep.target){dep.depend();//鏀堕泦渚濊禆鍏崇郴}returnval;},set(newVal){if(newVal===val)return;val=newVal;dep.notify();//閫氱煡鎵ц}})}initData鏃讹紝Dep.target浠€涔堥兘娌℃湁锛屾墍浠ュ鐙殑闆嗗悎銆傜洰鏍囩粦瀹氬埌Dep绫伙紙闈欐€佸睘鎬э級锛岃€屼笉鏄疄渚嬨€備絾鏄湪$mount涔嬪悗灏变笉涓€鏍蜂簡銆傝嚦浜?mount涓墽琛屼粈涔坈ompile銆乬enerate銆乺ender銆乸atch銆乨iff锛屼笉鏄湰鏂囩殑閲嶇偣锛屼笉閲嶈锛岀粫閬擄紒浣犲彧闇€瑕佺煡閬撲竴浠朵簨锛氫笅闈㈢殑浠g爜浼氳鎵цnewWatcher(vm,updateComponent,()=>{},{},true);//true琛ㄧず鏄鍦ㄦ洿鏂扮殑娓叉煋watcherupdateComponent锛屼笉绠″叿浣撴墽琛岋紝鐜板湪鏄洖璋冨嚱鏁帮紝浼氭洿鏂伴〉闈紝浼氫繚瀛樺湪Watcher鐨刧etter涓€傚搴斿紑澶寸殑exprOrFn鍙傛暟銆傚樋鍢垮樋锛岃繖娆′笉涓€鏍蜂簡锛氭覆鏌撻〉闈㈠氨鏄皟鐢ㄤ綘瀹氫箟鐨勬暟鎹紙涓嶇敤鎷呭績锛屽畾涔変簡娌¤皟鐢級锛屼細鍘籫et銆俷ewWatcher浼氳皟鐢ㄤ竴涓柟娉曟妸杩欎釜瀹炰緥鏀惧湪Dep.target涓娿€俻ushTarget(watcher){Dep.target=watcher;}杩欎袱浠朵簨纰板阀鍦ㄤ竴璧凤紝鐒跺悗dep.depend()灏变細璧蜂綔鐢ㄣ€傛墍浠ヨ繖閲屽彲浠ョ悊瑙d竴涓笢瑗匡紝鎵€鏈夊畾涔夊湪data涓殑鏁版嵁锛屽彧瑕佽璋冪敤锛屽氨浼氭敹闆嗕竴涓猺enderingwatcher锛屼篃灏辨槸鏁版嵁鍙戠敓鍙樺寲锛屾墽琛宻et涓殑dep.notify灏变細鎵цrendering瑙傚療鑰呫€備笅鍥炬槸瀹氫箟msg銆乮nfo銆乶ame涓変釜鏁版嵁锛屽畠浠兘鏈変竴涓覆鏌揥atcher锛氱溂灏栫殑鏈嬪弸搴旇鐪嬪埌msg涓湁涓や釜watcher锛屼竴涓槸鐢ㄦ埛鑷畾涔夌殑watch锛屼竴涓篃鏄痷ser-瀹氫箟鎵嬭〃銆傚晩锛屽綋鐒朵笉鏄紝vue宸茬粡鍘婚噸浜嗭紝涓嶄細鏈夐噸澶嶇殑watchers浜嗐€傚鎮ㄦ墍鏂欙紝鍙︿竴涓槸璁$畻鐨勮瀵熻€咃紱鐢ㄦ埛鎵嬭〃锛屾垜浠竴鑸繖鏍蜂娇鐢ㄦ墜琛細('mywatch',newVal,oldVal)},immediate:true}}here浼氭墽琛屼竴涓猧nitWatch锛岀粡杩囦竴灏忔鎿嶄綔鍚庯紝浼氭彁鍙杄xprOrFn锛堟鏃舵槸瀛楃涓诧級銆乭andler銆乷ptions锛屽叾涓帿鍚嶄笌Watcher濂戝悎锛岀劧鍚庨『鐞嗘垚绔犺皟鐢╲m.$watch鏂规硶銆俈ue.prototype.$watch=function(exprOrFn,cb,options={}){options.user=true;//鏍囪涓虹敤鎴疯瀵熻€?/鏍稿績鏄垱寤轰竴涓瀵熻€卌onstwatcher=newWatcher(this,exprOrFn,cb,options);if(options.immediate){cb.call(vm,watcher.value)}}鎷滄墭锛屾垜鍏嶄笉浜嗚鐪嬭繖娈典唬鐮侊紙鎴戜竴寮€濮嬭创浜嗗緢闀夸竴娈碉紝浣嗘槸鎴戣鐨勬槸閫氫織鏄撴噦鐨勮嫳鏂囷紝鎵€浠ユ垜灏辨妸瀹冨拰杩欓儴鍒嗗叧绯讳笉澶х殑鍒犳帀锛夛細classWatcher{constructor(vm,exprOrFn,callback,options,isRenderWatcher){this.vm=vm;this.callback=鍥炶皟锛泃his.options=閫夐」锛涘鏋滐紙閫夐」锛墈this.user=!!options.user;}this.id=id++;if(typeofexprOrFn=='function'){this.getter=exprOrFn;//灏嗗唴閮ㄥ洖璋冨嚱鏁版斁鍏etter灞炴€т腑}else{this.getter=parsePath(exprOrFn);濡傛灉(!this.getter){this.getter=(()=>{});}}this.value=this.get();}get(){pushTarget(杩欎釜);//灏嗗綋鍓嶈瀵熻€呭瓨鍌ㄥ湪dep涓璴etresult=this.getter.call(this.vm,this.vm);//renderingwatcher鐨勬墽琛屼細杞埌observe鐨刧et鏂规硶锛岀劧鍚庝繚瀛楴extthiswatcherpopTarget();//鎵ц鍒拌繖涓€姝ョ殑鏃跺€欏啀璁╁畠涓虹┖锛屾墍浠ョ湅鎯呭喌璧栨敹闆嗗畬鎴愶紝閮芥槸鍚屼竴涓獁atcher杩斿洖缁撴灉锛泒}//杩欎釜鏄敤鏉ヨ幏鍙杕sg鐨勫€肩殑锛屼篃灏辨槸oldValfunctionparsePath(path){if(!path){return}varsegments=path.split('.');returnfunction(obj){for(vari=0;i
