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.
47 lines
1.4 KiB
47 lines
1.4 KiB
package com.example.playscalajsreact.component
|
|
|
|
import japgolly.scalajs.react.vdom.VdomElement
|
|
import japgolly.scalajs.react.Callback
|
|
import japgolly.scalajs.react._
|
|
import japgolly.scalajs.react.vdom.html_<^._
|
|
import com.example.playscalajsreact.route.AppRouter
|
|
import org.scalajs.dom
|
|
import scala.scalajs.js
|
|
import com.example.playscalajsreact.model.User
|
|
import japgolly.scalajs.react.extra.StateSnapshot
|
|
import com.softwaremill.quicklens._
|
|
import monocle.macros.Lenses
|
|
|
|
object NameChanger {
|
|
import japgolly.scalajs.react.MonocleReact._
|
|
|
|
@Lenses
|
|
case class Name(firstName: String, surname: String)
|
|
|
|
val NameChanger = ScalaComponent
|
|
.builder[StateSnapshot[String]]
|
|
.render_P { stateSnapshot =>
|
|
<.input.text(
|
|
^.value := stateSnapshot.value,
|
|
^.onChange ==> ((e: ReactEventFromInput) =>
|
|
stateSnapshot.setState(e.target.value)
|
|
)
|
|
)
|
|
}
|
|
.build
|
|
|
|
val Main = ScalaComponent
|
|
.builder[Unit]
|
|
.initialState(Name("John", "Wick"))
|
|
.render { $ =>
|
|
val name = $.state
|
|
val firstNameV = StateSnapshot.zoomL(Name.firstName).of($)
|
|
val surnameV = StateSnapshot.zoomL(Name.surname).of($)
|
|
<.div(
|
|
<.label("First name:", NameChanger(firstNameV)),
|
|
<.label("Surname:", NameChanger(surnameV)),
|
|
<.p(s"My name is ${name.surname}, ${name.firstName} ${name.surname}.")
|
|
)
|
|
}
|
|
.build
|
|
}
|