Feliz: ์งˆ๋ฌธ: Happy.ElmishComponents ๋Œ€ Happy.UseElmish

์— ๋งŒ๋“  2020๋…„ 10์›” 08์ผ  ยท  9์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Zaid-Ajaj/Feliz

์•ˆ๋…•ํ•˜์„ธ์š” ์นœ๊ตฌ๋‹˜, ์ œ๊ฐ€ ์ข€ ์—‰๋šฑํ•œ ์งˆ๋ฌธ์œผ๋กœ ๋‹น์‹ ์„ ๊ท€์ฐฎ๊ฒŒ ํ•œ์ง€ ์˜ค๋ž˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ์งˆ๋ฌธ์„ ํ•  ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค. ๐Ÿ˜‚

Feliz.ElmishComponents ์™€ Feliz.UseElmish ์˜ ์ฐจ์ด์ ์„ ์–ด๋–ป๊ฒŒ ํ•ด์„œ๋“  ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋‘˜ ๋‹ค Elmish MVU ๋ถ€ํ’ˆ์ด ์žˆ๋Š” React ๊ตฌ์„ฑ ์š”์†Œ์ž„์„ ๋ด…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋Œ€์‹  ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Feliz.UseElmish ์˜ ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์„ ์ข‹์•„ํ•˜๊ณ  ์—ฌ๊ธฐ์—์„œ ๋” ๋ฉ‹์ง„ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค๋Š” ๋‘๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‹ค๋ฅธ ๋Œ€์‹  ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Feliz.UseElmish์˜ ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๊ณ  ์—ฌ๊ธฐ์„œ ๋” ๋ฉ‹์ง„ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๋‘๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

์•ˆ๋…•ํ•˜์„ธ์š” ๋กœ๋งŒ, ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค!

์–ธ๊ธ‰ํ•œ Cody์™€ ๊ฐ™์€ ์ฐจ์ด์ ์€ Feliz.ElmishComponents ์˜ ์ „์ฒด ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ Feliz.UseElmish ๊ฐ€ ํ›„ํฌ๋กœ ์ž‘์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์ „์ฒด ์ด์•ผ๊ธฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. Feliz.UseElmish ๋Š” Feliz.ElmishComponents ํฐ ์ฐจ์ด์ ์ธ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋กœ ์ข…์†์„ฑ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ _hook ์˜๋ฏธ๋ก _์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค

Feliz.UseElmish ๋Š” ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ตฌ๋…๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํ›„ํฌ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

"์žฌ์ดˆ๊ธฐํ™”"๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด URL ๋ณ€๊ฒฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

#/user=profile/{userId} -> UserProfile { UserId = userId }

๊ธฐ๋ณธ์ ์œผ๋กœ UserId ๋ณ€๊ฒฝ๋˜๋ฉด UserProfile ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค( init ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์žฌ์„ค์ •ํ•จ).

type UserProfileProps = { UserId : int }

let UserProfile = React.functionComponent("UserProfile", fun (props: UserProfileProps) -> 
  let state, dispatch = React.useElmish(init props.UserId, update, [| props.UserId |])
  Html.h1 (sprintf "UserProfile(UserId=%d)" props.UserId)
)

// later on application  entry: 

React.router [
  router.onUrlChange (parseUrl >> UrlChanged >> dispatch) 
  router.children [
     match state.CurrentUrl with
     | [ "user-profile"; Route.Int userId ] -> UserProfile { UserId = userId }
     | _ -> Html.h1 "Not found" 
  ]
]

ํ›„ํฌ(ํ›„ํฌ์— ๋Œ€ํ•œ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜)์— ์ข…์†์„ฑ ๋ฐฐ์—ด [| props.UserId |] ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์ณ์ง€๊ณ  init ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ Elmish ๋””์ŠคํŒจ์น˜ ๋ฃจํ”„๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ init ๊ฐ€ ์ž…๋ ฅ props.UserId ์˜ ํ•จ์ˆ˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ตฌ์„ฑ ์š”์†Œ์˜ props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

init ๋˜๋Š” update ํ•จ์ˆ˜ ๋ชจ๋‘ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์†Œํ’ˆ์—์„œ ์ถ”๊ฐ€ ์ž…๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋นˆ ์ข…์†์„ฑ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

let state, dispatch = React.useElmish(init, update, [| |])

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ž…๋ ฅ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ฐ™์ด ์™ธ๋ถ€์—์„œ ์ž…๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ข…์†์„ฑ ๋ฐฐ์—ด์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํฌ ๋ฌธ์„œ์—์„œ ์กฐ๊ฑด๋ถ€๋กœ ํšจ๊ณผ ๋ฐœ์ƒ ์—์„œ ์ž์„ธํžˆ ์ฝ์–ด๋ณด์„ธ์š”.

๋งˆ์ง€๋ง‰ ํŒ: Feliz.UseElmish ๋Š” ๊ธฐ์กด Elmish ์•ฑ์— ์ต์ˆ™ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์™„์ „ํ•œ Elmish ๋””์ŠคํŒจ์น˜ ๋ฃจํ”„๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹จ์ˆœํ•  ๋•Œ ์ƒํƒœ ๋ฐ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์œ ํ˜•์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ƒํƒœ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด React.useState ๊ฐ€ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒํƒœ ๋ณ€์ˆ˜๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ƒํ˜ธ ์ž‘์šฉ ์—†์ด ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ Œ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด React.useDeferred ๊ฐ€ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋งŽ๊ณ  ์‚ฌ์šฉ ์ƒํ˜ธ ์ž‘์šฉ์ด ๋งŽ์€ ๋ณต์žกํ•œ ํŽ˜์ด์ง€์—๋Š” Feliz.UseElmish๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  9 ๋Œ“๊ธ€

๋”ฐ๋ผ์„œ Feliz.ElmishComponents ๋Š” ๋” ์ด์ƒ ์œ ์šฉํ•˜์ง€ ์•Š์œผ๋ฉฐ Feliz.UseElmish ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์›๋ž˜ Feliz.ElmishComponents ๊ฐ€ ํด๋ž˜์Šค ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ ์š”์†Œ์˜€๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋‹ค์‹œ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ์กฐ๊ธˆ ํ›„์— ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋ผ๋ฉด ๊ทธ๊ฒƒ์„ ํ›„ํฌ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ„๋‹จํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Feliz.UseElmish ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ Feliz.ElmishComponents ๋Š” ์‹ค์ œ๋กœ ํ›„ํฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค, Feliz.ElmishComponents ์— ๋Œ€ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด๋ฉด ์ง€๊ธˆ ์€ ์žˆ์Šต๋‹ˆ๋‹ค .

๊ณ ๋งˆ์›Œ, ์ฝ”๋””!!! ๋”ฐ๋ผ์„œ ๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์–ป๋Š”๋‹ค๋ฉด Feliz.UseElmish ๊ฐ€ ๋ฐ”๋กœ ์ง€๊ธˆ ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค.

๋„ค, ์‚ฌ๋žŒ๋“ค์„ ํ•ด์น˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ์—ฌ์ „ํžˆ Feliz.ElmishComponents ์žˆ์Šต๋‹ˆ๋‹ค. ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™„๋ฒฝํ•œ! ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

"๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š”" ๊ฒฝ์šฐ "์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ"์œผ๋กœ ํ‘œ์‹œํ•˜๊ณ  ์‚ฌ๋žŒ๋“ค์„ ๊ถŒ์žฅ API๋กœ ๋ฆฌ๋””๋ ‰์…˜ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?

์˜ˆ, F# ํŒ€์˜ ๋™๋ฃŒ์™€ ๋ฌธ์„œ์— ๋Œ€ํ•œ PR์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๋…ผ์˜ ์ค‘์ž…๋‹ˆ๋‹ค(์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋งํฌ ํฌํ•จ).

์ข‹์•„, ๋‚˜๋Š” ์—ฌ๊ธฐ์—์„œ ๊ทธ๊ฒƒ์„ํ–ˆ๋‹ค - https://github.com/Zaid-Ajaj/Feliz/pull/264

๋‹ค๋ฅธ ๋Œ€์‹  ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” Feliz.UseElmish์˜ ์‚ฌ์šฉ์ด ๊ฐ„ํŽธํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๊ณ  ์—ฌ๊ธฐ์„œ ๋” ๋ฉ‹์ง„ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๋‘๋ ค์›€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜„

์•ˆ๋…•ํ•˜์„ธ์š” ๋กœ๋งŒ, ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค!

์–ธ๊ธ‰ํ•œ Cody์™€ ๊ฐ™์€ ์ฐจ์ด์ ์€ Feliz.ElmishComponents ์˜ ์ „์ฒด ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌํ˜„๊ณผ ๋‹ฌ๋ฆฌ Feliz.UseElmish ๊ฐ€ ํ›„ํฌ๋กœ ์ž‘์„ฑ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์ „์ฒด ์ด์•ผ๊ธฐ๋Š” ์•„๋‹™๋‹ˆ๋‹ค. Feliz.UseElmish ๋Š” Feliz.ElmishComponents ํฐ ์ฐจ์ด์ ์ธ ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๋กœ ์ข…์†์„ฑ ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•  ๋•Œ _hook ์˜๋ฏธ๋ก _์„ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค

Feliz.UseElmish ๋Š” ๋™์ผํ•œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ตฌ๋…๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ํ›„ํฌ์™€ ๊ฒฐํ•ฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

"์žฌ์ดˆ๊ธฐํ™”"๋ž€ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ๋‹ค์Œ๊ณผ ๊ฐ™์ด URL ๋ณ€๊ฒฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋กœ๋“œํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค.

#/user=profile/{userId} -> UserProfile { UserId = userId }

๊ธฐ๋ณธ์ ์œผ๋กœ UserId ๋ณ€๊ฒฝ๋˜๋ฉด UserProfile ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค( init ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ƒํƒœ๋ฅผ ์žฌ์„ค์ •ํ•จ).

type UserProfileProps = { UserId : int }

let UserProfile = React.functionComponent("UserProfile", fun (props: UserProfileProps) -> 
  let state, dispatch = React.useElmish(init props.UserId, update, [| props.UserId |])
  Html.h1 (sprintf "UserProfile(UserId=%d)" props.UserId)
)

// later on application  entry: 

React.router [
  router.onUrlChange (parseUrl >> UrlChanged >> dispatch) 
  router.children [
     match state.CurrentUrl with
     | [ "user-profile"; Route.Int userId ] -> UserProfile { UserId = userId }
     | _ -> Html.h1 "Not found" 
  ]
]

ํ›„ํฌ(ํ›„ํฌ์— ๋Œ€ํ•œ ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜)์— ์ข…์†์„ฑ ๋ฐฐ์—ด [| props.UserId |] ์„ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ž๋™์œผ๋กœ ์ƒˆ๋กœ ๊ณ ์ณ์ง€๊ณ  init ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์—ฌ Elmish ๋””์ŠคํŒจ์น˜ ๋ฃจํ”„๋ฅผ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ init ๊ฐ€ ์ž…๋ ฅ props.UserId ์˜ ํ•จ์ˆ˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๊ตฌ์„ฑ ์š”์†Œ์˜ props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋‹ค์‹œ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

init ๋˜๋Š” update ํ•จ์ˆ˜ ๋ชจ๋‘ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์†Œํ’ˆ์—์„œ ์ถ”๊ฐ€ ์ž…๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ๋นˆ ์ข…์†์„ฑ ๋ฐฐ์—ด์„ ์ œ๊ณตํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

let state, dispatch = React.useElmish(init, update, [| |])

์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ž…๋ ฅ ๊ตฌ์„ฑ ์š”์†Œ์™€ ๊ฐ™์ด ์™ธ๋ถ€์—์„œ ์ž…๋ ฅ์ด ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ตฌ์„ฑ ์š”์†Œ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ข…์†์„ฑ ๋ฐฐ์—ด์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŽ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›„ํฌ ๋ฌธ์„œ์—์„œ ์กฐ๊ฑด๋ถ€๋กœ ํšจ๊ณผ ๋ฐœ์ƒ ์—์„œ ์ž์„ธํžˆ ์ฝ์–ด๋ณด์„ธ์š”.

๋งˆ์ง€๋ง‰ ํŒ: Feliz.UseElmish ๋Š” ๊ธฐ์กด Elmish ์•ฑ์— ์ต์ˆ™ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์™„์ „ํ•œ Elmish ๋””์ŠคํŒจ์น˜ ๋ฃจํ”„๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋‹จ์ˆœํ•  ๋•Œ ์ƒํƒœ ๋ฐ ๋ฉ”์‹œ์ง€์— ๋Œ€ํ•œ ์œ ํ˜•์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋„ˆ๋ฌด ๋งŽ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ƒํƒœ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด React.useState ๊ฐ€ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ƒํƒœ ๋ณ€์ˆ˜๋กœ ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ƒํ˜ธ ์ž‘์šฉ ์—†์ด ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ Œ๋”๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด React.useDeferred ๊ฐ€ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋งŽ๊ณ  ์‚ฌ์šฉ ์ƒํ˜ธ ์ž‘์šฉ์ด ๋งŽ์€ ๋ณต์žกํ•œ ํŽ˜์ด์ง€์—๋Š” Feliz.UseElmish๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์™€์šฐ, ์ „ํ˜•์ ์ธ Zaid์˜ ๋ฐ˜์‘์ž…๋‹ˆ๋‹ค. ๐Ÿ˜„ ๋‹น์‹ ์€ ๊ทธ๋Ÿฐ ๊ฒƒ๋“ค์„ ๊ฐ€๋ฅด์น˜๊ธฐ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋“œ๋””์–ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! โค๏ธ

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰