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

说说Reacthooks和实践

时间:2023-03-29 12:59:06 HTML

React涓轰粈涔堣鎻愬嚭hooks杩欑璁捐瓒婃潵瓒婅交宸х殑瑙嗗浘灞傦紵涓轰粈涔堝ぇ澶氭暟gui瑙嗗浘灞傝秺鏉ヨ秺杞伙紵Mvc鏋舵瀯鐢眒vvm鏋舵瀯婕斿彉鑰屾潵锛宮vvm鏈川涓婂氨鏄痬->vbinder銆備富瑕佽瑙e喅鐨勯棶棰樻槸鑷姩updateView銆俶vc涓嬮渶瑕佹墜鍔ㄥ姞杞絤odel鍒皏iew涓紝鐒跺悗updateView銆傚鏋滄兂璁╄繖涓繃绋嬭嚜鍔ㄥ彉鎴恗->vm->v锛岄偅涔堝湪杩欎釜鍘熷洜灏辨槸gui鐨勮鍥惧眰瓒婃潵瓒婅交浜嗐€傚嚱鏁板紡缂栫▼鎬濇兂鐨勫彂灞曞凡缁忎镜鍏ヤ簡缂栫▼璇█銆傜涓変唬缂栫▼璇█鐨勫彂灞曠幇鍦ㄥ凡缁忚蛋鍚戜簡澶氳寖寮忥紝涔熶粠鍑芥暟寮忕紪绋嬫€濇兂涓惛鍙栦簡寰堝銆傚緢灏戯紝Lambda琛ㄨ揪寮忕殑鏀寔灏辨槸鏈€鍏稿瀷鐨勪緥瀛愩€俁eacthooks鏄疪eact寮€鍙戝洟闃熻繍鐢ㄥ嚱鏁板紡缂栫▼鎬濇兂瑙e喅瑙嗗浘灞傞棶棰樺疄璺电殑浜х墿銆傛€ф椿鍔ㄩ挬瀛愮殑鍩烘湰鐢ㄦ硶閽╁瓙浠嬬粛濡備綍鍐欏ソ閽╁瓙锛熼鍏堣鏈変竴涓爣鍑嗭紝濡備綍瀹氫箟濂藉潖锛熻繖涓棶棰樼湅璧锋潵寰堢缁燂紝灏卞儚闂粈涔堟牱鐨勪唬鐮佸ソ锛屼粈涔堟牱鐨勪唬鐮佷笉濂斤紝寰堥毦鏈変竴涓粺涓€鐨勬爣鍑嗭紝鑰屼笖閲岄潰浼氭湁涓汉鍠滃ソ锛屾墍浠ュ彧璁ㄨ涓€浜涙娊璞$殑涓滆タ鍦ㄨ繖閮ㄥ垎銆傚鏉傚害瓒冲浣庯紝褰撳墠闄愬埗涓嬩笂涓嬫枃鐨勫鏉傚害瓒冲浣庯紝绠€鍗曞鏉傚害鐨勬湰璐ㄧ畝鍗曡В閲婁竴涓嬶細浠g爜瓒婄煭瓒婂鏄撹鐞嗚В锛屼篃灏辨槸澶嶆潅搴﹁冻澶熶綆.鍦ㄨ浠g爜鍙樼煭鐨勮繃绋嬩腑锛屾垜浠娇鐢ㄨ娉曠硸寤虹珛鎶借薄锛屽皝瑁呮祦绋嬶紝闄嶄綆hooks涓紪绋嬫柟寮忕殑澶嶆潅搴︿互涓嬪悓鏍烽€傜敤浜庡綋鍓嶉檺鍒朵笅鐨勪笂涓嬫枃銆傝櫧鐒秗eact鏈韩鍙槸涓€涓簱锛屼絾鏄汉浠父璇磖eact浠h〃浜嗭紙react鍏ㄥ妗?react鍝插锛変竴濂楀畬鏁寸殑react鑼冨紡缂栫▼銆傝寖寮忕紪绋嬩粠骞插噣鐨勭粨鏋勬帹鍚戣繃绋婽ao缁撴瀯鍖栫紪绋嬫槸瀵瑰瀵圭▼搴忔帶鍒舵潈鐩存帴杞Щ鐨勭害鏉熴€傞潰鍚戝璞$紪绋嬫槸瀵圭▼搴忔帶鍒剁殑闂存帴浼犻€掔殑闄愬埗銆傚嚱鏁板紡缂栫▼鏄绋嬪簭涓祴鍊兼搷浣滅殑闄愬埗銆傛瘡绉嶈寖寮忛兘闄愬埗浜嗘煇绉嶇紪鍐欎唬鐮佺殑鏂瑰紡锛屽苟涓旀病鏈変竴绉嶇紪绋嬭寖寮忎細澧炲姞鏂扮殑鍔熻兘銆俁eact鑼冨紡缂栫▼涔熸槸濡傛銆傝櫧鐒舵垜浠湪鍐檋ooks绋嬪簭鐨勬椂鍊欎笉鍙楃紪璇戝櫒鐨勯檺鍒讹紝浣嗘槸鎴戜滑搴旇鏈夎繖鏍风殑鎰忚瘑鏉ユ寚瀵艰嚜宸变粈涔堟槸瀵圭殑锛屼粈涔堟槸涓嶅鐨勩€傚綋鐒讹紝鍦ㄦ煇绉嶅満鏅笅锛屾垜浠繀椤昏鏈変笉涓€鑷存潵鎵撶牬闄愬埗涓嶈兘瀹炵幇鐨勬儏鍐点€傚湪杩欑鎯呭喌涓嬶紝閭d簺鐪嬭捣鏉ヤ笉濂界殑涓滆タ搴旇琚皝瑁呭苟闅愯棌鍦ㄧ被浼紆tils鐨勪笢瑗夸腑銆傛渶鍚庯紝鎴戜滑鍥炲埌鈥滃浣曞啓閽╁瓙锛熲€濇垜浠緱鍒颁互涓嬩袱涓粨璁轰綘闇€瑕佽兘澶熷啓鍑轰竴涓ソ鐨勭▼搴忋€傚綋杈撳叆杈撳嚭鍥哄畾鏃讹紝鍙互璁捐涓€涓ā鍧楋紝瀹氫箟涓€涓嚱鏁帮紝閫夋嫨涓€涓彉閲忓悕銆傝繖浜涢兘鏄紪鍐欏ソ绋嬪簭鐨勫墠鎻愭潯浠躲€備綘闇€瑕佸鍙嶅簲鐨勬満鍒舵湁寰堝ソ鐨勭悊瑙c€傚缂栫▼鏈変竴瀹氱殑浜嗚В锛屽react鐨勫摬瀛︽湁鑷繁鐨勮瑙c€傜悊瑙eactHooks鏈哄埗鐨勬渶濂芥柟娉曟槸鎼缓涓€涓帺鍏枫€傞鍏堝厛鎼缓涓€涓帺鍏凤紝鍙傝€價eact鍜宲reacthooks鐨勫疄鐜癶ttps://github.com/nobey/noli...https://codesandbox.io/s/noli...瀹屾垚鍚庯紝鎴戜滑鏉ュ洖澶寸湅鐪媓ooksHooks鍙槸鏁扮粍锛熻櫧鐒舵垜浠父璇碒ooks鍙槸鏁扮粍锛屼絾瀹為檯涓妑eact鐨勫疄鐜板叾瀹炴槸涓€涓摼琛紝鑰宲react鐨勫疄鐜版槸涓や釜鎸囬拡hooks鐨勬暟缁勩€傚師鍒欎笂鏈€閲嶈鐨勪笉鏄暟鎹紝鑰屾槸涓や釜鎸囬拡锛屼竴涓槸wipnode褰撳墠宸ヤ綔鐨剉node锛坒ibernode锛夛紝涓€涓槸wiphook銆傚綋鍓峢ook鎸囧悜鐨勯檺鍒跺甫鏉ヤ簡鍙樺寲Function缁勪欢鍐呴儴鐨勫啓娉曚笉鍐嶆槸绾痡s锛屽畠鐨剅untime鍜宑ontext甯︽潵浜嗗彉鍖栥€傚氨鍍忔垜浠畾涔夌殑姝e父鏂瑰紡涓€鏍穕eta=1;涓€=2;缂栫▼鏂规硶鍙樹负const[a,setA]=useS(1);璁剧疆A锛?锛夛紱鐒跺悗浣犱細鍙戠幇锛屽嚱鏁板紡缂栫▼灏辨槸鍦ㄧ▼搴忎腑瀵硅祴鍊兼搷浣滅殑闄愬埗锛屽湪hooks鐨勯儴鍒嗗彂鎸ュ嚭鏉ヤ簡銆傚綋鐒讹紝杩欐槸鑼冨紡鐨勫眬闄愭€э紝浣犺繕鏄彲浠ackout馃惗涓嬮潰璇磋useCallback鍜寀seMemohttps://jancat.github.io/post...浣跨敤useCallbackuseMemo瑕佽皑鎱庛€備笂闈㈣繖绡囨枃绔犳槸浠庢€ц兘涓婃潵鎺ㄦ柇杩欎釜闂鐨勩€傝鎴戜滑浠庡鏉傛€х殑瑙掑害鏉ョ湅銆傚嚱鏁版垨鏁版嵁鍖呰涓€娆″悗锛屾湁涓や釜鐐圭殑澶嶆潅鎬у鍔犱簡銆傚寘瑁卽seCallback鐨勬柟娉晆seMemo鎴戜滑闇€瑕佷簡瑙h繖涓姛鑳姐€傞ギ閰掑€煎彲鑳藉瓨鍦ㄥ樊寮傘€倁seMemo(()=>obj,[a,b]);濡傛灉鍦ㄥ綋鍓嶈繍琛岀幆澧冧腑瀹氫箟浜唎bj鏈韩锛岄偅涔堣繑鍥炵殑杩欎釜寮曠敤灏变細鍜岀紦瀛樼殑涓嶄竴鏍枫€傛€ц兘浼樺寲涓嶆槸鍏嶈垂鐨勩€傚畠鐨勪唬浠蜂笉浠呬粎鏄€ц兘锛岃繕鏈夊鏉傚害鐨勫鍔犮€傞櫎闈炰綘鏄寚鏁拌绠梔emo锛宒iff鍜寀mout鏈夐棶棰橀渶瑕佹洿澶氱殑澶勭悊锛岀洰鍓嶅彧鏄hooks鐩稿叧鐨剅eactkittytricks璁╀綘鐨勫嚱鏁扮粍浠舵敮鎸乤waitdemoconstsleep=()=>newPromise(resolve=>setTimeout(resolve,2000))constasyncComponent=(asyncComponent,fallback='')=>{璁╃粍浠惰繑鍥瀙rops=>{Component=lazy(async()=>{constcomponent=awaitasyncComponent(props);return{default:props=>cloneElement(component,props)};});杩斿洖();};};//鎴戜滑鍙互寮傛浣跨敤缁勪欢//閫傜敤鍦烘櫙锛屼竴涓垨涓€涓渶瑕佷粠鍓嶇鎷夊彇缁勭晫闈俊鎭樉绀猴紝杩欐牱鍙互鑺傜渷涓€浜涙ā鏉夸唬鐮乧onstLinkBut鈥嬧€媡on=asyncComponent(asyncprops=>{console.log({props});awaitsleep()return({console.log(111)}}>鎸夐挳

);});閫氬父浣跨敤lazy鏉ュ姞杞藉紓姝ョ粍浠讹紝閫氳繃妯℃嫙lazy杩斿洖鐨凱romisewithoutcontext鍏ㄥ眬閫氫俊demo/***鍒涘缓璺ㄧ粍浠惰法鏍戦€氫俊Hooks锛堝彲鐢ㄤ簬璺ㄧ粍浠朵娇鐢級*鎬濊矾*1.WrapHook閫氳繃鍒涘缓涓€涓殣钘忕殑ReactTree*2.Hook鏇存敼瑙﹀彂闅愯棌鐨凴eactTree娓叉煋*3.杩斿洖涓€涓鍔寔鐨凥ook銆傞殣钘廟eactTree娓叉煋鏃讹紝浼氭洿鏂拌鍔寔鐨凥ook鏁版嵁*@param{Function}hookcustomuseHooks*/exportconstcreateHookObserver=(hook)=>{constdiv=document.createElement("div");constevents=newSet();璁?鏁版嵁锛沜onstupdate=(data)=>{$data=鏁版嵁锛沞vents.forEach((event)=>event(data));杩斿洖绌哄€硷紱};render(createElement(()=>update(hook())),div);constuseHooks=()=>{const[val,setVal]=useState($data);useEffect(()=>{events.add(setVal);return()=>events.delete(setVal);},[]);杩斿洖鍊硷紱};returnuseHooks;};constuseCount=createHookObserver(()=>{const[count,setCount]=useState(0);return{count,setCount};});涓€寮€濮嬫槸hooks鍒氬紑濮嬫祦琛岀殑鏃跺€欐壘ho澶у鏁皁ks閫氫俊鏂规杩樻槸闇€瑕佸湪鏈€澶栧眰鍔犱竴涓?Providerstore={store}/>鏉ヤ紶閫掋€傚悗鏉ュ彂鐜拌繖涓€濊矾锛屽彲浠ユ洿鍔犺嚜鐢辩殑瀹氫箟浠绘剰涓や釜缁勪欢鐨刣irecthooks鏁版嵁鍏变韩銆傚爢閽╁瓙鐘舵€佺鐞嗙粨鏉熴€?/p>
最新推荐
猜你喜欢