将第三方React组件导入kotlin.js项目的正确方法是什么?

时间:2018-03-15 20:35:15

标签: reactjs kotlin kotlin-js-interop kotlin-frontend create-react-kotlin-app

我正在尝试在create-react-kotlin-app中使用此库:

https://material-ui-next.com/

我想生成一堆类型的安全包装器。我开始是这样的:

@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
}

...

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()
}

并使用它:

typography(variant = Variant.title, color = Color.inherit) {
    +"Hello World"
}

这是正确的方法吗?

2 个答案:

答案 0 :(得分:0)

我也有兴趣在Kotlin代码中添加ReactJS第三方组件。请查看以下帖子,感谢您提出的有关解决方案的反馈意见

How to import node module in React-Kotlin?

答案 1 :(得分:0)

事实上,这是正确的方法,但可以使其达到最佳效果,如下所示:

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
}

然后创建另一个文件,例如

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()
}

如果上面的文件对您来说已经很冗长(就像我通常的感觉),您可以将其更改为“

MaterialUiDsl.kt

fun RBuilder.typography(handler: RHandler<dynamic>) = child(Typography::class,handler)

您可以随时使用它

typography {
    attr {
        className = "my-typo"
        color = "#ff00ff"
        //. . .
    }
}

轻松自在