React์ ์๋ก ์ถ๊ฐ๋ ์ฌํญ(๋ฉ๋ชจ, ํํฌ)์ ์ปค๋ฎค๋ํฐ๊ฐ ํด๋์ค๊ฐ ์๋ ๊ตฌ์ฑ ์์๋ก์์ ๊ธฐ๋ฅ์ผ๋ก ๋ ๋ง์ด ์ด๋ํ ๊ฒ์์ ๋ํ๋ ๋๋ค. F#์ ํด๋์ค ๊ตฌ๋ฌธ์ด ์ด ๋ชฉ์ ์ ์ํด ์ฝ๊ฐ ์ฅํฉํ๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ์ข์ ์์์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ฒฝํ์ ๊ฐ์ ํ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ ์ผ์ด ์ฌ์ ํ ์์ต๋๋ค.
FableConf์์ @vbfox ๋ ์์ฑ์ด ์ธ์๋ฅผ JS ๊ฐ์ฒด๋ก ์ปดํ์ผํ ์ ์๋๋ก ์ ์ํ์ผ๋ฏ๋ก props๋ก ํจ์ ๊ตฌ์ฑ ์์๋ฅผ ์ ์ํ ๋๋ง๋ค ๋ ์ฝ๋๋ฅผ ์ ์ธํ ํ์๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ค์ ๋์ :
type MyProps = { key: string; value1: int; value2: float[] }
let MyComponent (props: MyProps) =
div [] [...]
// Use
ofFunction MyComponent { key = "foo"; value1 = 5; value2 = [] } []
๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
let [<MagicAttribute>] MyComponent (key: string) (value1: int) (value2: float[]) () =
div [] [...]
// Use?
ofFunction2 (MyComponent "foo" 5 []) []
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๊ฒ์ ์ด๋ป๊ฒ ํธ์ถํ ์ง ๋ ผ์ํ๋ ๊ฒ์ ์์๋ค๋ ๊ฒ์ ์์์ฐจ๋ ธ์ต๋๋ค. ์์ ์ํ์์๋ ์คํ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ง์ง๋ง์ ๋จ์ ์ธ์๋ฅผ ์ถ๊ฐํ์ง๋ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ์์ ์ ์์ต๋๋ค.
์์น์ ์ผ๋ก F#์ ๋ง๋ฒ ์์ฑ์ ์ต๋ํ ํผํ๊ณ ์ถ์์ง๋ง ์ด ๊ฒฝ์ฐ์๋ ์ ๋นํ๋ ์ ์์ต๋๋ค. ๋์์ ์ต๋ช ๋ ์ฝ๋๊ฐ F#์ ๋ค์ด์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ค์ ์ด ์ํฉ์ ํด๊ฒฐํ ์ ์๊ณ ์ฐ๋ฆฌ๋ ํ์ค F#์ ๋ง์ถ ๊ฒ์ด๋ฉฐ F# ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์์ ์ด๊ธฐ์ ์์ ๊ฒ์ผ๋ก ๋ณด์ ๋๋ค .
๋์์ ์ต๋ช ๋ ์ฝ๋๊ฐ F#์ ๋ค์ด์ฌ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ๋๋ค.
์ด ๋ฌธ์ ๋ ์ด๋ฏธ F# ๋ถ๋ถ์์ ํด๊ฒฐ๋์์ผ๋ฉฐ Fable์ ๋ ์ฝ๋๋ฅผ ์ ์ํ๋ ๋์์ด ์ด๋ฏธ ์์ผ๋ฏ๋ก ์ต๋ช ์ ๋ ์ฝ๋๊ฐ ์๊ธธ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๊ฐ๊น์ด ์์ผ ๋ด์ ์ ๊ฑฐ๋ ๊ธฐ๋ฅ๋ง ์ถ๊ฐํ๊ฒ ๋ฉ๋๋ค. ๊ตฌํ, ํ ์คํธ, ๋ฌธ์ํ, ๋ช ๊ฐ์ง ์์ ํจ๊ป ์ถ๊ฐํด์ผ ํ๋ ๊ฒ์ ๋งํ ๊ฒ๋ ์๊ณ ์ฌ์ฉ์๋ Fable ํน์ ์ ๋ฌด๊ธฐ๊ณ ์์ ๋ ๋ค๋ฅธ ์์ฑ์ ๋ฐฐ์์ผ ํฉ๋๋ค. ์๋ฐ ์คํฌ๋ฆฝํธ ์ผ์
์ต๋ช ์ F# ๋ ์ฝ๋๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์ฐฌ์ฑํฉ๋๋ค.
์ต๋ช ๋ ์ฝ๋๋ ์ฌ์ ํ ๋งค์ฐ ์ฅํฉํฉ๋๋ค.
// Declaration
let userView = namedMemo "User" (fun ({| UserId: string; Name: string |}) ->
a [Href (sprintf "/%s/" props.UserId)] [str props.Name])
// Usage
ofElementType userView { UserId = "vbfox"; Name = "Julien Roncaglia" } []
์ ์ ๊ธฐ๋ก:
// Declaration
type UserViewProps = { UserId: string; Name: string }
let userView = namedMemo "User" (fun props ->
a [Href (sprintf "/%s/" props.UserId)] [str props.Name])
// Usage
ofElementType userView { UserId = "vbfox"; Name = "Julien Roncaglia" } []
ํ์ง๋ง ๋ด ์ ์์ ๋ํด ์๊ฐํ๋ฉด ํ ์๋ก ๋ฌธ์ ๊ฐ ๋ ๋ง์ด ๋ณด์ ๋๋ค... ์ด๋ฌํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ผ๋ ๊ธฐ๋ฅ ๊ตฌ์ฑ ์์๋ ์๋ํ ์ ์์ง๋ง ์ธ์ ์ด๋ฆ์ด ์ปดํ์ผ๋ฌ์์ ์์ค๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ์ ๊ฐ์ ๋ํ๋ ๊ตฌ์ฑ ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ( :(
@alfonsogarciacaro ์ด
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ต๋ช ๋ ์ฝ๋๋ ์ฌ์ ํ ๋งค์ฐ ์ฅํฉํฉ๋๋ค.
์ ์ ๊ธฐ๋ก:
ํ์ง๋ง ๋ด ์ ์์ ๋ํด ์๊ฐํ๋ฉด ํ ์๋ก ๋ฌธ์ ๊ฐ ๋ ๋ง์ด ๋ณด์ ๋๋ค... ์ด๋ฌํ ๊ธฐ๋ณธ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ผ๋ ๊ธฐ๋ฅ ๊ตฌ์ฑ ์์๋ ์๋ํ ์ ์์ง๋ง ์ธ์ ์ด๋ฆ์ด ์ปดํ์ผ๋ฌ์์ ์์ค๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ์ ๊ฐ์ ๋ํ๋ ๊ตฌ์ฑ ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ( :(
@alfonsogarciacaro ์ด