Спрошу здесь, хоть может и не 100% по теме: в аппликации, написанной на Feliz (от SAFEr template) хочу обновить состояние из дочерней компоненты в родительскую, причём во время обработки callback:
В общем, пока это дело выглядит так - но убогий Жабаскрипт ругается, говорит, что слишком много вызовов render. Может у кого-нибудь есть готовый пример как это организовать под Fable/Feliz?
[<ReactComponent>]
let LoginView () =
let loginForm, setLoginForm = React.useState({ Request.Login.Username = ""; Request.Login.Password = ""; Request.Login.IsPersistent = false })
let loginReq, setLoginReq = React.useState(Deferred.HasNotStartedYet)
let loggedInData, setLoggedInData = React.useState<string option>(None)
let login = React.useDeferredCallback ((fun _ -> Server.service.Login loginForm), setLoginReq)
let globalState = React.useContext SharedView.globalStateContext
React.useEffect( (fun _ ->
let newSession =
match loggedInData with
| None -> { globalState.Session with User = None; LoggedIn = false }
| Some(user) -> { globalState.Session with User = Some(user); LoggedIn = true }
if globalState.Session <> newSession then
Fable.Core.JS.console.log("Updating session with user " + newSession.User.ToString())
globalState.SetSession(newSession))
, [| loggedInData :> obj |])
let result =
match loginReq with
| Deferred.HasNotStartedYet
| Deferred.InProgress -> Html.none
| Deferred.Failed ex -> ex |> Server.exnToError |> displayStronglyTypedError
| Deferred.Resolved res ->
match res with
| Ok resp ->
setLoggedInData (Some "<TODO>")
Html.text "YOU ARE IN!"
| Error err -> Html.text ("ERROR: " + err.ToString())