我已经为这个问题苦苦挣扎了好几天了。我想出了以下解决方案。首先我们将看到多种声明外部module的方法,然后我将展示如何使用它们。
考虑以下 javascript 代码
import Button from '@material-ui/core/Button' // this means button is exported as default
这将通过以下方式在 kotlin 中导入
按钮.kt
@file:JsModule("@material-ui/core/Button")
@file:JsNonModule
package com.mypckage.mykillerapp
import react.Component
import react.RProps
import react.RState
import react.ReactElement
@JsName("default") // because it was exported as default
external val Button : RClass<RProps>
// way 2
@JsName("default")
external class Button : Component<RProps,RState> {
override fun render(): ReactElement?
}
但同样,如果针对 kotlin 的语句必须与下面的 javascript import 语句匹配,
import { Button } from "material-ui" // not exported as default
我们使用以下方法:Button.kt
@file:JsModule("material-ui")
@file:JsNonModule
package com.mypckage.mykillerapp
import react.Component
import react.RProps
import react.RState
import react.ReactElement
// way 1
@JsName("Button") // because it was exported as default
external val Button : RClass<RProps>
// way 2
@JsName("Button")
external class Button : Component<RProps,RState> {
override fun render(): ReactElement?
}
一旦您声明了如何使用您的组件,您就可以按如下方式使用它们:
//way 1:
fun RBuilder.render() {
div {
Button {
attrs.asDynamic().className="submit-button"
+"Submit"
}
}
}
//way 2:
fun RBuilder.render() {
div {
child(Button::class) {
attrs.asDynamic().className="submit-button"
+"Submit"
}
}
}
伟大的。您已导入组件。但在那之前你不依赖于 kotlin 类型安全甚至代码完成,要实现这一点,你必须去额外的长度
如下图
external interface ButtonProps: RProps {
var className : String
var onClick: (Event?)->Unit
var color: String
// . . .
var href: String
}
然后继续将您的按钮声明为
@JsModule("@material-ui/core/Button")
@JsNonModule
@JsName("default") // because it was exported as default
external val Button : RClass<ButtonProps>
您现在可以将它与类型安全和代码完成一起使用,如下所示
fun RBuilder.render() {
div {
Button {
attrs {
className = "submit-button"
onClick = {
window.alert("Vois La")
}
}
+"Submit"
}
}
}
希望这可以帮助。快乐编码
编辑:对于材料的UI组件社区包装这里
提示:使用方式 1,如您所见,它不那么冗长