KotlinJS react-hook-form 库,注册元素

KotlinJS react-hook-form library, registering elements

大家好,我尝试使用 Dukat 和 Wrappers 让 react-hook-form 与 KotlinJS 一起工作,这就是我得到的。

(包装器工作正常,尝试在控制台中记录它,它确实是库中的 useForm)

这就是我尝试使用 useForm 挂钩的方式

  val useForm = useForm<ProfileModel>()

    val register = useForm.register
    val errors = useForm.formState.errors
    val handleSubmit = useForm.handleSubmit

    val registerInstagram = register("instagram", object : validateOptions<ProfileModel, Any> {
        override var required = true
        override var maxLength = 40
    })

        form(classes = "") {
            attrs.onSubmit = {
                it.preventDefault()
                console.log("Submit")
                handleSubmit({ data, ev ->
                    console.log("On Submit " + data)
                }, { errors, ev ->
                    console.log("On submit error " + errors)
                })
            }


            input(type = InputType.text,
                classes = "$defaultInputStyle mb-4") {
                attrs.placeholder = "Name"

                register("name", object : validateOptions<ProfileModel, Any> {
                    override var required = true
                    override var maxLength = 15
                })
            }

            input(type = InputType.text,
                classes = "$defaultInputStyle mb-4") {
                this.ref = registerInstagram.ref
                attrs {
                    this.placeholder = "Instagram"
                    this.onChange = registerInstagram.onChange
                    this.onBlur = registerInstagram.onBlur
                    this.name = registerInstagram.name
                }
            }

            button(classes = defaultButtonStyle, type = ButtonType.submit) {
                +"Submit"
            }

        }
    }

useForm 确实有效,它为我提供了所有正确的值,如寄存器、错误等,但我无法将它正确连接到 Kotlinjs 中的输入元素。

注册 returns 以下内容,我编辑了界面以适应 React DOM 的属性,因为在常规的 React 表单挂钩中你会使用 <Input (...register) 这将适用所有这 4 个元素。

external interface UseFormRegisterReturn {
    var onChange: ChangeEventHandler<*> // I changed this
    var onBlur: FocusEventHandler<*> // I changed this
    var ref: RefCallback<*> //I changed this
    var name: InternalFieldName
}

当我点击提交时,我打印了提交,但是来自 useForm 的 handleSubmit 不是 运行 并且没有数据被打印。不确定我还能用这个设置做什么。

这是其余的相关包装代码

@JsName("useForm")
external fun <TFieldValues : FieldValues> useForm(props: `T`<TFieldValues> = definedExternally): UseFormReturn<TFieldValues, Any>


external interface UseFormReturn<TFieldValues : FieldValues, TContext : Any?> {
    var watch: UseFormWatch<TFieldValues>
    var getValues: UseFormGetValues<TFieldValues>
    var setError: UseFormSetError<TFieldValues>
    var clearErrors: UseFormClearErrors<TFieldValues>
    var setValue: UseFormSetValue<TFieldValues>
    var trigger: UseFormTrigger<TFieldValues>
    var formState: FormState<TFieldValues>
    var reset: UseFormReset<TFieldValues>
    var handleSubmit: UseFormHandleSubmit<TFieldValues>
    var unregister: UseFormUnregister<TFieldValues>
    var control: Control<TFieldValues, TContext>
    var register: UseFormRegister<TFieldValues>
    var setFocus: UseFormSetFocus<TFieldValues>
}

基本上,我想知道如何将 useForm 注册到我的元素中。

编辑: 有些事你必须做

 div("w-screen h-screen items-center justify-center p-4") {
        form(classes = "") {
            attrs.onSubmit = {
                it.preventDefault() 1)

                handleSubmit({ data, ev ->
                    console.log("On Submit ", data)
                }, { errors, ev ->
                    console.log("On submit error ", errors)
                })(it) 2)
            }

            input(type = InputType.text,
                classes = "$defaultInputStyle mb-4") {
                this.ref = registerInstagram.ref
                attrs { 3)
                    this.placeholder = "Instagram" 
                    this.onChange = registerInstagram.onChange
                    this.onBlur = registerInstagram.onBlur
                    this.name = registerInstagram.name
                }
            }

            button(classes = defaultButtonStyle, type = ButtonType.submit) {
                +"Submit"
            }
  1. 防止默认(如果您不想刷新页面)
  2. 函数 handleSubmit RETURNS 需要事件作为其参数的函数。这对我来说是缺失的,你需要调用 handleSubmit()()
  3. 应用从注册函数、onBlur、名称 onChange 和 ref 返回的所有内容

这至少发送了数据,但验证和错误还没有发生

好的,这是包含工作错误和所有内容的完整答案,希望这会对某人有所帮助。

  val useForm = useForm<ProfileModel>()

    val register = useForm.register
    val errors = useForm.formState.errors.asDynamic()
    val handleSubmit = useForm.handleSubmit

    val registerName = register("name", js("{required: 'Name is required', maxLength: {" +
            "value: maxNameLength , message:'Max length for a name is ' + maxNameLength}}"))

    div("w-screen h-screen items-center justify-center p-4") {
        form(classes = "") {
            attrs.onSubmit = {
                it.preventDefault()

                handleSubmit({ data, ev ->
                    console.log("On Submit ", data)
                }, { errors, ev ->
                    console.log("On submit error ", errors)
                })(it)
            }

            input(type = InputType.text,
                classes = "$defaultInputStyle mb-4") {
                this.ref = registerName.ref
                attrs {
                    this.placeholder = "Name"
                    this.onChange = registerName.onChange
                    this.onBlur = registerName.onBlur
                    this.name = "name"
                }
            }

            if(jsTypeOf(errors.name) !== "undefined" ) {
                val text = errors.name.message.toString()
                p("ml-3 text-sm text-red-600 -mt-2 mb-2") {
                    +text
                }
            }

            input(classes = defaultButtonStyle, type = InputType.submit) {
            }

  1. 防止默认(如果您不想刷新页面)
  2. 函数 handleSubmit RETURNS 需要事件作为其参数的函数。这对我来说是缺失的,你需要调用 handleSubmit()()
  3. 应用从注册函数、onBlur、名称 onChange 和 ref 返回的所有内容

为了使错误起作用,我必须将错误转换为 Dynamic,对于错误消息,我必须首先检查该字段是否存在错误,如果它确实显示错误 p .我遇到的一个问题是你不能直接使用 errors.name.message 但我不得不将它添加到一个变量并将它转换为一个字符串。

为了验证,我将 register 的第二个参数更改为 dynamic,现在我只传递 js({whatever options I need}) no autocomplete 之类的,但是 JS 编译器会在编写时检查错误,写起来非常简单,所以不应该摆姿势一个问题。

编辑:目前唯一缺少的是在将此库与 Typescript 一起使用时,它会警告您在使用 useForm<Type

时缺少 IDE 中的某些字段