首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在kotlin-js react应用程序中导入带有子级的app引导组件

如何在kotlin-js react应用程序中导入带有子级的app引导组件
EN

Stack Overflow用户
提问于 2020-07-15 17:03:21
回答 2查看 1.3K关注 0票数 3

我想使用一个引导卡组件在一个反应网站创建的kotlin。该应用程序使用kotlin-react包装器和react引导库。

put引导文档说使用来放置内容。

代码语言:javascript
复制
<Card>
  <Card.Body>This is some text within a card body.</Card.Body>
</Card>

到目前为止,我成功地将Card JavaScript模块导入到kotlin-js中。

代码语言:javascript
复制
@file:JsModule("react-bootstrap/Card")

import react.RClass
import react.RProps


@JsName("default")
external val Card: RClass<RProps>

有了这个,我可以使用RComponent中的卡。

代码语言:javascript
复制
class Content : RComponent<RProps, RState>() {
    override fun RBuilder.render() {
        Card {
           +"Hello World"
        }
    }
}

呈现给:

代码语言:javascript
复制
<div class="card">
  Hello World
</div>

另外,我还需要CardBody组件。

就像这样:

代码语言:javascript
复制
class Content : RComponent<RProps, RState>() {
    override fun RBuilder.render() {
        Card {
            CardBody {
                + "Hello World"
            }
        }
    }
}

,但是CardBody不是一个单独的react引导组件,它可以像Card组件一样导入。它是Card组件中的一个值。

类型记录定义文件Card.d.ts如下所示:

代码语言:javascript
复制
import CardImg from './CardImg';
import { BsPrefixPropsWithChildren, BsPrefixRefForwardingComponent } from './helpers';
import { Color, Variant } from './types';
declare const CardBody: BsPrefixRefForwardingComponent<any, {}>;
declare const CardTitle: BsPrefixRefForwardingComponent<any, {}>;
declare const CardSubtitle: BsPrefixRefForwardingComponent<any, {}>;
declare const CardLink: BsPrefixRefForwardingComponent<any, {}>;
declare const CardText: BsPrefixRefForwardingComponent<any, {}>;
declare const CardHeader: BsPrefixRefForwardingComponent<any, {}>;
declare const CardFooter: BsPrefixRefForwardingComponent<any, {}>;
declare const CardImgOverlay: BsPrefixRefForwardingComponent<any, {}>;
export interface CardProps extends BsPrefixPropsWithChildren {
    bg?: Variant;
    text?: Color;
    border?: Variant;
    body?: boolean;
}
declare type Card = BsPrefixRefForwardingComponent<'div', CardProps> & {
    Img: typeof CardImg;
    Title: typeof CardTitle;
    Subtitle: typeof CardSubtitle;
    Body: typeof CardBody;
    Link: typeof CardLink;
    Text: typeof CardText;
    Header: typeof CardHeader;
    Footer: typeof CardFooter;
    ImgOverlay: typeof CardImgOverlay;
};
declare const Card: Card;
export default Card;

如果我使用dukat将TypeScript定义文件转换为Kotlin声明。它输出一个Card.Module_react bootstrap.kt文件。

代码语言:javascript
复制
@file:JsModule("react-bootstrap")
@file:JsNonModule
@file:Suppress("INTERFACE_WITH_SUPERCLASS", "OVERRIDING_FINAL_MEMBER", "RETURN_TYPE_MISMATCH_ON_OVERRIDE", "CONFLICTING_OVERLOADS")

import kotlin.js.*
import kotlin.js.Json
import org.khronos.webgl.*
import org.w3c.dom.*
import org.w3c.dom.events.*
import org.w3c.dom.parsing.*
import org.w3c.dom.svg.*
import org.w3c.dom.url.*
import org.w3c.fetch.*
import org.w3c.files.*
import org.w3c.notifications.*
import org.w3c.performance.*
import org.w3c.workers.*
import org.w3c.xhr.*

external var CardBody: BsPrefixRefForwardingComponent<Any, Any>

external var CardTitle: BsPrefixRefForwardingComponent<Any, Any>

external var CardSubtitle: BsPrefixRefForwardingComponent<Any, Any>

external var CardLink: BsPrefixRefForwardingComponent<Any, Any>

external var CardText: BsPrefixRefForwardingComponent<Any, Any>

external var CardHeader: BsPrefixRefForwardingComponent<Any, Any>

external var CardFooter: BsPrefixRefForwardingComponent<Any, Any>

external var CardImgOverlay: BsPrefixRefForwardingComponent<Any, Any>

external interface CardProps : BsPrefixPropsWithChildren {
    var bg: dynamic /* String | String | String | String | String | String | String | String | String? */
        get() = definedExternally
        set(value) = definedExternally
    var text: String? /* 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' | 'dark' | 'light' | 'white' | 'muted' */
        get() = definedExternally
        set(value) = definedExternally
    var border: dynamic /* String | String | String | String | String | String | String | String | String? */
        get() = definedExternally
        set(value) = definedExternally
    var body: Boolean?
        get() = definedExternally
        set(value) = definedExternally
}

external interface `T$0` {
    var Img: Any
    var Title: Any
    var Subtitle: Any
    var Body: Any
    var Link: Any
    var Text: Any
    var Header: Any
    var Footer: Any
    var ImgOverlay: Any
}

@JsName("default")
external var Card: BsPrefixRefForwardingComponent<String /* 'div' */, CardProps> /* BsPrefixRefForwardingComponent<String /* 'div' */, CardProps> & `T$0` */

但这不能编译。

  1. 如何为组件编写kotlin声明文件,该组件中包含组件子组件而不是单独的组件文件?
  2. 如何在RBuilder.render()方法中使用该组件?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-03 05:06:14

似乎是看了打字稿的解密

文件: Card.kt

代码语言:javascript
复制
@file:JsModule("react-bootstrap/Card")

package bootstrap

import react.RClass
import react.RProps

@JsName("default")
external val Card: RClass<RProps>

文件: Card.ktx.kt (因为在JsModule中不能有非外部声明)

代码语言:javascript
复制
package bootstrap

import react.RClass
import react.RProps

val CardBody : RClass<RProps> = Card.asDynamic().Body

val CardLink : RClass<RProps> = Card.asDynamic().Link

用法

代码语言:javascript
复制
fun RBuilder.MyComp(){
  Card {
    CardBody {+"Card body goes here" }
  }
}

应该行得通。

票数 4
EN

Stack Overflow用户

发布于 2021-05-26 05:54:24

如果您想对外部元素使用css,您可以这样做,

首先,您需要让元素支持来实现WithClassName接口:

代码语言:javascript
复制
@file:JsModule("react-bootstrap")
@file:JsNonModule

import react.RProps
import react.RClass
import react.dom.WithClassName


@JsName("Card")
external val bsCard : RClass<bsCardProps>

external interface bsCardProps: WithClassName

然后在另一个.kt文件中使用样式函数,如下所示:

代码语言:javascript
复制
import styled.styled


val styledBsCard = styled(bsCard)

现在,像样式元素一样使用styledBsCard:

代码语言:javascript
复制
override fun RBuilder.render() {
styledBsCard {
            css {
                width = 200.px
                backgroundColor = Color.blue
                marginLeft = 100.px
            }
            //something other elements
        }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62920114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档