์๋ ํ์ธ์ ์น๊ตฌ๋, ์ ๊ฐ ์ข ์๋ฑํ ์ง๋ฌธ์ผ๋ก ๋น์ ์ ๊ท์ฐฎ๊ฒ ํ์ง ์ค๋์ ๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ ์ง๋ฌธ์ ํ ์๊ฐ์ ๋๋ค. ๐
Feliz.ElmishComponents
์ Feliz.UseElmish
์ ์ฐจ์ด์ ์ ์ด๋ป๊ฒ ํด์๋ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น? ๋๋ ๋ ๋ค Elmish MVU ๋ถํ์ด ์๋ React ๊ตฌ์ฑ ์์์์ ๋ด
๋๋ค. ๋ค๋ฅธ ๋์ ํ๋๋ฅผ ์ ํํ๋ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๊ฐ ์์ต๋๊น? ๋๋ Feliz.UseElmish
์ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๊ฒ์ ์ข์ํ๊ณ ์ฌ๊ธฐ์์ ๋ ๋ฉ์ง ๊ฒ์ ๋์น๊ณ ์์์ง๋ ๋ชจ๋ฅธ๋ค๋ ๋๋ ค์์ด ์์ต๋๋ค. ๐
๋ฐ๋ผ์ 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์ ๋ฐ์์ ๋๋ค. ๐ ๋น์ ์ ๊ทธ๋ฐ ๊ฒ๋ค์ ๊ฐ๋ฅด์น๊ธฐ ์์ํด์ผ ํฉ๋๋ค. ๋๋์ด ์ดํดํ ์ ์์ต๋๋ค. ๋ค์ ํ๋ฒ ๊ฐ์ฌํฉ๋๋ค! โค๏ธ
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์๋ ํ์ธ์ ๋ก๋ง, ์ข์ ์ง๋ฌธ์ ๋๋ค!
์ธ๊ธํ Cody์ ๊ฐ์ ์ฐจ์ด์ ์
Feliz.ElmishComponents
์ ์ ์ฒด ๊ตฌ์ฑ ์์ ๊ตฌํ๊ณผ ๋ฌ๋ฆฌFeliz.UseElmish
๊ฐ ํํฌ๋ก ์์ฑ๋๋ค๋ ๊ฒ์ ๋๋ค.๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์ ์ฒด ์ด์ผ๊ธฐ๋ ์๋๋๋ค.
Feliz.UseElmish
๋Feliz.ElmishComponents
ํฐ ์ฐจ์ด์ ์ธ ๋ง์ง๋ง ์ธ์๋ก ์ข ์์ฑ ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์์๋ฅผ ๋ค์ ์ด๊ธฐํํ ๋ _hook ์๋ฏธ๋ก _์ ๋ฐ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋คFeliz.UseElmish
๋ ๋์ผํ ๊ตฌ์ฑ ์์์ ๊ตฌ๋ ๊ณผ ๊ฐ์ ๋ค๋ฅธ ํํฌ์ ๊ฒฐํฉํ ์๋ ์์ต๋๋ค."์ฌ์ด๊ธฐํ"๋ ๋ฌด์์ ์๋ฏธํฉ๋๊น? ๋ค์๊ณผ ๊ฐ์ด URL ๋ณ๊ฒฝ์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉ์ ํ๋กํ ๊ตฌ์ฑ ์์๋ฅผ ๋ก๋ํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค.
๊ธฐ๋ณธ์ ์ผ๋ก
UserId
๋ณ๊ฒฝ๋๋ฉดUserProfile
๊ตฌ์ฑ์์๋ฅผ ๋ค์ ์ด๊ธฐํํ๋ ค๊ณ ํฉ๋๋ค(init
๋ฅผ ํธ์ถํ์ฌ ์ํ๋ฅผ ์ฌ์ค์ ํจ).ํํฌ(ํํฌ์ ๋ํ ์ธ ๋ฒ์งธ ์ธ์)์ ์ข ์์ฑ ๋ฐฐ์ด
[| props.UserId |]
์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ตฌ์ฑ ์์๋ ์๋์ผ๋ก ์๋ก ๊ณ ์ณ์ง๊ณinit
๋ค์ ํธ์ถํ์ฌ Elmish ๋์คํจ์น ๋ฃจํ๋ฅผ ์ฌ์ค์ ํฉ๋๋ค. ์ด๊ฒ์init
๊ฐ ์ ๋ ฅprops.UserId
์ ํจ์์๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ์ด๋ฏ๋ก ๊ตฌ์ฑ ์์์ props๊ฐ ๋ณ๊ฒฝ๋ ๋ ๋ค์ ํธ์ถํ๊ณ ์ถ์ต๋๋ค.init
๋๋update
ํจ์ ๋ชจ๋ ๊ตฌ์ฑ ์์์ ์ํ์์ ์ถ๊ฐ ์ ๋ ฅ์ด ํ์ํ์ง ์์ผ๋ฉด ๋น ์ข ์์ฑ ๋ฐฐ์ด์ ์ ๊ณตํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค.์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๋ ฅ ๊ตฌ์ฑ ์์์ ๊ฐ์ด ์ธ๋ถ์์ ์ ๋ ฅ์ด ํ์ํ์ง ์์ ๊ตฌ์ฑ ์์์ ์ฌ์ฉ๋ฉ๋๋ค.
์ข ์์ฑ ๋ฐฐ์ด์ ์ต์ํด์ง๋ ๊ฒ์ด ์ฝ๊ฐ ๊น๋ค๋ก์ธ ์ ์์ง๋ง ๋ง์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ํํฌ ๋ฌธ์์์ ์กฐ๊ฑด๋ถ๋ก ํจ๊ณผ ๋ฐ์ ์์ ์์ธํ ์ฝ์ด๋ณด์ธ์.
๋ง์ง๋ง ํ:
Feliz.UseElmish
๋ ๊ธฐ์กด Elmish ์ฑ์ ์ต์ํ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์์ ํ Elmish ๋์คํจ์น ๋ฃจํ๋ฅผ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ์ ๋ง ๊ฐ๋ ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ตฌ์ฑ ์์๊ฐ ๋จ์ํ ๋ ์ํ ๋ฐ ๋ฉ์์ง์ ๋ํ ์ ํ์ ์ค์ ํ๋ ๊ฒ์ ๋๋ฌด ๋ง์ ์ ์์ต๋๋ค. ๋ช ๊ฐ์ง ์ํ ํ๋๊ทธ๊ฐ ํ์ํฉ๋๊น? ๊ทธ๋ฌ๋ฉดReact.useState
๊ฐ ์๋ ๋ช ๊ฐ์ง ์ํ ๋ณ์๋ก ์ถฉ๋ถํ ์ ์์ต๋๋ค. ์ถ๊ฐ ์ํธ ์์ฉ ์์ด ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ ๋๋งํด์ผ ํฉ๋๊น? ๊ทธ๋ฌ๋ฉดReact.useDeferred
๊ฐ ํธ๋ฆญ์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ฒคํธ๊ฐ ๋ง๊ณ ์ฌ์ฉ ์ํธ ์์ฉ์ด ๋ง์ ๋ณต์กํ ํ์ด์ง์๋ Feliz.UseElmish๋ฅผ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.