μλ μΉκ΅¬,
μμ§ν μλλΉ νλ‘ νΈ μλ κ°λ°μλ‘μ μ λ ν₯λ―Έλ‘μ΄ νλμνμ΅λλ€.
λ λμ λλ²κΉ
μ μν΄ κ΅¬μ± μμ μ΄λ¦μ μ§μ ν μλ μμΌλ―λ‘ λ¬Έμλ₯Ό κΈ°λ°μΌλ‘ 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 () ]
)
κ·Έλ¬λ [<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 ν¨μμ μ°¨μ΄λ₯Ό μ»μ§ λͺ»νκΈ° λλ¬Έμ λ΄ μλͺ»μ λκΉ? π
μ΄ν΄λ₯Ό λκΈ° μν΄ λμμ μ£Όμ μ κ°μ¬ν©λλ€.
μμ±μ λ―Έλμ κ° κΈΈμ΄ λ κ²μ΄λ©° λ°μ μλ‘ κ³ μΉ¨μ΄ μλνλ λ° νμν©λλ€. μ μ΄λ κ·Έκ² κ·Έλ¬μ§λ§ @ Zaid-Ajajκ° μ°¨μ΄κ° μλλ‘ λΆλ₯νλ€κ³ μκ° νμ΅λκΉ?
μλ νμΈμλ‘λ§,
μ΄κ²μ 짧μ λλ΅μ΄μλ μ λ§ μ’μ μ§λ¬Έμ λλ€.
μ§μμ μΈν°λ· λ¬Έμ λ₯Ό ν΄κ²° ν νμλ μ€νΈλ¦¬λ°μ λ€μ μμνμ¬ κ·Ήμ¬ν μΈλΆ μ¬νμΌλ‘ μ€λͺ νκ² μ΅λλ€ π
λ λμ λλ²κΉ μ μν΄ κ΅¬μ± μμ μ΄λ¦μ μ§μ ν μλ μμΌλ―λ‘ λ¬Έμλ₯Ό κΈ°λ°μΌλ‘
React.functionComponent
λ₯Ό μ¬μ©νμ¬ κ΅¬μ± μμλ₯Ό λ§λλ κ²μ΄ μ’μ΅λλ€. μ¬λ―Έμλ κ²μ 리 μ‘νΈ λ¦¬νλ μμ ν¨κ» μ 곡λ©λλ€.
κΈ°λ³Έμ μΌλ‘ μ΅μ ν 리 μ¦μ μ ν¨ κΈ°κ°κ³Ό : μ°μ , λλ λ¬Έμ λΆνν μ ν μνμμλ κ²μ μ§μ ν [<ReactComponent>]
μ°λ¦¬ μ’
λ₯μ λ¬Έμ νλ¬κ·ΈμΈ μ»΄νμΌλ¬ λ°μΌλ‘ μ (ε)κΉμ§ μ°νμ μν΄ μ¬μ©λλ ASTλ₯Ό μμ ν . λ΄κ° λ§νλ €λ κ²μ λ¬Έμ κ° React.functionComponent
μ νΈ νμ§ μμΌλ©° Fable 3λ₯Ό μ¬μ©νλ κ²½μ° λμ [<ReactComponent>]
λ₯Ό μ¬μ©ν΄μΌνλ€λ κ²μ
λλ€.
μ΄κ²μ μλ° μ€ν¬λ¦½νΈ μ½λκ° μμ±λλ λ°©μκ³Ό κ΄λ ¨μ΄ μμ΅λλ€. μ΄μ λ€μ React μ½λλ₯Ό κ³ λ €νμμμ€.
const App = ({ title }) => {
return (
<h1>{title}</h1>
)
};
<App title="My React Application" />
μ΄ JS (μ€μ λ‘λ JSX)λ λ€μ JS μ½λλ‘ desugars
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
κ΅¬μ± μμμ μ΄κΈ°ν λ JSμμ createElement
νΈμΆλ‘ μ»΄νμΌλλ€λ μ μ μ μν΄μΌν©λλ€.
λ€μ λ κ°μ§ λλ¬Έμ μ€μν©λλ€.
App
κ° μ μ κ°μ΄ λ μ μμ΅λλ€ (Reactκ° μ¬μ©νλ IDκ° μμ½ λ¨)μ΄μ React.functionComponent
ꡬν λ°©μμ μ μμ μμ±μ ν λ²μ κ²°ν©νκΈ° λλ¬Έμ Reactμκ² "λμ"λ°©μμ
λλ€. μ΄ F # μ½λ
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
μ¬μ©νλμ΄ κ΅¬λ¬Έ μ€νμ Reactμ λ°νμ λμμ μν₯μ λ―ΈμΉμ§ μμΌλ©°, μ΄κ²μ΄ React μ ν리μΌμ΄μ
μ λΉλνλ λ° λ¬Έμ μμ΄ μ¬μ©ν μμλ μ΄μ μ
λλ€. React μ ν리μΌμ΄μ
μ£Όλ³μ TOOLING μ΄ μμ± λ μ½λλ₯Ό λΆμνκΈ° μμνλ©΄ λ¬Έμ κ° λ°μνκΈ° μμν©λλ€. webpack, babel, react-refreshλ λͺ¨λ μμ± λ μ½λλ₯Όλ³΄κ³ μ¬κΈ°μ κΈ°μ μ½κ°μ λ§λ²μ μ£Όμ
νμ¬ ν« λͺ¨λ κ΅μ²΄λ₯Ό κ°λ₯νκ²νμ§λ§ React.functionComponent
μμ± λ μ½λλ JSλ₯Ό μμ±ν λ React μ ν리μΌμ΄μ
μ΄ μΌλ°μ μΌλ‘ λΉλλλ λ°©μμ λ°λ₯΄μ§ μκΈ° λλ¬Έμ λΆκ°λ₯νλ©° React μ£Όλ³μ λ§μ λꡬλ μ½λκ° νμ€μ λ°λΌ μμ±λμλ€λ μ¬μ€μ κΈ°λ°μΌλ‘ κ°μ ν©λλ€. λꡬμ μν΄ μμ± λ κ²λ³΄λ€ λ°μν©λλ€.
μ΄λ¬ν λ¬Έμ μ λν ν΄κ²°μ± μ μ»΄νμΌλ¬ νλ¬κ·ΈμΈμ ν΅ν΄ μ½λ μ»΄νμΌμ μ¬μ©μ μ μ ν μμλ Fable 3μμ μ 곡λ©λλ€. Fable 3μμμ΄ F # Feliz μ½λλ₯Ό κ³ λ €νλ€λ©΄
[<ReactComponent>]
let app (title: string) = Html.h1 title
app "My React Application"
κ·Έλ° λ€μμ΄ JSμ λλ±ν κ²μΌλ‘ μ»΄νμΌλ©λλ€ (λ λ§μ λ§μ λλ¬Έμ μ ννμ§ μμ΅λλ€)
const App = (props) {
const title = props.title
return createElement("h1", null, title)
}
createElement(App, { title: "My React Application" })
μ΄μ μ΄ μμ± λ μ½λλ React λκ΅¬κ° κΈ°λνλ κ²μ²λΌ 보μ΄λλ‘ μ¬μ©μ μ μλ©λλ€.
μ΄ μ‘°ν©μ React μλ‘ κ³ μΉ¨μ μλνκ² λ§λ€κ³ νμ₯μΌλ‘ Felizμ κ²½νμ λ€μ΄ν°λΈ JS λλ TSμ κ²½νκ³Ό λ§€μ° κ°κΉκ² λ§λλλ€. μ΄κ²μ΄ νΌλμ ν΄κ²°νκΈ°λ₯Ό λ°λλλ€. λ κΆκΈν μ μ΄ μμΌλ©΄ μλ €μ£ΌμΈμ π
μ! κ·Έλ₯ ... μμ°! μ΄λ¦¬μμ μ¬λμ μ΄λ¦¬μμ μ§λ¬Έμνκ³ λλν μ¬λμ κ΄λ ¨ μ 보μ μ€λͺ μ΄ κ°λν 3 μ₯μ A4 μ©μ§λ‘ λλ΅ν©λλ€. π€― λΉμ μ κ·Έλ₯ νλλκ΅°μ! κ°μ¬ν©λλ€! β€οΈ μ΄μ μ΄ν΄νκ³ λμ Attributeλ₯Ό μ¬μ©ν κ²μ λλ€.
μ΄λ»κ² λ κ΅¬μ± μμμ μ΄λ¦μ μ§μ νλ κ²μ΄ μ’μ΅λκΉ ( React.functionComponent
μ 첫 λ²μ§Έ λ§€κ° λ³μλ₯Ό μ¬μ©νλ κ²μ²λΌ) μλλ©΄ μμ± μ κ·Όμ λ μ΄μ νμνμ§ μμ΅λκΉ?
μ΄μ μ΄ν΄νκ³ λμ Attributeλ₯Ό μ¬μ©ν κ²μ λλ€.
λλ°! λ¬Έμ κ° λ°μνλ©΄ π μ§κΈ λΉμ₯ μμμΌ ν μ μΌν λ¬Έμ λ μ
λ ₯ propsκ° React-refreshμ μ½κ° λ¬Έμ κ° λ μ μμΌλ―λ‘ λ μ½λ μ νμ μ¬μ©νλ κ²μ΄λ―λ‘ λμ μ΅λͺ
λ μ½λλ₯Ό μ¬μ©νκ±°λ κΈ°λ³Έ λ§€κ° λ³μλ₯Ό μ¬μ©ν μ μμ΅λλ€. κ²½κ³ μμ΄ [<ReactComponent>]
λ¬Έμλ₯Ό μμ±ν μ μλλ‘ λ¬Έμ κ° κ³§ ν΄κ²°λκΈ°λ₯Ό λ°λλλ€.
μ΄λ»κ² λ μ»΄ν¬λνΈμ μ΄λ¦μ μ§μ νλ κ²μ΄ μ’μ΅λλ€ (React.functionComponentμ 첫 λ²μ§Έ λ§€κ° λ³μλ₯Ό μ¬μ©νλ κ²μ²λΌ) μλλ©΄ μμ± μ κ·Όμ λ μ΄μ νμνμ§ μμ΅λκΉ?
μλμ, μ μΌν μꡬ μ¬νμ κ΅¬μ± μμκ° [<ReactComponent>]
ν¨μ μ μμ λν΄ μννλ μμ
μ€ νλ μΈ λλ¬Έμ κ°μΌλ‘ μ»΄νμΌλλ€λ κ²μ
λλ€. : smile : μ¬κΈ°μ ꡬνν μ
@Dzoukr λ λ°μ κ΅¬μ± μμμ μ΄λ¦μ μ¬μ©νλ μ μΌν μ΄μ λ λλ²κ·Έ λꡬλ₯Ό κ°μ νλ κ²μ λλ€.
@Shmew Yup,νμ§λ§ κ·Έλ¬ν μ΄λ¦μ μΆκ°νκΈ° μν΄ 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 3 μ μΌν κ²μ λκΉ? (μ λ μ¬μ ν Fable 2λ₯Ό μ¬μ©νκ³ μμ΅λλ€.)
λ΄ μ΄ν΄λ reactcomponent μμ±μ΄ μ°ν 3 μ»΄νμΌλ¬ νλ¬κ·ΈμΈμ΄κΈ° λλ¬Έμ μλνλ €λ©΄ μ°ν 3μ΄ νμνλ€λ κ²μ λλ€.
@landy μ, νμ€ν ν κ²μ λλ€. Lemmeλ Fable 3μ μλμν€κ³ μ μ νμλ³΄κ³ ν κ²μ λλ€.
μΌ! λ€, μ λ₯Ό κ³ μ³€μ΅λλ€. μ΄ PR μ μ ν κ°μ΄λλ‘ μ¬μ©
κ°μ₯ μ μ©ν λκΈ
μ! κ·Έλ₯ ... μμ°! μ΄λ¦¬μμ μ¬λμ μ΄λ¦¬μμ μ§λ¬Έμνκ³ λλν μ¬λμ κ΄λ ¨ μ 보μ μ€λͺ μ΄ κ°λν 3 μ₯μ A4 μ©μ§λ‘ λλ΅ν©λλ€. π€― λΉμ μ κ·Έλ₯ νλλκ΅°μ! κ°μ¬ν©λλ€! β€οΈ μ΄μ μ΄ν΄νκ³ λμ Attributeλ₯Ό μ¬μ©ν κ²μ λλ€.
μ΄λ»κ² λ κ΅¬μ± μμμ μ΄λ¦μ μ§μ νλ κ²μ΄ μ’μ΅λκΉ (
React.functionComponent
μ 첫 λ²μ§Έ λ§€κ° λ³μλ₯Ό μ¬μ©νλ κ²μ²λΌ) μλλ©΄ μμ± μ κ·Όμ λ μ΄μ νμνμ§ μμ΅λκΉ?