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

使用React和TypeScript编写干净代码的10个必备模式

时间:2023-03-28 13:46:20 HTML

React鏄竴涓狫avaScript搴擄紝鏄綋浠婃渶娴佽鍜岃涓氶鍏堢殑鍓嶇寮€鍙戝簱銆侸avaScript鏄竴绉嶆澗鏁g被鍨嬬殑璇█锛屽洜姝ゅ畠鎹曡幏杩愯鏃躲€傝繖鏍峰仛鐨勭粨鏋滄槸JavaScript閿欒寰堟櫄鎵嶈鍙戠幇锛岃繖鍙兘瀵艰嚧涓ラ噸鐨勯敊璇€傚綋鐒禦eact浣滀负涓€涓狫avaScript搴撲篃缁ф壙浜嗚繖涓棶棰樸€傛暣娲佷唬鐮侊紙Cleancode锛夆€濓級鏄竴绉嶄竴鑷寸殑缂栫▼椋庢牸锛屽畠浣夸唬鐮佹洿鏄撲簬缂栧啓銆侀槄璇诲拰缁存姢銆備换浣曚汉閮藉彲浠ョ紪鍐欒绠楁満鍙互鐞嗚В鐨勪唬鐮侊紝浣嗕紭绉€鐨勫紑鍙戜汉鍛樺彲浠ョ紪鍐欏嚭浜虹被鍙互鐞嗚В鐨勪唬鐮丆leancode銆傚共鍑€鐨勪唬鐮佹槸涓€绉嶄互璇昏€呬负涓績鐨勫紑鍙戦鏍硷紝瀹冩彁楂樹簡鎴戜滑杞欢鐨勮川閲忓拰鍙淮鎶ゆ€с€傜紪鍐欏共鍑€鐨勪唬鐮侀渶瑕佺紪鍐欏叿鏈夋竻鏅板拰绠€鍗曠殑璁捐妯″紡鐨勪唬鐮侊紝浣夸汉浠彲浠ヨ交鏉惧湴闃呰銆佹祴璇曞拰缁存姢浠g爜銆傚洜姝わ紝骞插噣鐨勪唬鐮佸彲浠ラ檷浣庤蒋浠跺紑鍙戞垚鏈€傝繖鏄洜涓虹紪鍐欏共鍑€浠g爜鎵€娑夊強鐨勫師鍒欐秷闄や簡鎶€鏈€哄姟銆傚湪鏈枃涓紝鎴戜滑灏嗕粙缁嶄竴浜涘湪宸ヤ綔鏃朵娇鐢ㄧ殑鏈夌敤妯″紡銆傪煉¤鎮ㄧ殑鍥㈤槦鏇磋交鏉惧湴淇濇寔浠g爜鍋ュ悍鍜屼紭鍏堣€冭檻鎶€鏈€哄姟宸ヤ綔锛屽皾璇昐tepsize鐨刅SCode鍜孞etBrains鎵╁睍銆傚畠浠府鍔╁伐绋嬪笀鍒涘缓鎶€鏈棶棰橈紝灏嗗畠浠坊鍔犲埌杩唬涓紝骞剁户缁В鍐虫妧鏈€哄姟-鏃犻渶绂诲紑缂栬緫銆傜幇鍦ㄨ鎴戜滑鏉ョ湅鐪嬪湪浣跨敤React鍜孴ypescript鏃跺簲鐢ㄧ殑10涓湁鐢ㄦā寮忥細1.浣跨敤榛樿瀵煎叆鏉ュ鍏eact鑰冭檻浠ヤ笅浠g爜锛歩mport*asReactfrom"react";铏界劧涓婇潰鐨勪唬鐮佹湁鏁堬紝浣嗗鏋滄垜浠笉浣跨敤React涓殑鎵€鏈夊唴瀹癸紝閭d箞浠嶳eact涓鍏ユ墍鏈夊唴瀹逛細浠や汉鍥版儜骞朵笖涓嶆槸涓€涓ソ鐨勫仛娉曘€傛洿濂界殑妯″紡鏄娇鐢ㄩ粯璁ゅ鍑猴紝濡備笅鎵€绀猴細importReact,{useContext,useState}from"react";浣跨敤杩欑鏂规硶锛屾垜浠彲浠ヤ粠React妯″潡涓В鏋勬垜浠渶瑕佺殑涓滆タ锛岃€屼笉鏄鍏ユ墍鏈変笢瑗裤€傛敞鎰忥細瑕佷娇鐢ㄨ繖涓€夐」锛屾垜浠渶瑕侀厤缃畉sconfig.json鏂囦欢濡備笅锛歿"compilerOptions":{"esModuleInterop":true"}}鍦ㄤ笂闈㈢殑浠g爜涓紝鎴戜滑閫氳繃灏唀sModuleInterop璁剧疆涓簍rue鏉ュ惎鐢╝llowSyntheticDefaultImports锛岃繖鏄潪甯窽ypeScript鏀寔鎴戜滑鐨勮娉曞緢閲嶈銆?.鍦ㄨ繍琛屾椂瀹炵幇涔嬪墠搴旇鑰冭檻绫诲瀷澹版槑鑰冭檻浠ヤ笅浠g爜锛歩mportReact,{Component}from"react";constinitialState={count:1}constdefaultProps={name:"JohnDoe"}typeState=typeofinitialState;typeProps={count?:number}&typeofdefaultPropsclassCounterextendsComponent{staticdefaultProps=defaultProps;state=initialState;//...}濡傛灉鎴戜滑缁撳悎杩愯鏃跺0鏄庡拰濡傛灉缂栬瘧鏃跺0鏄庢槸鍒嗗紑鐨勶紝缂栬瘧鏃跺0鏄庡湪杩愯鏃跺0鏄庝箣鍓嶏紝閭d箞涓婇潰鐨勪唬鐮佸彲浠ユ洿娓呮櫚锛屾洿鏄撹銆傝€冭檻浠ヤ笅浠g爜锛歩mportReact,{Component}from"react";绫诲瀷鐘舵€?typeof鍒濆鐘舵€侊紱typeProps={count?:number}&typeofdefaultPropsconstinitialState={count:1}constdefaultProps={name:"JohnDoe"}classCounterextendsComponent{staticdefaultProps=defaultProps;鐘舵€?鍒濆鐘舵€侊紱//...}鐜板湪锛屼箥涓€鐪嬶紝寮€鍙戜汉鍛樼煡閬撶粍浠禔PI鏄粈涔堟牱瀛愶紝鍥犱负绗竴琛屼唬鐮佹竻妤氬湴琛ㄦ槑浜嗚繖涓€鐐广€傛澶栵紝鎴戜滑灏嗙紪璇戞椂澹版槑涓庤繍琛屾椂澹版槑鍒嗗紑銆?.涓哄瀛愭彁渚涙槑纭殑propsTypescript鍙嶆槧浜哛eact濡備綍閫氳繃鍦ㄥ嚱鏁扮粍浠跺拰绫荤粍浠剁殑react.d.ts涓皢瀹冧滑娉ㄩ噴涓哄彲閫夋潵澶勭悊瀛恜rops銆傚洜姝わ紝鎴戜滑闇€瑕佹樉寮忓湴涓篶hildren鎻愪緵涓€涓猵rops绫诲瀷銆備絾鏄紝鏈€濂界敤绫诲瀷鏄惧紡娉ㄩ噴瀛愬睘鎬с€傝繖鍦ㄦ垜浠兂瑕佷娇鐢╟hildren杩涜鍐呭鎶曞奖鐨勬儏鍐典笅寰堟湁鐢紝濡傛灉鎴戜滑鐨勭粍浠朵笉浣跨敤瀹冿紝鎴戜滑鍙互绠€鍗曞湴鐢╪ever绫诲瀷瀵瑰叾杩涜娉ㄩ噴銆傝€冭檻浠ヤ笅浠g爜锛歩mportReact,{Component}from"react";//Card.tsxtypeProps={children:React.ReactNode}classCardextendsComponent{render(){const{children}=this.props;杩斿洖

{children}
;杩欓噷鏈変竴浜涘甫娉ㄩ噴鐨勫効绔ラ亾鍏风被鍨嬶細鍙嶅簲鍎跨|ReactElement瀵逛簬鍘熷绫诲瀷锛歴tring|缂栧彿|boolean瀵硅薄鍜屾暟缁勪篃鏄湁鏁堢被鍨嬬┖|undefined鈥撴敞鎰忥細涓嶅缓璁娇鐢╪ull鍜寀ndefined4銆備娇鐢ㄧ被鍨嬫帹鏂潵瀹氫箟缁勪欢鐘舵€佹垨DefaultProps鍙傝浠ヤ笅浠g爜锛?string}classCounterextendsComponent{staticdefaultProps:DefaultProps={name:"JohnDoe"}state={count:0}//...}铏界劧涓婇潰鐨勪唬鐮佹湁鏁堬紝浣嗘垜浠彲浠ユ敼杩涘畠锛氫娇TypeScript鐨勭被鍨嬬郴缁熻兘澶熸纭帹鏂彧璇荤被鍨嬶紝渚嬪DefaultProps鍜宨nitialState銆備负浜嗛槻姝㈢敱浜庢剰澶栬缃姸鎬佽€屽鑷寸殑寮€鍙戦敊璇細this.state={}鑰冭檻浠ヤ笅浠g爜锛歩mportReact,{Component}from"react";constinitialState=Object.freeze({count:0})constdefaultProps=Object.freeze({name:"JohnDoe"})typeState=typeofinitialState;typeProps={someProps:string}&typeofdefaultProps;classCounterextendsComponent{staticreadonlydefaultProps=defaultProps;readonlystate={count:0}//...}鍦ㄤ笂闈㈢殑浠g爜涓紝閫氳繃鍐荤粨DefaultProps鍜宨nitialState锛孴ypeScript绫诲瀷绯荤粺鐜板湪鍙互灏嗗畠浠帹鏂负鍙绫诲瀷銆傛澶栵紝閫氳繃鍦ㄧ被涓皢闈欐€乨efaultProps鍜宻tate鏍囪涓哄彧璇伙紝鎴戜滑娑堥櫎浜嗚缃姸鎬佸鑷翠笂杩拌繍琛屾椂閿欒鐨勫彲鑳芥€с€?.澹版槑Props/State鏃朵娇鐢ㄧ被鍨嬪埆鍚嶏紙type锛夎€屼笉鏄帴鍙o紙interface锛夎櫧鐒跺彲浠ヤ娇鐢╥nterface锛屼絾鏄负浜嗕竴鑷存€у拰娓呮櫚搴︼紝鏈€濂借繕鏄娇鐢╰ype锛屽洜涓烘湁浜涙儏鍐典笅interface鏄涓嶉€氱殑銆備緥濡傦紝鍦ㄥ墠闈㈢殑绀轰緥涓紝鎴戜滑閲嶆瀯浜嗕唬鐮侊紝浠ヤ究TypeScript鐨勭被鍨嬬郴缁熼€氳繃浠庡疄鐜颁腑瀹氫箟鐘舵€佺被鍨嬫潵姝g‘鎺ㄦ柇鍙绫诲瀷銆傛垜浠笉鑳藉儚涓嬮潰鐨勪唬鐮侀偅鏍蜂娇鐢ㄨ繖涓ā寮忕殑鎺ュ彛锛?/workstypeState=typeofinitialState;typeProps={someProps:string}&typeofdefaultProps;//throwserrorinterfaceState=typeofinitialState;interfaceProps={someProps:瀛楃涓瞹&typeofdefaultProps;姝ゅ锛屾垜浠笉鑳戒娇鐢ㄨ仈鍚堝拰浜ら泦鍒涘缓鐨勭被鍨嬫潵鎵╁睍鎺ュ彛锛屽洜姝ゅ湪杩欎簺鎯呭喌涓嬫垜浠繀椤讳娇鐢ㄧ被鍨嬨€?.涓嶈鍦ㄦ帴鍙?绫诲瀷涓娇鐢ㄦ柟娉曞0鏄庤繖纭繚浜嗘垜浠唬鐮佷腑妯″紡鐨勪竴鑷存€э紝鍥犱负閫氳繃绫诲瀷/鎺ュ彛鎺ㄦ柇鐨勬墍鏈夋垚鍛橀兘浠ョ浉鍚岀殑鏂瑰紡澹版槑銆傛澶栵紝--strictFunctionTypes浠呭湪姣旇緝鍑芥暟鑰屼笉鏄柟娉曟椂鏈夋晥銆傛偍鍙互浠庤繖涓猅S闂涓緱鍒拌繘涓€姝ョ殑瑙i噴銆?/Don'tdointerfaceCounter{start(count:number):stringreset():void}//DointerfaceCounter{start:(count:number)=>stringreset:()=>string}7.涓嶈浣跨敤FunctionComponent鎴栫畝绉癋C锛屽畾涔変竴涓姛鑳界粍浠躲€傚湪浣跨敤Typescript鍜孯eact鏃讹紝鍑芥暟缁勪欢鍙互鏈変袱绉嶅啓娉曪細浣滀负鏅€氬嚱鏁帮紝濡備笅浠g爜锛歵ypeProps={message:string};constGreeting=({message}:Props)=>
{message}
;浣跨敤React.FC鎴朢eact.FunctionComponent锛屽儚杩欐牱锛歩mportReact,{FC}from"react";typeProps={message:string};constGreeting:FC=(props)=>
{props
;浣跨敤FC鎻愪緵浜嗕竴浜涗紭鍔匡紝渚嬪displayName銆乸ropTypes鍜宒efaultProps绛夐潤鎬佸睘鎬х殑绫诲瀷妫€鏌ュ拰鑷姩瀹屾垚銆備絾瀹冩湁涓€涓牬鍧廳efaultProps鍜屽叾浠栧睘鎬х殑宸茬煡闂锛歱ropTypes銆乧ontextTypes銆乨isplayName銆侳C杩樻彁渚涗簡涓€涓殣寮忕被鍨嬬殑瀛愬睘鎬э紝瀹冧篃鏈夊凡鐭ラ棶棰樸€傛澶栵紝濡傚墠鎵€杩帮紝缁勪欢API搴旇鏄樉寮忕殑锛屽洜姝ら殣寮忕被鍨嬬殑瀛愬睘鎬т笉鏄渶浣抽€夋嫨銆?.涓嶈瀵圭被缁勪欢浣跨敤鏋勯€犲嚱鏁版湁浜嗘柊鐨勭被灞炴€ф彁妗堬紝涓嶅啀闇€瑕佸湪JavaScript绫讳腑浣跨敤鏋勯€犲嚱鏁般€備娇鐢ㄦ瀯閫犲嚱鏁版秹鍙婅皟鐢╯uper()鍜屼紶閫抪rops锛岃繖寮曞叆浜嗕笉蹇呰鐨勬牱鏉垮拰澶嶆潅鎬с€傛垜浠彲浠ヤ娇鐢ㄨ繖鏍风殑绫诲瓧娈垫潵缂栧啓鏇寸畝娲併€佹洿鏄撲簬缁存姢鐨凴eact绫荤粍浠讹細//Don'tdotypeState={count:number}typeProps={}classCounterextendsComponent{constructor(props:Props){瓒呯骇(閬撳叿);this.state={count:0}}}//DotypeState={count:number}typeProps={}classCounterextendsComponent{state={count:0}}鍦ㄤ笂闈㈢殑浠g爜涓紝鎴戜滑鐪嬪埌浣跨敤绫诲睘鎬ф秹鍙婅緝灏戠殑鏍锋澘鏂囦欢锛屽洜姝ゆ垜浠笉蹇呭鐞唗his鍙橀噺銆?.涓嶈鍦ㄧ被涓娇鐢╬ublic鍏抽敭瀛楄€冭檻浠ヤ笅浠g爜锛氶粯璁ゆ儏鍐典笅锛屾墍鏈夋垚鍛樺湪杩愯鏃堕兘鏄叕寮€鐨勶紝鍥犳鏃犻渶閫氳繃鏄惧紡浣跨敤public鍏抽敭瀛楁潵娣诲姞棰濆鐨勬牱鏉挎枃浠躲€傜浉鍙嶏紝浣跨敤浠ヤ笅妯″紡锛歩mport{Component}from"react"classFriendsextendsComponent{fetchFriends(){}render(){return//jsxblob}}10.涓嶈鍦ㄧ粍浠剁被涓娇鐢╬rivate鑰冭檻浠ヤ笅浠g爜锛歩mport{Component}from"react"classFriendsextendsComponent{privatefetchProfileByID(){}render(){return//jsxblob}}鍦ㄤ笂闈㈢殑浠g爜涓紝private鍙湪缂栬瘧鏃朵娇fetchProfileByID鏂规硶绉佹湁锛屽洜涓哄畠鍙槸A鎵撳瓧绋挎ā鎷熴€備絾鏄紝鍦ㄨ繍琛屾椂锛宖etchProfileByID鏂规硶浠嶇劧鏄叕鍏辩殑銆傛湁涓嶅悓鐨勬柟娉曞彲浠ヤ娇JavaScript绫荤殑灞炴€?鏂规硶绉佹湁鍖栵紝浣跨敤涓嬪垝绾?\_)鍙橀噺鍛藉悕鍘熷垯濡備笅锛?jsxblob}}铏界劧杩欏苟娌℃湁鐪熸浣縡etchProfileByID鏂规硶鎴愪负绉佹湁鏂规硶锛屼絾瀹冨緢濂藉湴鍚戝叾浠栧紑鍙戜汉鍛樹紶杈句簡鎴戜滑鐨勬剰鍥撅紝鍗虫寚瀹氭柟娉曞簲琚涓虹鏈夋柟娉曘€傚叾浠栨妧鏈寘鎷娇鐢╓ea鈥嬧€媖Maps銆丼ymbols鍜屼綔鐢ㄥ煙鍙橀噺銆備絾鏄湁浜嗘柊鐨凟CMAScript绫诲瓧娈垫彁妗堬紝鎴戜滑鍙互閫氳繃浣跨敤绉佹湁瀛楁杞绘澗鑰屼紭闆呭湴瀹炵幇杩欎竴鐐癸紝濡備笅鎵€绀猴細blob}}骞朵笖TypeScript鍦?.8鍙婃洿楂樼増鏈腑鏀寔绉佹湁瀛楁鐨勬柊JavaScript璇硶銆傚鍔憋細涓嶈浣跨敤鏋氫妇灏界鏋氫妇鏄疛avaScript涓殑淇濈暀瀛楋紝浣嗕娇鐢ㄦ灇涓惧苟涓嶆槸鏍囧噯鐨勬儻鐢↗avaScript妯″紡銆備絾鏄紝濡傛灉鎮ㄤ娇鐢ㄧ殑鏄疌#鎴朖AVA涔嬬被鐨勮瑷€锛岄偅涔堜娇鐢ㄦ灇涓惧彲鑳戒細寰堣浜恒€傜劧鑰岋紝鏈夋洿濂界殑妯″紡锛屾瘮濡傚儚杩欐牱浣跨敤缂栬瘧绫诲瀷瀛楅潰閲忥細//涓嶈杩欐牱鍋歵histype鍝嶅簲=鎴愬姛|澶辫触|PendingfunctionfetchData(status:Response):void=>{//somecode.}鎬荤粨姣棤鐤戦棶锛屼娇鐢═ypescript浼氱粰浣犵殑浠g爜澧炲姞寰堝棰濆鐨勬牱鏉夸唬鐮侊紝浣嗚繖鏍峰仛鐨勫ソ澶勬槸闈炲父鍊煎緱鐨勩€備负浜嗚浣犵殑浠g爜鏇村共鍑€銆佹洿濂斤紝涓嶈蹇樿瀹炴柦涓€涓仴澹殑TODO/issue娴佺▼銆傚畠灏嗗府鍔╂偍鐨勫伐绋嬪洟闃熶簡瑙f妧鏈€哄姟銆佸湪浠g爜搴撻棶棰樹笂杩涜鍗忎綔浠ュ強鏇村ソ鍦拌鍒掑啿鍒恒€傛湰鏂囩炕璇戣嚜锛歨ttps://dev.to/alexomeyer/10-...