You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.4 KiB

4 years ago
  1. package com.example.playscalajsreact.component
  2. import japgolly.scalajs.react.vdom.VdomElement
  3. import japgolly.scalajs.react.Callback
  4. import japgolly.scalajs.react._
  5. import japgolly.scalajs.react.vdom.html_<^._
  6. import com.example.playscalajsreact.route.AppRouter
  7. import org.scalajs.dom
  8. import scala.scalajs.js
  9. import com.example.playscalajsreact.model.User
  10. import japgolly.scalajs.react.extra.StateSnapshot
  11. import com.softwaremill.quicklens._
  12. import monocle.macros.Lenses
  13. object NameChanger {
  14. import japgolly.scalajs.react.MonocleReact._
  15. @Lenses
  16. case class Name(firstName: String, surname: String)
  17. val NameChanger = ScalaComponent
  18. .builder[StateSnapshot[String]]
  19. .render_P { stateSnapshot =>
  20. <.input.text(
  21. ^.value := stateSnapshot.value,
  22. ^.onChange ==> ((e: ReactEventFromInput) =>
  23. stateSnapshot.setState(e.target.value)
  24. )
  25. )
  26. }
  27. .build
  28. val Main = ScalaComponent
  29. .builder[Unit]
  30. .initialState(Name("John", "Wick"))
  31. .render { $ =>
  32. val name = $.state
  33. val firstNameV = StateSnapshot.zoomL(Name.firstName).of($)
  34. val surnameV = StateSnapshot.zoomL(Name.surname).of($)
  35. <.div(
  36. <.label("First name:", NameChanger(firstNameV)),
  37. <.label("Surname:", NameChanger(surnameV)),
  38. <.p(s"My name is ${name.surname}, ${name.firstName} ${name.surname}.")
  39. )
  40. }
  41. .build
  42. }