F# in Html
In Feliz you can use F# code directly in your Html structure as it is abstracted into F# native lists. This means you can use all the power of F# to create dynamic and reusable components.
In the following example we define a simple button component that takes a text parameter and renders a styled button with that text.
Show code
module Example.FSharp
open Feliz
Fable.Core.JsInterop.importSideEffects "./fsharp.css"
type ISize =
| Small
| Medium
| Large
type Button =
[<ReactComponent>]
static member Example(text: string, onClick: Browser.Types.MouseEvent -> unit, ?size: ISize) =
let size = defaultArg size Medium
let sizeClass =
match size with
| Small -> "sm"
| Medium -> ""
| Large -> "lg"
Html.button [
prop.text text
prop.onClick onClick
prop.className [ "fsharp-btn"; sizeClass]
]
[<ReactComponent(true)>]
static member Example() =
let fn = fun _ -> Browser.Dom.console.log("Button clicked!")
Html.div [
prop.style [
style.display.flex
style.flexDirection.column
style.alignItems.center
style.justifyContent.center
style.gap 10
]
prop.children [
Button.Example("Submit", fn, size = Large)
Html.br []
Button.Example("Submit", fn, size = Medium)
Html.br []
Button.Example("Submit", fn, size = Small)
]
]
-
We define the button size as discriminated union type.
type ISize =
| Small
| Medium
| Large -
We make size an optional parameter with a default value.
static member Example(text: string, onClick: Browser.Types.MouseEvent -> unit, ?size: ISize) =
let size = defaultArg size MediuminfoBecause of this we create the component as
static member
of a class. Usinglet
bindings does not allow for optional parameters -
We use a
match case
onsize
to determine the appropriate CSS class to apply.let sizeClass =
match size with
| Small -> "sm"
| Medium -> ""
| Large -> "lg" -
We define a function and pass it to the
onClick
event handler.let fn = fun _ -> Browser.Dom.console.log("Button clicked!")
// ...
Button.Example("Submit", fn, size = Large)