我正在使用scalajs 0.6.15與scalajs-react 0.11.3和reactjs 15.4.2。如何使用類型參數化組件與scalajs-react
考慮組件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])
)
}
有沒有更好的,boilercode,少可怕的呢?有什麼建議麼?
更新 後@天哪的(!THX爲您精心製作的答案)建議我找到第二個解決方案最優雅,並希望它張貼在這裏的完整性:
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)
}
}
thx爲'StateSnapshot'提示! – trudolf