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

【JavaScriptWeekly#570】Svelte与React对比

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

馃コ娆㈣繋鎰熷叴瓒g殑灏忎紮浼达紝涓€璧锋潵鍋氱偣鏈夋剰涔夌殑浜嬫儏鍚э紒鎴戝彂璧蜂簡涓€涓瘡鍛ㄧ炕璇戦」鐩€備粨搴撳湴鍧€鍜岃闂湴鍧€杩樺緢缂哄織鍚岄亾鍚堢殑灏忎紮浼淬€傝繖绾补鏄釜浜哄叴瓒c€傚綋鐒讹紝涔熸湁鍔╀簬鎻愰珮鑻辫鍜屽墠绔妧鑳姐€傝姹傦細鑻辫涓嶈兘宸殑绂昏氨锛実ithub绮鹃€氾紝鏈夋瘏鍔涳紝璋﹁櫄锛屽仛浜嬫湁璐d换鎰熴€傛兂鍙備笌鐨勬湅鍙嬪彲浠ョ淇x鎴栬€呯粰浠撳簱鍙慽ssue娑堟伅銆傛垜鐨勫崥瀹篃鏈夊叿浣撶殑涓汉鑱旂郴鏂瑰紡锛歞aodaolee.cn鍓嶈█Pomodone锛氫竴涓熀浜?5鍒嗛挓闂撮殧宸ヤ綔鐨凱omodoro宸ヤ綔鐨勬椂闂磋窡韪皬搴旂敤銆傚畠鏈変竴涓?5鍒嗛挓鐨勮鏃跺櫒锛堝湪WebWorker涓繍琛岋級骞跺皢鈥減oms鈥濈殑鍘嗗彶璁板綍淇濆瓨鍒颁竴涓皬鍨婩irebase鏁版嵁搴撲腑锛孭ortal鍜孯eact鐨勯挬瀛愮殑浣跨敤鏄竴涓緢濂界殑鍖呰鍣紝鎴戝垱寤轰簡涓€涓猽seCurrentUser閽╁瓙鏉ョ洃鍚韩浠介獙璇佹洿鏀瑰苟鐩稿簲鍦拌缃竴浜涚姸鎬併€傜劧鍚庯紝褰撴敞鎰忓埌韬唤楠岃瘉鏇存敼鏃讹紝鎴戝彲浠ョ‘淇eact灏嗘寜闇€閲嶆柊鍛堢幇銆俥xportconstuseCurrentUser=()=>{const[currentUser,setCurrentUser]=useState(undefined)useEffect(()=>{returnfirebase.auth().onAuthStateChanged((details)=>{setCurrentUser(details?{displayName:details.displayName,provider:{'google.com':'Google','github.com':'GitHub',}[details.providerData[0].providerId],uid:details.uid,}:null)})},[])return[currentUser]}鍦ㄤ换浣曠粍浠朵腑锛屽彲浠ヨ繖鏍峰啓锛歝onst[currentUser]=useCurrentUser()杩欑鍐欐硶锛屽伐浣滈噺寰堝皬锛屼换浣曠粍浠堕兘鍙互蹇€熻闂埌褰撳墠鐢ㄦ埛銆傚敮涓€鐨勭己鐐规槸onAuthStateChanged鐨勨€嬧€嬬洃鍚櫒鍙兘鏈夊緢澶氾紝鍙互閫氳繃鍙粦瀹氫竴涓洃鍚櫒鎴栬€呭皢褰撳墠鐢ㄦ埛鏀惧湪褰撳墠涓婁笅鏂囦腑鏉ラ伩鍏嶃€傝鍒颁笂涓嬫枃锛屽畠鏇存帴杩戜簬瀹冨湪Svelte涓殑鍐欐硶锛歿currentUser.set({displayName:details.displayName,provider:{'google.com':'Google','github.com':'GitHub',}[details.providerData[0].providerId],uid:details.uid,})}else{currentUser.set(null)}})}鍦ㄩ珮绾velte缁勪欢涓紝鍙互鍦╫nMount涓皟鐢紝缁勪欢瀹夎鏃朵細杩愯涓€娆★紙璇ユ柟娉曚細杩斿洖锛屾墍浠ュ彲浠nsubscribe鍒犻櫎缁勪欢鏃讹紝灏卞儚useEffect杩斿洖鍑芥暟涓€鏍?onMount(()=>{returnlistenForAuthChanges()})鐜板湪锛屽湪Svelte浠g爜鐨勪换浣曞湴鏂癸紝缁勪欢閮藉彲浠ュ鍏urrentUser鍙啓瀛樺偍銆傛垜姣旇緝鍏冲績鐨勬槸currentUser涓嶆槸涓€涓€硷紝鑰屾槸涓€涓猻tore锛屾墍浠ュ畠鏈夌粷瀵圭殑鐘舵€佹帶鍒躲€傚綋鐒讹紝浣犱篃鍙互璁㈤槄瀹冨苟鎵嬪姩淇敼鐘舵€佸彉鍖栵細currentUser.subscribe(newValue=>{...})鎴栬€咃紝濡傛灉浣犲彧鎯宠鍙栨渶鏂扮殑鍊硷紝浣犲彲浠ユ坊鍔犱竴涓?鍓嶇紑锛歝onsole銆備笂闈㈢殑log($currentUser)鏄疭velte鐨勪竴浜涜娉曟妧宸с€?绗﹀彿灏嗚嚜鍔ㄨ闃呭晢搴椾腑鐨勬渶鏂板€笺€傚畠鐨勪紭鐐规槸Svelte涓嶅繀鍦ㄦ瘡娆¢渶瑕佽鍙栨渶鏂板€兼椂閮借繘琛岃闃呫€傜畝鑰岃█涔嬶紝杩欎袱涓簱浼间箮閮介噰鐢ㄤ簡绫讳技鐨勬柟娉曪細閮藉厑璁歌闃匜irebase渚﹀惉鍣紙涓婇潰鐨勬紨绀猴級锛屽苟鍦ㄧ姸鎬佹洿鏀规椂鏇存柊鏁版嵁銆傛垜浣跨敤Worker璁捐浜嗏€嬧€婸omodone)浠ュ敖鍙兘鍑嗙‘鍦颁繚鎸?5鍒嗛挓鐨勮鏃跺櫒杩愯銆傚鏋滄祻瑙堝櫒閫夐」鍗″湪鍚庡彴锛堜緥濡傦紝涓嶆槸鐒︾偣閫夐」鍗★級锛屽ぇ澶氭暟娴忚鍣ㄥ皢闄嶄綆鍏秙etTimeout璋冪敤鐨勪紭鍏堢骇锛岃€屼笉鏄弗鏍兼寜鏃惰繍琛屽畠浠€傚ぇ澶氭暟鏃跺€欒繖鍦ㄧ綉缁滀笂涓嶆槸浠€涔堝ぇ闂锛屼絾鏄綋鐢ㄦ埛閫氳繃鎮ㄧ殑搴旂敤璺熻釜25鍒嗛挓鐨勫伐浣滄椂锛屽畠灏卞彉鎴愪簡涓€涓棶棰橈紒姝ゅ锛屽湪25鍒嗛挓鐨勮繃绋嬩腑锛屼换浣曞井灏忕殑鏃垛€嬧€嬮棿宸紓閮戒細瀵艰嚧鏈€缁堟椂闂寸浉宸敋杩溿€備絾鏄紝濡傛灉灏嗚繖浜涜秴鏃剁Щ鍒癢ebWorker涓紝瀹冧滑灏变細鎸夋椂杩愯锛屽苟涓斾笉浼氳娴忚鍣ㄥ彇娑堜紭鍏堢骇銆傚洜姝わ紝鍦ㄦ垜鐨凾racker缁勪欢涓紝鎴戦渶瑕佸疄渚嬪寲涓€涓獁ebworker锛屽彂閫佷俊鎭拰鎺ユ敹鏁版嵁锛堟瘮濡傚墿浣欐椂闂达級銆傛垜鍙戠幇React姣擲velte绠$悊璧锋潵鏇撮夯鐑︺€傚洜涓烘瘡娆¢噸鏂版覆鏌撶粍浠堕兘浼氶噸鏂版墽琛孯eact缁勪欢锛屾墍浠ュ緢瀹规槗鍒涘缓鎴愬崈涓婁竾鐨剋orker銆傝繖鏃跺€欏氨闇€瑕佷娇鐢╱seRef鏉ュ紩鐢ㄥ垱寤虹殑worker鏉ラ伩鍏嶈繖涓棶棰樸€傞鍏堬紝鎴戣缃簡鎵€闇€鐨勭粍浠跺垵濮嬬姸鎬侊細const[currentPom,setCurrentPom]=useState(null)const[currentUser]=useCurrentUser()constworker=useRef(null)鐒跺悗锛屽垱寤轰竴涓猽seEffect閽╁瓙鏉ュ疄渚嬪寲worker锛岃繖鏄繀瑕佺殑濡傛灉鏄繖鏍凤紝缁戝畾鍙︿竴涓簨浠讹細useEffect(()=>{if(!worker.current){worker.current=newWorker(workerURL)window.worker=worker.current}constonMessage=(event)=>{if(event.data.name==='tick'){setCurrentPom((currentPom)=>({...currentPom,secondsRemaining:event.data.counter,}))}elseif(event.data.name==='start'){//姝ゅ鍒犻櫎浜嗘洿澶氬垎鏀互鑺傜渷绌洪棿...}}worker.current.addEventListener('message',onMessage)return()=>{worker.current.removeEventListener('message',onMessage)}},[currentUser])鎺ヤ笅鏉ワ紝褰撶敤鎴风偣鍑籗tart鎸夐挳鏃讹紝灏嗗悜worker鍙戦€佷竴鏉℃秷鎭細constonStartPom=()=>{if(!worker.current)returnworker.current.postMessage('startTimer')}濡傛灉鐢⊿velte鍐欙紝浠g爜灏卞緢similar锛屼絾鏄湁涓や釜鍦版柟浼氭洿瀹规槗锛氫笉闇€瑕佸皢worker淇濈暀鍦╱serRef涓婏紝浣犲彧闇€瑕佸垎閰嶄竴涓彉閲忓皢浜嬩欢鐩戝惉灏佽鎴愪竴涓嚱鏁帮紝璇ュ嚱鏁颁笉浼氭垚涓簎serEffect鐨勪緷璧栤€斺€斿嵆灏佽鍦╱serCallback涓璴etworkeronMount(()=>{worker=newWorker(workerURL)worker.addEventListener('message',onWorkerMessage)return()=>{worker.removeEventListener('message',onWorkerMessage)}})涓嶉渶瑕佺敤React鐨剆etX(oldX=>newX)绾︽潫璁剧疆鐘舵€侊紝鍙渶瑕佹敼鍙樺眬閮ㄥ彉閲忥細event.data.counter,}}elseif(event.data.name==='start'){//姝ゅ鍒犻櫎浜嗘洿澶氬垎鏀互鑺傜渷绌洪棿...}}鏉′欢娓叉煋鎴戝枩娆eact鐨勯儴鍒嗗師鍥犲湪浜庢ā鏉胯娉旹mbedJSin://React

    {pomsForCurrentDay.map(entryData,index)=>{constfinishedAt=format(newDate(entryData.timeFinished),'H:mm:ss')return{index+1}})}
浣嗘槸Svelte鐨勬ā鏉胯娉曚篃闈炲父鏈夌敤锛?/Svelte{#姣忎釜currentDayPoms浣滀负鍊硷紝绱㈠紩}{index+1}{/each}鍦ㄦ覆鏌撶粍浠舵椂锛孲velte鐨勮娉曚篃寰堢畝鍗曪紝寰堝儚JSX锛?/Svelte//Svelte(collapsedprops)鍝嶅簲寮廠velte涓殑$React闇€瑕乽serEffect绛塰ook鏉ユ帶鍒朵唬鐮佽繍琛岋紝骞跺湪缁勪欢閲嶆柊娓叉煋鏃堕噸鏂拌繍琛屼唬鐮併€備笉鍚屼箣澶勫湪浜庯紝榛樿鎯呭喌涓嬪ぇ澶氭暟浠g爜鍙細杩愯涓€娆°€傚綋鐒讹紝React鐨勯噸鏂版覆鏌撳湪杩愯鏁版嵁瀵嗛泦鍨嬭妭鐐规覆鏌搈ixin鏃朵篃鏈夊叾浼樺娍銆備緥濡傦細constinput=props.inputDataconsttransformed=input.map((item)=>transformItem(item))return
{JSON.stringify(transformed,null,2)}
濡傛灉鐢ㄦ埛鎻愪緵涓€涓柊鐨刾rops.inputData锛岀粍浠朵細閲嶆柊娓叉煋鏇存柊锛屽緱鍒扮殑鍊间篃鏄柊鐨勩€傚湪Svelte涓儏鍐靛苟闈炲姝わ細
{JSON.stringify(transformed,null,2)}
瑕佽В鍐冲搷搴斿紡闂锛岃涔堜娇鐢?绗﹀彿锛岃涔堝湪妯℃澘涓坊鍔犺浆鎹㈤€昏緫锛?/浣跨敤$
{JSON.stringify(transformed,null,2)}
//浣跨敤妯℃澘
{JSON.stringify(input.map((item=>transformItem(item))),null,2)}
澶嶅悎缁勪欢Combo缁勪欢鍦ㄧ粍浠剁骇妗嗘灦涓挨涓洪噸瑕侊紝React鐨刢hildren灞炴€х畝鍖栦簡娓叉煋锛歠unctionBox(props){return
{props.children}
}functionApp(){return(

helloworld!

)}Svelte浣跨敤鎻掓Ы锛?!--鐩掑瓙缁勪欢-->

helloworld!

褰撳涓瓙缁勪欢involved锛屼袱鑰呬細鏈夋墍涓嶅悓澶勭悊鏂瑰紡锛歊eact浼氭湁澶氫釜Props锛歠unctionBox(props){return(
{props.left}
{props.right}
)}functionApp(){returnhello

}right={

world!

}/>}浼氭樉绀篘amingmultipleslots:
hello

world!

绫诲悕鍒ゆ柇Svelte鏈変竴涓皬鍑芥暟鍙互鏈夋潯浠跺湴鍒嗛厤绫伙細浜嬩欢鐩戞帶Svelte鍖呭惈涓€浜涚敤浜庣粦瀹氫簨浠剁殑淇グ绗︼細鐐瑰嚮鎴戯紒