我将 scalajs 0.6.15 与 scalajs-react 0.11.3 和 reactjs 15.4.2 一起使用。
考虑一个组件SomeComp
,其中值的类型Props
需要参数化。
由于在使用组件构建器时需要知道类型,因此我将组件包装在一个类中。
class SomeComp[T]() {
case class Props(t: T, onChange: T => Callback)
val component = ReactComponentB[Props]("SomeComp")...
def apply(t: T, onChange:T => Callback) = component(Props(t, onChange))
}
这行得通。问题是,组件会随着父级的每次重新渲染而重新安装,除非用户SomeComp
首先创建一个实例并在父级的方法SomeComp
中使用该实例。render
我避免这种情况的黑客解决方案是:
object SomeComp {
val genericComp = SomeComp[Any]()
def apply[T](t: T, onChange: T => Callback) = genericComp(
t = t,
onChange = (a: Any) => onChange(a.asInstanceOf[T])
)
}
有没有更好、更少的锅炉代码、更不可怕的方法?有什么建议么?
在@Golly (感谢您的详尽回答!)建议之后更新我发现第二个解决方案最优雅,并希望在此处发布以确保完整性:
object SomeComp {
trait Props{
type T
val t: T
val onChange: T => Callback
}
// use Props#T if you need to reference T
val component = ReactComponentB[Props]("SomeComp")...
def apply[_T](_t: _T, _onChange: _T => Callback) = {
val props = new Props {
type T = _T
val t = _t
val onChange = _onChange
}
component(props)
}
}