Path |
|
Last updated |
2021/10/26 |
本文
pre.258
時点での情報です。 JetBrains/kotlin-wrappers
は頻繁に更新されているため、最新の情報を得るには実装を確認する必要があります。
component を作成する
React component は、 RComponent
を継承したクラスを作成します。
external interface MyComponentProps : Props
external interface MyComponentState : State
class MyComponentRComponent : RComponent<MyComponentProps, MyComponentState>() { override fun RBuilder.render() { } }
val MyComponent: ComponentClass<MyComponentProps> = MyComponentRComponent::class.react
カスタムタグを利用する
HTML の要素であれば、定義されたタグを利用することができます。一方、例えば SVG の要素など、宣言されていないタグを利用したいケースもあります。そのときは、タグを生成するメソッドを定義することで実現できます。
fun RBuilder.tag(tagName: String, block: RDOMBuilder<HTMLTag>.() -> Unit) { tag(block) { HTMLTag( tagName = tagName, consumer = it, initialAttributes = mapOf(), namespace = null, inlineTag = true, emptyTag = false, ) } }
定義した RBuilder.tag
は、次のように利用します。
tag("path") { attrs["d"] = "M 1 1 L 2 1 L 2 2 L 1 2" }
React router を利用する
次は、 React router を利用する例です。
BrowserRouter { Switch { Route { attrs.component = Home attrs.exact = true attrs.path = arrayOf("/") } } }
React router にある history
、 location
などは RouteComponentProps
で定義されています。 Route
で指定される component であれば、 .react
で得られる ComponentClass<P>
で動作します。
external interface HomeProps : Props, RouteComponentProps
val Home: ComponentClass<HomeProps> = HomeRComponent::class.react
一方、Route
で指定しない場合は withRouter
を使用して ComponentClass<P>
を得ます。
val Home: ComponentClass<HomeProps> = withRouter(HomeRComponent::class)
@media の定義
メディアクエリは media
を使用することで実現できます。
media("(max-width: 40rem)") { }
ただ、この文字列をいたるところに書くとメンテナンス面で問題があります。このとき、メディアクエリを文字列として管理する方法もありますが、 (CssBuilder, RuleSet) → Rule
を定義する方法もあります。例えば、 Layout
に mediaMedium
と定義すると、 css
の中で Layout.mediaMedium(this) { }
と使用できます。
object Layout { val mediaMedium: (CssBuilder, RuleSet) -> Rule = { cssBuilder, block -> cssBuilder.media("(max-width: 40rem)", block) } }
css { Layout.mediaMedium(this) { flexDirection = FlexDirection.column } }