如何在 Kotlin.js 中使用 Redux/React?
How do I work with Redux/React in Kotlin.js?
我想和 Redux/React in Kotlin.js, but I only found Redux/React libraries for Android (such as redux-kotlin) 一起工作。
使用 Kotlin/JS 你不需要通常意义上的 "libraries",你只需要告诉编译器如何使用 React。
为此,您应该编写一组 external
声明,并可以使用特殊的 JS 平台注释对其进行注释(这很像在 TypeScript 中编写 d.ts
文件)。
请参阅这些链接:JavaScript interop, Module systems.
您可以查看以下项目:kotlin-wrappers。
然而,作者声称它还处于非常早期的阶段。
另一个有用的项目是 kotlin-fullstack-sample,它展示了如何将 React 与 Kotlin 结合使用。
此外,您可以使用 ts2kt 工具为 Kotlin 生成 React 声明。
它也有点不完整,并不总是产生正确的声明,您必须手动修复错误。
最后,您可以退回到 dynamic 类型。
它是开始使用 React 的最快选择,但是使用 dynamic 你不会从 Kotlin 类型系统中获得任何好处。
请注意,对于 Kotlin,您不能使用 JSX。
您可以使用 type-safe builders instead, for example, kotlinx.html 库。
您需要为 redux 编写类型包装器:
external interface ReduxState
external class Store {
@JsName("getState")
fun getState(): ReduxState
@JsName("dispatch")
fun dispatch(action: dynamic)
}
@JsModule("redux")
@JsNonModule
external object Redux {
@JsName("createStore")
fun <ST : ReduxState> createStore(reducer: (ST, dynamic) -> ReduxState,
initialState: ST,
enhancer: (dynamic) -> ST = definedExternally)
: Store
@JsName("applyMiddleware")
fun applyMiddleware(vararg middleware: () -> (dynamic) -> dynamic)
: ((dynamic) -> Unit, () -> ReduxState) -> Unit
@JsName("compose")
fun compose(vararg funcs: dynamic): (dynamic) -> dynamic
}
对于 react-redux
@file:JsModule("react-redux")
package ktypings.redux
import react.RClass
import react.RProps
import react.ReactElement
@JsName("connect")
external fun <P : RProps, ST : ReduxState> connect(
mapStateToProps: ((ST, P) -> P)? = definedExternally,
mapDispatchToProps: (((dynamic) -> Unit, P) -> P)? = definedExternally
): (Any) -> RClass<P>
@JsName("Provider")
external val Provider: RClass<ProviderProps>
external interface ProviderProps : RProps {
var store: Any
}
以便在您的 kotlin 代码中使用它们。
您可以在此处查看示例项目 https://github.com/ShyykoSerhiy/kotlin-react-redux-material
我想和 Redux/React in Kotlin.js, but I only found Redux/React libraries for Android (such as redux-kotlin) 一起工作。
使用 Kotlin/JS 你不需要通常意义上的 "libraries",你只需要告诉编译器如何使用 React。
为此,您应该编写一组 external
声明,并可以使用特殊的 JS 平台注释对其进行注释(这很像在 TypeScript 中编写 d.ts
文件)。
请参阅这些链接:JavaScript interop, Module systems.
您可以查看以下项目:kotlin-wrappers。 然而,作者声称它还处于非常早期的阶段。 另一个有用的项目是 kotlin-fullstack-sample,它展示了如何将 React 与 Kotlin 结合使用。
此外,您可以使用 ts2kt 工具为 Kotlin 生成 React 声明。 它也有点不完整,并不总是产生正确的声明,您必须手动修复错误。
最后,您可以退回到 dynamic 类型。 它是开始使用 React 的最快选择,但是使用 dynamic 你不会从 Kotlin 类型系统中获得任何好处。
请注意,对于 Kotlin,您不能使用 JSX。 您可以使用 type-safe builders instead, for example, kotlinx.html 库。
您需要为 redux 编写类型包装器:
external interface ReduxState
external class Store {
@JsName("getState")
fun getState(): ReduxState
@JsName("dispatch")
fun dispatch(action: dynamic)
}
@JsModule("redux")
@JsNonModule
external object Redux {
@JsName("createStore")
fun <ST : ReduxState> createStore(reducer: (ST, dynamic) -> ReduxState,
initialState: ST,
enhancer: (dynamic) -> ST = definedExternally)
: Store
@JsName("applyMiddleware")
fun applyMiddleware(vararg middleware: () -> (dynamic) -> dynamic)
: ((dynamic) -> Unit, () -> ReduxState) -> Unit
@JsName("compose")
fun compose(vararg funcs: dynamic): (dynamic) -> dynamic
}
对于 react-redux
@file:JsModule("react-redux")
package ktypings.redux
import react.RClass
import react.RProps
import react.ReactElement
@JsName("connect")
external fun <P : RProps, ST : ReduxState> connect(
mapStateToProps: ((ST, P) -> P)? = definedExternally,
mapDispatchToProps: (((dynamic) -> Unit, P) -> P)? = definedExternally
): (Any) -> RClass<P>
@JsName("Provider")
external val Provider: RClass<ProviderProps>
external interface ProviderProps : RProps {
var store: Any
}
以便在您的 kotlin 代码中使用它们。 您可以在此处查看示例项目 https://github.com/ShyykoSerhiy/kotlin-react-redux-material