当前位置: 首页 > Web前端 > HTML

如何使用redux实现计算属性

时间:2023-03-28 14:18:27 HTML

浠€涔堟槸璁$畻灞炴€э紵瀹冧細鏍规嵁瀹冩墍渚濊禆鐨勬暟鎹姩鎬佹樉绀烘柊鐨勮绠楃粨鏋滐紝骞剁紦瀛樿绠楃粨鏋溿€傚鏋滀綘鏄疺ue寮€鍙戣€咃紝瀵硅繖涓姛鑳戒竴瀹氫笉闄岀敓锛岃€屼笖寰堝父鐢ㄣ€傚浜嶳eact寮€鍙戣€呮潵璇达紝濡傛灉浣犵敤杩噈obx锛屽瀹冨苟涓嶉檶鐢熴€傝楗板櫒灏嗙敓鏁堭煇€俁edux鍛紵锛燂紙鏃犺鈥︹€︼級瀵癸紝閲嶉€夛紝鍝堝搱馃槃銆傚暘锛岄獥瀛愶紝杩欐槸涓€涓吉閫犵殑璁$畻灞炴€э紝闇€瑕佹墜鍔ㄦ彁渚涙墍鏈変緷璧栵紝姣忎釜渚濊禆閮芥槸涓€涓嚱鏁板洖璋冩潵纭畾渚濊禆鐨勫€硷紝姣忔鍐欒繖涔堝浠g爜锛屾垜閮芥兂鎶婃垜鐨勬満姊伴敭鐩樺紕鍧忎簡锛堝皷鍙?.閭d箞锛宺edux涓庤绠楀睘鎬ф棤鍏冲悧锛熶笉鑳借鍔炴硶鎬绘槸姣斿洶闅惧銆傝櫧鐒秗edux鏄竴绉嶅崟鍚戞暟鎹祦锛屼笉鑳借繘琛屽搷搴斿紡鎿嶄綔锛屼絾鏄垜浠彲浠ュ垱寤轰竴涓洃鍚璞mport{Store}from'redux';const鏀堕泦鍣?[];绫籓bjectDeps{protectedreadonlydeps:string[];鍙椾繚鎶ょ殑鍙鍚嶇О锛氬瓧绗︿覆锛涘彈淇濇姢鐨勫彧璇诲瓨鍌細瀛樺偍锛涘彈淇濇姢鐨勫揩鐓э細浠讳綍锛涙瀯閫犲嚱鏁帮紙鍟嗗簵锛氬晢搴楋紝鍚嶇О锛氬瓧绗︿覆锛岄儴闂細瀛楃涓瞇]=[]锛墈this.store=store;this.name=鍚嶇О锛涜繖銆傞儴闂?閮ㄩ棬锛涙敹闆嗗櫒.push(this);}proxy(currentState){if(state===null||typeofstate!='object')杩斿洖鐘舵€侊紱constproxyData=Array.isArray(state):[]:{};constcurrentDeps=this.deps.slice();constkeys=Object.keys(currentState);for(leti=keys.length;i-->0;){constkey=keys[i]!;Object.defineProperty(proxyData,key,{enumerable:true,get:()=>{if(visited){returnnewObjectDeps(this.store,this.name,currentDeps.slice(),).proxy(c褰撳墠鐘舵€侊級[閿甝锛泒璁块棶杩?鐪燂紱this.deps.push(key);杩斿洖this.proxy((this.snapshot=currentState[key]));},});ES6鐨凱roxy锛屽洜涓哄吋瀹规€т笉濂斤紝鏃㈢劧鏄墠绔簲鐢紝鑷劧瑕侀【鍙奅S5鐜锛屾墍浠ラ€夋嫨defineProerty鏄竴涓緢濂界殑鏂规銆傛湁浜嗙洃鎺ч┍鍔紝鐩戞帶涓嶅氨杞绘澗浜嗗悧锛?/鍋囪user涓殑瀵硅薄鏄細{firstName:'lady',lastName:'gaga'}constuserState=store.getState()['user'];functioncomputedFullName(){constproxy=newObjectDeps(store,'user').proxy(userState);returnproxy.firstName+'-'+proxy.lastName;}constfullname=computedFullName();鐜板湪璁╂垜浠湅鐪嬪湪鏀堕泦鍣ㄤ腑鏀堕泦浜嗗灏戜緷璧栭」console.log(collector);//[ObjectDeps,ObjectDeps]瀵癸紝涓や釜渚濊禆锛岀涓€涓殑deps閾炬槸['user','firstName']锛岀浜屼釜鏄痆'user','lastName']銆傚師鐞嗗垎鏋愶細姣忔鍒涘缓浠g悊鏃讹紝鏋勯€犲嚱鏁伴兘浼氭墽琛宑ollector.push(this)灏嗚嚜宸辨坊鍔犲埌鏀堕泦鍣ㄤ腑銆傚綋浠g悊璁块棶firstName鏃讹紝瀹冣€嬧€嬪疄闄呬笂璁块棶鐨勬槸getter銆俫etter涓湁涓€涓猼his.deps.push(key)鍙互绔嬪嵆鏀堕泦渚濊禆骞惰繑鍥炰笅涓€绾т唬鐞嗗€笺€備互姝ょ被鎺紝鍗充娇鏄痯roxy.a.b.c.d杩欐牱鐨勬繁搴︽搷浣滀篃鏄彈娆㈣繋鐨勶紝鍥犱负姣忔璁块棶涓嬩竴灞傦紝閮藉彲浠ユ敹闆嗕緷璧栧苟鍚堝苟鍒癲eps鏁扮粍涓€傚綋proxy璁块棶lastName鏃讹紝鐢变簬proxy瀹炰緥宸茬粡琚玣irstName鍗犵敤锛堟牴鎹畍isited鍙橀噺鍒ゆ柇锛夛紝getter閫昏緫涓細鐩存帴杩斿洖涓€涓柊鐨凮bjectDeps瀹炰緥銆傝繖鏃跺€檒astName灏卞拰鎴戜滑鐪嬪埌鐨勪唬鐞嗗彉閲忔病鏈夊叧绯讳簡銆備緷璧栫殑鑷姩鏀堕泦宸茬粡瀹炵幇锛屾垜浠潵璇曡瘯濡備綍缂撳瓨灞炴€lassObjectDeps{protectedsnapshot:any;proxy(){...}isDirty(){returnthis.snapshot!==this.getSnapshot();}protectedgetSnapshot(){constdeps=this.deps;璁╁揩鐓?this.store.getState();for(leti=0;i{constfullName=useComputed(userModel.fullName);杩斿洖

{fullName}
;};鍡紵鍒氭墠鎬庝箞鍥炰簨锛屽ソ鍍廳va椋炶繃鏉ヤ簡锛熼浣犵殑鑴戣锛屾槸鎴戝摜鍐欑殑React鐘舵€佺鐞嗗簱foca锛屽熀浜巖edux鍜宺eact-redux锛屽垰鎵嶇殑璁$畻鍒嗘瀽鎽樿嚜瀹冿紙鍏蜂綋瀹炵幇閫昏緫鐪嬭繖閲岋級銆傝櫧鐒舵槸杞箍鍛婏紝浣唕edux涔熺畻鏄敮鎸乧omputed浜嗐€傚悇浣嶅ぇ浣埆澶╁ぉ鍠穜edux銆傝繖涓笉濂介偅涓笉濂斤紝濂藉悧锛熶簩娆″寘瑁呮墠鏄湡鐖便€備汉鐢熻嫤鐭紝鎷跨潃绁炲櫒锛屽皯鍐欎唬鐮侊紝鏃╃偣涓嬬彮鎵嶆槸鏈€閲嶈鐨勶細https://github.com/foca-js/foca