dev*_*ant 6 kotlin reactjs kotlin-js-interop kotlin-frontend create-react-kotlin-app
我正在尝试在我的create-react-kotlin-app中使用这个lib :
我想生成一堆类型的安全包装器.我开始是这样的:
@file:JsModule("material-ui")
package material
import react.RState
import react.React
import react.ReactElement
external class Typography : React.Component<dynamic, RState> {
override fun render(): ReactElement
}
Run Code Online (Sandbox Code Playgroud)
...
fun RBuilder.typography(
classes: String = "",
variant: Variant = Variant.body1,
align: Align = Align.inherit,
color: Color = Color.default,
gutterBottom: Boolean = false,
noWrap: Boolean = false,
paragraph: Boolean = false,
handler: RHandler<dynamic>
) = child(Typography::class) {
attrs {
this.className = classes
this.align = align.name
this.color = color.name
this.variant = variant.name
this.gutterBottom = gutterBottom
this.noWrap = noWrap
this.paragraph = paragraph
}
handler()
}
Run Code Online (Sandbox Code Playgroud)
并使用它像:
typography(variant = Variant.title, color = Color.inherit) {
+"Hello World"
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
确实这是正确的方法,但可以使其成为最好的方法,如下所示
MaterialUi.kt
@file:JsModule("material-ui")
package material
import react.RState
import react.RProps
import react.React
import react.ReactElement
external interface TypographyProps : RProps {
var className: String
var align : String
var color : String
var variant : String
var gutterBottom : String
var noWrap : String
var paragraph : String
}
@JsName("Typography")
external class Typography : RComponent<TypographyProps, RState> {
override fun render(): ReactElement
}
Run Code Online (Sandbox Code Playgroud)
然后创建另一个文件,比如说
MaterialUiDsl.kt
fun RBuilder.typography(
classes: String = "",
variant: Variant = Variant.body1,
align: Align = Align.inherit,
color: Color = Color.default,
gutterBottom: Boolean = false,
noWrap: Boolean = false,
paragraph: Boolean = false,
handler: RHandler<TypographyProps> // notice the change here
) = child(Typography::class) {
attrs {
this.className = classes
this.align = align.name
this.color = color.name
this.variant = variant.name
this.gutterBottom = gutterBottom
this.noWrap = noWrap
this.paragraph = paragraph
}
handler()
}
Run Code Online (Sandbox Code Playgroud)
如果上面的文件对你来说已经很冗长了(就像我经常感觉到的那样),你可以将其更改为
MaterialUiDsl.kt
fun RBuilder.typography(handler: RHandler<dynamic>) = child(Typography::class,handler)
Run Code Online (Sandbox Code Playgroud)
你可以像这样随时使用它
typography {
attr {
className = "my-typo"
color = "#ff00ff"
//. . .
}
}
Run Code Online (Sandbox Code Playgroud)
十分简单
| 归档时间: |
|
| 查看次数: |
495 次 |
| 最近记录: |