Feliz: [<reactcomponent>] рдмрдирд╛рдо React.functionComponent рд░рд┐рдПрдХреНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдореЗрдВ</reactcomponent>

рдХреЛ рдирд┐рд░реНрдорд┐рдд 25 рдирд╡ре░ 2020  ┬╖  10рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: Zaid-Ajaj/Feliz

рд╣реИрд▓реЛ рджреЛрд╕реНрдд,

рднреЛрд▓реЗ рд╡рд╛рдирд╛рдмреЗ рдлреНрд░рдВрдЯрдПрдВрдб рджреЗрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдЖрдпрд╛:

рдЖрдкрдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдШрдЯрдХреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП React.functionComponent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкрдХреНрд╖ рд▓реЗрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдмреЗрд╣рддрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХрд╛ рдирд╛рдо рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд░рд┐рдПрдХреНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреЗ рд╕рд╛рде рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдЖрддреА рд╣реИред

рдХреЛрдб рдореЗрдВ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рддреЗ рд╕рдордп рдЗрд╕ рддрд░рд╣ рдХрд╛ рдХреЛрдб рд╣рдореЗрд╢рд╛ рдкреВрд░реНрдг рдкреГрд╖реНрда рдкреБрдирдГ рд▓реЛрдб рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░рддрд╛ рд╣реИ:

let subView = React.functionComponent("SubView", fun () ->
    Html.text "Hello from sub"
)

let topView = React.functionComponent("TopView", fun () ->
    Html.div [ Html.div "Hello from top"; subView () ]
)

image

рд▓реЗрдХрд┐рди [<ReactComponent>] рд╕рд╛рде рд░реВрдЯ рдШрдЯрдХ рд╣реЛрдиреЗ рд╕реЗ рд╕рднреА рд░реАрдлреНрд░реЗрд╢ рдкреВрд░реНрдг рд░реАрдлреНрд░реЗрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред

let subView = React.functionComponent("SubView", fun () ->
    Html.text "Hello from sub"
)

[<ReactComponent>]
let topView () = Html.div [ Html.div "Hello from top"; subView () ]

рдХреНрдпрд╛ рдпрд╣ рдмрдЧ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдлреИрдВрд╕реА рдмреНрд▓реИрдХ рдЯрд╛рдИ рдЙрд░реНрдл тАЛтАЛрдлреАрдЪрд░ рдореЗрдВ рдмрдЧ рд╣реИ? рдХреНрдпрд╛ рдпрд╣ рдореЗрд░реА рд╕рд╛рд░реА рдЧрд▓рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ ReactComponent рд╡рд┐рд╢реЗрд╖рддрд╛ рдФрд░ React.functionComponent рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ? ЁЯШД

рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рддрд░рд╣ рдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╡рд╛рд╣! рдмрд╕ рд╡рд╛рд╣! рдореВрд░реНрдЦ рд╡реНрдпрдХреНрддрд┐ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдкреНрд░рд╢реНрди рдкреВрдЫрддрд╛ рд╣реИ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реЗ рднрд░реА рддреАрди рдП4 рд╢реАрдЯ рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИред рддреБрдо рдмрд╕ рд░реЙрдХ, рдпрд╛рд░! рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! тЭдя╕П рдЕрдм рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдЕрднреА рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ (рдЬреИрд╕реЗ рд╣рдордиреЗ React.functionComponent рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛) рдпрд╛ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ?

рд╕рднреА 10 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╡рд┐рд╢реЗрд╖рддрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЬрд╛рдиреЗ рдХрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реЛрдЧреА, рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рддрд╛рдЬрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ @ рдЬрд╝реИрдж-рдЕрдЬрд╛рдЬ рдХреЛ рдорд┐рд▓рд╛ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рдЕрдВрддрд░ рди рд╣реЛ?

рд╣рд╛рдп рд░реЛрдорди,

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫрд╛ рдкреНрд░рд╢реНрди рд╣реИ рдЬрд┐рд╕рдХрд╛ рдХреЛрдИ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдЙрддреНрддрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣рд╛рдБ рд╣рдо рдЪрд▓рддреЗ рд╣реИрдВред

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдмрд╛рд░ рдЬрдм рдореИрдВ рдШрд░ рдкрд░ рдЕрдкрдиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдореБрджреНрджреЛрдВ рдХреЛ рд╕реБрд▓рдЭрд╛ рд▓реЗрддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдлрд┐рд░ рд╕реЗ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реВрдВрдЧрд╛ рдЬрд╣рд╛рдВ рдореИрдВ рдЗрд╕реЗ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдореЗрдВ рд╕рдордЭрд╛рддрд╛ рд╣реВрдВ

рдЖрдкрдХреЗ рдбреЙрдХреНрд╕ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП React.functionComponent рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкрдХреНрд╖ рд▓реЗрддрд╛ рд╣реВрдВ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдмреЗрд╣рддрд░ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ рдХрд╛ рдирд╛рдо рднреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред рд░рд┐рдПрдХреНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреЗ рд╕рд╛рде рдордЬреЗрджрд╛рд░ рдмрд╛рдд рдЖрддреА рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдПрдХ рджреБрд░реНрднрд╛рдЧреНрдпрдкреВрд░реНрдг рд╕рдВрдХреНрд░рдордгрдХрд╛рд▓реАрди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд╣реИ: рдореВрд▓ рд░реВрдк рд╕реЗ рдирд╡реАрдирддрдо рдлрд╝реЗрд▓рд┐рдЬрд╝ рдФрд░ [<ReactComponent>] рдЕрдЪреНрдЫрд╛рдИ рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рдирд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╣рдо рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд▓рдЧрдЗрди рдореБрджреНрджреЛрдВ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ Fable рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП AST рдХреЛ рд╕реНрдерд┐рд░ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред . рдореИрдВ рдЬреЛ рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ React.functionComponent рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрдк Fable 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп [<ReactComponent>] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдХреИрд╕реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб рдЙрддреНрдкрдиреНрди рд╣реЛрддрд╛ рд╣реИ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рд╣реИред рдЕрдм рд░рд┐рдПрдХреНрдЯ рдХреЛрдб рдХреЗ рдЗрд╕ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

const App = ({ title }) => {
  return (
    <h1>{title}</h1>
  )
};

<App title="My React Application" />

рдпрд╣ JS (рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ JSX рд╣реИ ) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд JS рдХреЛрдб рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ

import { createElement } from 'react'

const App = ({ title }) => {
  return createElement("h1", null, title);
};

// <App /> compiles to a call to createElement
createElement(App, { title: "My React Application" })

рдпрд╣ рдзреНрдпрд╛рди рдореЗрдВ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреЗ рдкреНрд░рд╛рд░рдВрдн App рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХ <App ... /> рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ createElement рдЬреЗ рдПрд╕ рд╕реЗред

рдпрд╣ рджреЛ рдЪреАрдЬреЛрдВ рдХреЗ рдХрд╛рд░рдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ:

  • рдпрд╣ рдШрдЯрдХ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдЗрд╕рдХреЗ рдирд┐рд░реНрдорд╛рдг рд╕реЗ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реИ
  • рдпрд╣ App рдХреЛ рдПрдХ рд╕реНрдерд┐рд░ рдорд╛рди рд╣реЛрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (рдкрд╣рдЪрд╛рди рдЖрд░рдХреНрд╖рд┐рдд рд╣реИ рдЬрд┐рд╕рдХрд╛ рд░рд┐рдПрдХреНрдЯ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)

рдЕрдм, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ React.functionComponent рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рд╡рд╣ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд▓рд┐рдП "рдмреБрд░рд╛" рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред рдпрд╣ рдПрдл # рдХреЛрдб

let app React.functionComponent("App", fun (props: {|  tite: string |}) -> Html.h1 props.title)

рдХрд╣рдиреЗ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ

let app = 
  let render(props: {|  tite: string |}) = 
    let renderFn props= Html.h1 props.title
    createElement(renderFn , props)
  render.displayName <- "App"
  render

рдЕрдм рдпрд╣ "рдЦрд░рд╛рдм" рд╣реИ рдХреНрдпреЛрдВрдХрд┐ createElement рдПрдХ рдШрдЯрдХ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдордВрддреНрд░рдг рдкрд░ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдлрд╝рдВрдХреНрд╢рди рдХреЗ displayName рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред

рдпрд╣ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЪреАрдиреА React.functionComponent рдирд┐рдпреЛрдЬрд┐рдд рдХрд░рддреА рд╣реИ рдЬреЛ рд░рд┐рдПрдХреНрдЯ рдХреЗ рд░рдирдЯрд╛рдЗрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддреА рд╣реИ рдФрд░ рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВред рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд░реЗрдВрдЧрдирд╛ рдЬрдм рдЯреВрд▓реАрдВрдЧ рдЪрд╛рд░реЛрдВ рдУрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рд╢реБрд░реВ: webpack, рдХреЛрд▓рд╛рд╣рд▓, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрд╛рдЬрд╝рд╛ рд╕рднреА рдЙрдкрдХрд░рдг рд╣реИ рдХрд┐ рдЙрддреНрдкрдиреНрди рдХреЛрдб рджреЗрдЦреЛ, рдХреБрдЫ рдЬрд╛рджреВ рдпрд╣рд╛рдБ рдЗрдВрдЬреЗрдХреНрд╖рди рдФрд░ рд╡рд╣рд╛рдБ рдЧрд░реНрдо рдореЙрдбреНрдпреВрд▓ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣реЗ рд╣реИрдВ React.functionComponent рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрддреНрдкрдиреНрди рдХреЛрдб рдЗрд╕ рдмрд╛рдд рдХреЗ рдЕрдиреБрд░реВрдк рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬрдм рдЖрдк рдЬреЗрдПрд╕ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдорддреМрд░ рдкрд░ рдХреИрд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗ рдХрдИ рдЯреВрд▓ рдЗрд╕ рддрдереНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдзрд╛рд░рдгрд╛ рдмрдирд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдорд╛рдирдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рдЙрдкрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдХреА рддреБрд▓рдирд╛ рдореЗрдВред

рдЗрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди Fable 3 рдореЗрдВ рдЖ рд░рд╣рд╛ рд╣реИ рдЬрд╣рд╛рдБ рд╣рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓рд░ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЛрдб рдХреЗ рд╕рдВрдХрд▓рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ F# Feliz рдХреЛрдб рдХреЛ Fable 3 . рдореЗрдВ рдорд╛рдирддреЗ рд╣реИрдВ

[<ReactComponent>]
let app (title: string) = Html.h1 title 

app "My  React Application"

рдлрд┐рд░ рдпрд╣ рдЗрд╕ рдЬреЗрдПрд╕ рдХреЗ рдмрд░рд╛рдмрд░ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ (рд╕рдЯреАрдХ рдирд╣реАрдВ рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХ рдЬрд╛рджреВ)

const App = (props) { 
   const title = props.title
   return createElement("h1", null, title)
}

createElement(App, { title: "My  React Application" })

рдЕрдм рдпрд╣ рдЬреЗрдирд░реЗрдЯ рдХреЛрдб рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд░рд┐рдПрдХреНрдЯ рдЯреВрд▓рд┐рдВрдЧ рдХреНрдпрд╛ рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ:

  • рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдХреЛрдВ рдХреА рдкрд░рд┐рднрд╛рд╖рд╛рдПрдБ рдФрд░ рд░рдЪрдирд╛рдПрдБ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реИрдВ
  • рдШрдЯрдХреЛрдВ рдХреЛ рдКрдкрд░реА рдорд╛рдорд▓реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рд╣рд╛рдБ, рдпрд╣ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рд╕рдВрдХрд▓рдХ рдкреНрд▓рдЧрдЗрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддрд╛ рд╣реИ)
  • рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рд┐рдПрдХреНрдЯ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдпрд╣ рд╕рдВрдпреЛрдЬрди рд░рд┐рдПрдХреНрдЯ рд░рд┐рдлреНрд░реЗрд╢ рдХреЛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдлреЗрд▓рд┐рдЬ рдХреЗ рдЕрдиреБрднрд╡ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЗрд╢реА рдЬреЗрдПрд╕ рдпрд╛ рдЯреАрдПрд╕ рдХреЗ рдХрд░реАрдм рдмрдирд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рд╕реЗ рднреНрд░рдо рджреВрд░ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЗ рдХреЛрдИ рдФрд░ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдмрд╕ рдореБрдЭреЗ рдмрддрд╛рдПрдВ

рд╡рд╛рд╣! рдмрд╕ рд╡рд╛рд╣! рдореВрд░реНрдЦ рд╡реНрдпрдХреНрддрд┐ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рдкреНрд░рд╢реНрди рдкреВрдЫрддрд╛ рд╣реИ рдФрд░ рд╕реНрдорд╛рд░реНрдЯ рд╡реНрдпрдХреНрддрд┐ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдФрд░ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╕реЗ рднрд░реА рддреАрди рдП4 рд╢реАрдЯ рдХреЗ рд╕рд╛рде рдЙрддреНрддрд░ рджреЗрддрд╛ рд╣реИред рддреБрдо рдмрд╕ рд░реЙрдХ, рдпрд╛рд░! рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж! тЭдя╕П рдЕрдм рдореИрдВ рд╕рдордЭ рдЧрдпрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛ред

рдХреНрдпрд╛ рдЕрднреА рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдирд╛рдо рджреЗрдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ (рдЬреИрд╕реЗ рд╣рдордиреЗ React.functionComponent рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛) рдпрд╛ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ?

рдЕрдм рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╡рд┐рд╢реЗрд╖рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреВрдВрдЧрд╛ред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдЕрдЧрд░ рдЖрдкрдХреЛ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдЖрддреА рд╣реИ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ - рдЕрднреА рдХреЗрд╡рд▓ рдПрдХ рд╣реА рд╕рдорд╕реНрдпрд╛ рд╣реИ рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдирдкреБрдЯ рдкреНрд░реЙрдкреНрд╕ рд░рд┐рдПрдХреНрдЯ-рд░рд┐рдлреНрд░реЗрд╢ рдХреЗ рд▓рд┐рдП рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЕрдирд╛рдо рд░рд┐рдХреЙрд░реНрдб рдпрд╛ рдЖрджрд┐рдо рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЬрд▓реНрдж рд╣реА рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧреА рддрд╛рдХрд┐ рдореИрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЪреЗрддрд╛рд╡рдиреА рдХреЗ [<ReactComponent>] рджрд╕реНрддрд╛рд╡реЗрдЬреАрдХрд░рдг рдХрд░ рд╕рдХреВрдВред

рдХреНрдпрд╛ рдЕрднреА рднреА рдХрд┐рд╕реА рддрд░рд╣ рдШрдЯрдХреЛрдВ рдХреЛ рдирд╛рдо рджреЗрдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЧрдИ рд╣реИ (рдЬреИрд╕реЗ рд╣рдордиреЗ React.functionComponent рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдерд╛) рдпрд╛ рдпрд╣ рд╡рд┐рд╢реЗрд╖рддрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдЕрдм рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ?

рдирд╣реАрдВ, рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрдкрд░-рдХреЗрд╕ рдорд╛рдиреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдЙрди рдЪреАрдЬреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ [<ReactComponent>] рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИ: рдореБрд╕реНрдХрд╛рди: рдЖрдк рдпрд╣рд╛рдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░ рд╕рдХрддреЗ

@Dzoukr рдЖрдкрдХреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдирд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рдХрд╛рд░рдг рдбрд┐рдмрдЧ рдЯреВрд▓рд┐рдВрдЧ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдирд╛ рд╣реИред

@Shmew рд╣рд╛рдБ, рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд╛рдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП ReactComponent рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдкрд░ рдХреЛрдИ рдЕрдзрд┐рднрд╛рд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреВрдЫрд╛ рдЧрдпрд╛ред

рддреЛ, [<ReactComponent>] рдмрдирд╛рдо functionComponent рдкреНрд░рд╢реНрди рдЬрд╛рд░реА рд░рдЦреЗрдВ: рд╣реБрдХ!

рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдШрдЯрдХ рд╣реИ рдЬрд┐рд╕реЗ рдХреБрдЫ рд░рд╛рдЬреНрдп рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдмрдврд╝рд┐рдпрд╛ рд╣реБрдХ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ! рдореИрдВ рдпрд╣ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ:

[<ReactComponent>]
let Entrypoint() =
    let drawing, updateDrawing = React.useState(Deferred.HasNotStartedYet)
    let loader = React.useDeferredCallback((fun () -> loadDrawing()), updateDrawing)

    React.useEffect(loader, [||])
    // etc

рдХрд╛рд╢, рдЬрдм рдореИрдВ рдЗрд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛, рддреЛ рдореЗрд░рд╛ рдХрдВрд╕реЛрд▓ рдЙрджрд╛рд╕ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рд╕реЗ рднрд░рд╛ рд╣реЛрддрд╛:

Uncaught Error: Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons:
1. You might have mismatching versions of React and the renderer (such as React DOM)
2. You might be breaking the Rules of Hooks
3. You might have more than one copy of React in the same app
See https://fb.me/react-invalid-hook-call for tips about how to debug and fix this problem.
    React 

рдореИрдВ рдКрдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдбрд┐рдмрдЧ рдЪрд░рдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ; рдХреЛрдИ рднреА рд╕рддреНрдп рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ред рдХреНрдпрд╛ рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП? рдХреНрдпрд╛ рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рдХрд▓реНрдкрд┐рдд рей рдЪреАрдЬ рд╣реИ? (рдореИрдВ рдЕрднреА рднреА Fable 2 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред)

рдореЗрд░реА рд╕рдордЭ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд▓реНрдкрд┐рдд рей рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдХрд▓реНрдкрд┐рдд рей рд╕рдВрдХрд▓рдХ рдкреНрд▓рдЧрдЗрди рд╣реИ

@landy рдЖрд╣, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдХрд░реЗрдЧрд╛ред Lemme Fable 3 рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдПрдХ рдорд┐рдирдЯ рдореЗрдВ рд╡рд╛рдкрд╕ рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдЧрд╛

рдЕрд░реЗ! рд╣рд╛рдВ, рдЗрд╕рдиреЗ рдореБрдЭреЗ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ - рдореИрдВрдиреЗ

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕