如何获得scalsjs中的ref组件反应?

时间:2016-01-22 11:05:52

标签: scala.js scalajs-react

此文档https://github.com/japgolly/scalajs-react/blob/master/doc/USAGE.md#refs 有点不清楚。

我创造了一个小例子:" squareViewer" showes" square"点击

我如何获得Ref to component" square"方法squareViewer.Backend.show?

import japgolly.scalajs.react._
import japgolly.scalajs.react.vdom.prefix_<^._

object squareViewer {
  class Backend($: BackendScope[Unit, Unit]) {
    def show() = Callback {
      //???
      //val r = ref to square instance
      //r.backend.show()
    }

    def render() = {
      <.div(
        <.button("Show square", ^.onClick-->show()),
        square.component.withRef("id1")()
      )
    }
  }

  val component = ReactComponentB[Unit]("squareViewer")
    .renderBackend[Backend]
    .buildU
}

object square {
  case class State(visible: Boolean)

  class Backend($: BackendScope[Unit, State]) {
    def show() = $.setState(State(true))
    def hide() = $.setState(State(false))

    def render(s: State) = {
        <.div("Yo!",
            ^.width:="100px", ^.height:="100px",
            ^.position:="absolute", ^.top:=0, ^.left:=0,
            ^.fontSize:="300%",
            ^.backgroundColor:="red",
            !s.visible ?= ^.display.none,
            ^.onClick-->hide()
        )
    }
  }

  val component = ReactComponentB[Unit]("square")
    .initialState(State(false))
    .renderBackend[Backend]
    .buildU
}

1 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

import japgolly.scalajs.react._
import japgolly.scalajs.react.vdom.prefix_<^._

object squareViewer {
  val squareRef = Ref.to(square.component, "square")
  class Backend($: BackendScope[Unit, Unit]) {
    def show() = 
      squareRef($).map(_.backend.show()).getOrElse(Callback.empty)


    def render() = {
      <.div(
        <.button("Show square", ^.onClick-->show()),
        square.component.withRef(squareRef)()
      )
    }
  }

  val component = ReactComponentB[Unit]("squareViewer")
    .renderBackend[Backend]
    .buildU
}

object square {
  case class State(visible: Boolean)

  class Backend($: BackendScope[Unit, State]) {
    def show() = $.setState(State(true))
    def hide() = $.setState(State(false))

    def render(s: State) = {
        <.div("Yo!",
            ^.style:="width:100px;height:100px;position:absolute;top:0;left:0;font-size:300%;background-color:red;",
            !s.visible ?= ^.display.none,
            ^.onClick-->hide()
        )
    }
  }

  val component = ReactComponentB[Unit]("square")
    .initialState(State(false))
    .renderBackend[Backend]
    .buildU
}

编辑:纠正错字,现在应该可以了。