ΠΠΎΠ²ΡΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊ 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 []) []
Π― ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΌΠ΅ΡΠΈΠ», ΡΡΠΎ ΠΌΡ Π·Π°Π±ΡΠ»ΠΈ ΠΎΠ±ΡΡΠ΄ΠΈΡΡ, ΠΊΠ°ΠΊ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ. Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Ρ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π°ΡΠ³ΡΠΌΠ΅Π½Ρ unit Π² ΠΊΠΎΠ½ΡΠ΅, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, Π½ΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ ΡΠΏΠΎΡΠΎΠ±Ρ.
Π ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅, Ρ Ρ ΠΎΡΠ΅Π» ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΌΠ°Π³ΠΈΡΠ΅ΡΠΊΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π² F #, Π½ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΡΠΎ ΠΌΠΎΠ³Π»ΠΎ Π±ΡΡΡ ΠΎΠΏΡΠ°Π²Π΄Π°Π½ΠΎ. ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π½Π΅ Π²ΠΎΠΉΠ΄ΡΡ Π² F #. ΠΠ½ΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΈ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°ΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΡ F #, ΠΈ, ΠΏΠΎΡ ΠΎΠΆΠ΅, ΠΎΠ½ΠΈ ΠΏΠΎΡΠ²ΡΡΡΡ Π½Π° ΡΠ°Π½Π½ΠΈΡ ΡΡΠ°ΠΏΠ°Ρ ΠΏΡΠ΅Π²ΡΡ F # .
ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΎΠΉ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π½Π΅ Π²ΠΎΠΉΠ΄ΡΡ Π² F #.
ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠΆΠ΅ ΡΠ΅ΡΠ΅Π½Π° Π² ΡΠ°ΡΡΠΈ F #, Π° Π² Fable ΡΠΆΠ΅ Π΅ΡΡΡ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° ΠΏΡΡΠ΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠΈ, Ρ Π±Ρ ΠΏΠΎΡΠΎΠ²Π΅ΡΠΎΠ²Π°Π» ΠΏΠΎΠ΄ΠΎΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° Ρ Π½Π°Ρ Π½Π΅ ΠΏΠΎΡΠ²ΡΡΡΡ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ. Π ΠΏΡΠΎΡΠΈΠ²Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π°Π»Π΅Π½Π° Π² Π±Π»ΠΈΠΆΠ°ΠΉΡΠ΅ΠΌ Π±ΡΠ΄ΡΡΠ΅ΠΌ, Π½Π΅ Π³ΠΎΠ²ΠΎΡΡ ΡΠΆΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±ΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°, ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°Π½Π°, Π·Π°Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π°, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ββΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌΠΈ ΠΏΡΠΈΠΌΠ΅ΡΠ°ΠΌΠΈ, ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ Π½ΡΠΆΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΠΈΠ·ΡΡΠΈΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π°ΡΡΠΈΠ±ΡΡ ΡΡΠ΄ΠΎΠΌ Ρ ΠΈΡ Π°ΡΡΠ΅Π½Π°Π»ΠΎΠΌ ΠΏΡΠΈΡΡΠ΄ Fable, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅Π»Π°ΡΡ javascripty Π²Π΅ΡΠΈ
Π― Π·Π° ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ Π°Π½ΠΎΠ½ΠΈΠΌΠ½ΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ 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" } []
ΠΠΎ ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Ρ Π΄ΡΠΌΠ°Ρ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Ρ Π²ΠΈΠΆΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Π½ΠΈΠΌ ... ΠΠ°ΠΆΠ΅ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠΌ ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π±Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ, Π½ΠΎ Π½Π΅ ΠΎΠ±Π΅ΡΠ½ΡΡΡΠΌ, ΡΠ°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ memo, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠΌΠ΅Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠ΅ΡΡΠ½Ρ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° :(: (:(
ΠΡΠΌΠ°Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΊΡΡΡΡ ΡΡΠΎΡ @alfonsogarciacaro. Π―
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
ΠΠ½ΠΎΠ½ΠΈΠΌΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Ρ:
ΠΠΎΡΠΌΠ°Π»ΡΠ½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ:
ΠΠΎ ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Ρ Π΄ΡΠΌΠ°Ρ ΠΎ ΡΠ²ΠΎΠ΅ΠΌ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΠ΅ΠΌ Π±ΠΎΠ»ΡΡΠ΅ Ρ Π²ΠΈΠΆΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Ρ Π½ΠΈΠΌ ... ΠΠ°ΠΆΠ΅ Ρ ΡΠ°ΠΊΠΈΠΌ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²ΠΎΠΌ ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠ» Π±Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ, Π½ΠΎ Π½Π΅ ΠΎΠ±Π΅ΡΠ½ΡΡΡΠΌ, ΡΠ°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ memo, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΈΠΌΠ΅Π½Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² Π±ΡΠ΄ΡΡ ΠΏΠΎΡΠ΅ΡΡΠ½Ρ ΠΈΠ· ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° :(: (:(
ΠΡΠΌΠ°Ρ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΊΡΡΡΡ ΡΡΠΎΡ @alfonsogarciacaro. Π―