Orime小猪
阅读 390
手摸手教你撸一个form表单自动收集校验装饰器

项目环境搭建

  • create-react-app
  • 需要eject后支持decorator装饰器语法
  • 没了

npx create-react-app fakeAntdFormDemo

cd fakeAntdFormDemo

git add .
git commit -m "initialCommit"

npm run eject
npm i @babel/plugin-proposal-decorators -D

// package.json
  "babel": {
    "presets": [
      "react-app"
    ],
+    "plugins": [
+      [
+        "@babel/plugin-proposal-decorators",
+        {
+          "legacy": true
+        }
+      ]
+    ]
  }

应用组件

src/pages/useFakeAntdForm.js

import React from 'react'
import KFormCreate from './KFormCreate'

@KFormCreate
class UseAntForm extends React.Component {
  // constructor() {}

  render() {
    const { getFieldDecorator, getFieldsValue, getFieldValue } = this.props
    console.log(getFieldsValue());
    console.log(getFieldValue('username'));

    return (<>
      FormAutoValidate: <br/>
      账号:{getFieldDecorator('username', {})(<input type="text" />)}<br/><br/>
      密码:{getFieldDecorator('password', {})(<input type="text"/>)}<br/><br/>
    </>)
  }
}

export default UseAntForm

装饰器

src/pages/KFormCreate.js

import React, { Component } from 'react'

export default function KFormCreate(Comp) {
  return class extends Component {

    constructor(){
      super()
      this.options = {}
      this.state = {}
    }

    getFieldsValue = () => {
      return this.state
    }
    getFieldValue = (field) => {
      return this.state[field]
    }
    handleChange = (e) => {
      const { value, name } = e.target
      this.setState({[name]: value})
    } 

    getFieldDecorator = (field, option) => {
      this.options[field] = option
      return InputComp => {
        // 克隆一份
        return React.cloneElement(InputComp, {
          name: field,
          value: this.state[field] || '',
          onChange: this.handleChange
        })
      }
    } 

    render() {
      return (
        <>
          <Comp
          getFieldDecorator={this.getFieldDecorator}
          getFieldValue={this.getFieldValue}
          getFieldsValue={this.getFieldsValue}
          />
        </>
      )
    }
  }
}

更多功能待完善中。。。

关注下面的标签,发现更多相似文章
评论
相关推荐
11111

111111...

1111

wd...

1111

djsdhsdjhsjhdhjs ddsdsd...

国内知名Wchat团队荣誉出品顶级IM通讯聊天系统

国内知名Wchat团队荣誉出品顶级IM通讯聊天系统 团队言语在先: 想低价购买者勿扰(团队是在国内首屈一指的通信公司离职后组建,低价购买者/代码代码贩子者/同行勿扰/基础版本低于30w勿扰) 。想购买...

test

&lt;div style=&quot;margin-top:20px&quot;&gt; &lt;el-tabs v-model=&quot;editableTabsValue&quot; tab-...

测试标题

chenyuncaic...

我的测试文章

这里我的标题 非 这里是被信息,我希望得到备注 我的第二个标题...

f'g'h'g'h'f'g'h'g'f'h

发布告白夫妇...

nestjs+vue+ts打造一个酷炫的星空聊天室

简介😛 闲暇时间想做一个聊天室来巩固前端技能,于是在2020年6月24号就开始了阿童木聊天室的开发之旅。😈 项目采用全 typescript 开发,这是为了以后的功能迭代打基础。当然,我本身也是很...

好几个放假

东方红格当然多层次发鬼地方...

《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor

来源: 知乎 原文: 《快学 Go 语言》第 16 课 —— 包管理 GOPATH 和 Vendor 到目前位置我们一直在编写单文件代码,只有一个 main.go 文件。本节我们要开始朝完整的项目结构...

dddd

...

《快学 Go 语言》第 15 课 —— 反射

来源: 知乎 原文: 《快学 Go 语言》第 15 课 —— 反射 反射是 Go 语言学习的一个难点,但也是非常重要的一个知识点。反射是洞悉 Go 语言类型系统设计的法宝,Go 语言的 ORM 库离不...

hello

*《快学 Go 语言》第 14 课 —— 魔术变性指针来源: 知乎 原文: 《快学 Go 语言》第 14 课 —— 魔术变性指针 本节我们要学习一些 Go 语言的魔法功能,通过内置的 unsafe 包...

《快学 Go 语言》第 14 课 —— 魔术变性指针

来源: 知乎 原文: 《快学 Go 语言》第 14 课 —— 魔术变性指针 本节我们要学习一些 Go 语言的魔法功能,通过内置的 unsafe 包提供的功能,直接操纵指定内存地址的内存。有了 unsa...

《快学 Go 语言》第 13 课 —— 并发与安全

来源: 知乎 原文: 《快学 Go 语言》第 13 课 —— 并发与安全 上一节我们提到并发编程不同的协程共享数据的方式除了通道之外还有就是共享变量。虽然 Go 语言官方推荐使用通道的方式来共享数据,...

《快学 Go 语言》第 12 课 —— 通道

来源: 知乎 原文: 《快学 Go 语言》第 12 课 —— 通道 不同的并行协程之间交流的方式有两种,一种是通过共享变量,另一种是通过队列。Go 语言鼓励使用队列的形式来交流,它单独为协程之间的队列...

《快学 Go 语言》第 11 课 —— 千军万马跑协程

来源: 知乎 原文: 《快学 Go 语言》第 11 课 —— 千军万马跑协程 协程和通道是 Go 语言作为并发编程语言最为重要的特色之一,初学者可以完全将协程理解为线程,但是用起来比线程更加简单,占用...

测试发布

测试文章发布...

《快学 Go 语言》第 10 课 —— 错误与异常

来源: 知乎 原文: 《快学 Go 语言》第 10 课 —— 错误与异常 Go 语言的异常处理语法绝对是独树一帜,在我见过的诸多高级语言中,Go 语言的错误处理形式就是一朵奇葩。一方面它鼓励你使用 C...