Link Elements
Navigation is managed by React components, facilitating client-side routing that operates as a single-page application with dynamic data fetching. At the same time the Fex architectural pattern ensures the server-side rendering of the components, guarenteeing interaction before JavaScript is loaded.
Example navigation bar component:
[<ReactComponent>]
let NavigationBar(props: {| greeting : Greeting |}) =
let req = React.useContext requestContext
Html.nav [
req.Link {| href = "/"; children = "Home" |}
req.Link {| href = "/about"; children = "About" |}
]
Form Elements
Forms are the core of client interaction in a Fex application and integrate seamlessly, functioning on both client and server sides, enabling interactions without page reloads. The server also handles these form submissions, ensuring functionality even without JavaScript.
Example form component and handler:
[<ReactComponent>]
let LinksAndFormElementPage(props: {| inputName : string option |}) =
let req = React.useContext requestContext
React.fragment [
match props.inputName with
| Some name -> (Html.p ("Hello, " + name + "!"))
| None -> Html.p "Please enter your name:"
req.Form {| action = "/setName"; method = "post"; children = [
Html.input [ prop.type' "text"; prop.name "inputName"; prop.placeholder "Name" ]
Html.input [ prop.type' "submit"; prop.value "Submit" ]
] |}
]
app.post("/setName", fun req res next ->
promise {
let inputName = req.body?inputName
let! response =
req |> gql "mutation ($inputName: String)
{ setName(inputName: $inputName) { success } }"
{| inputName = inputName |} {||}
res.redirect("back")
} |> ignore
)
This is an example of the above form element components in action and shows how requests are handled without a page reload while still being structured around the foundational element of interactive web applications, the form post.
Please enter your name:
If you disable JavaScript in your browser, form submissions will continue to work and update the state of the page, albeit with the obvious need for a page reload.
Next: Parallel Middleware