Orime小猪
阅读 105
手摸手教你撸一个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}
          />
        </>
      )
    }
  }
}

更多功能待完善中。。。

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

...

js正则校验,match和test的区别

test()var str=&#39;sad13123dfa4v564d5f8fb5sf&#39;; var re=/\d+/g; alert(re.test(str));// 返回布尔值,是否匹配正...

这是一篇文章

this is a blog这是二级标题不错的博客...

手摸手教你撸一个form表单自动收集校验装饰器

项目环境搭建 create-react-app 需要eject后支持decorator装饰器语法 没了 npx create-react-app fakeAntdFormDemo cd fakeAnt...

test

sss...

测试评论开始

(毕设项目)Vue+Go前端后端一体化 企业级微服务网关项目完整无密云盘分享图片 (毕设项目)Vue+Go前端后端一体化 企业级微服务网关项目 【点击下载】不管是基于Java、Python、PHP,还...

测试评论出入参数

准备开始...

测试

测试...

测一测

优点:前端耗时少。因为后端拼接完了html,浏览器只需要直接渲染出来。有利于SEO(搜索引擎优化)。因为在后端有完整的html页面,所以爬虫更容易爬取获得信息,更有利于seo。无需占用客户端资源。即解...

测试

安装 socialiteproviderssocialiteproviders 为 Laravel Socialite 提供了更多的第三方登录方式,基本上你需要的,都能在这里找到。这个组件方便我们完成...

(毕设项目)Vue+Go前端后端一体化 企业级微服务网关项目完整无密云盘分享

(毕设项目)Vue+Go前端后端一体化 企业级微服务网关项目 【点击下载】不管是基于Java、Python、PHP,还是基于Go的网站,网站流量越高,对网关性能要求越高,尤其是亿级流量网站中,网关更是...

2020最新慕课网全站课程分享实战就业班全部都有云盘链接分享

*2020 慕课网所有课程全部都有,百分百高清原画,所有课程全部包含课件源码,完整无密,百度网盘链接分享,官方同步永久包更新! *官方品质,信誉保障!所有课程全部支持试看任何章节! *【点击下载】 *...

Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》完整无密 云盘分享

Node.js+Koa2+MySQL打造前后端分离精品项目《旧岛》完整无密 【点击下载】Nodejs逐渐成为前端同学进阶的必修技术之一,本课程将带大家从0到1开发一个前后端分离的精品项目《旧岛》,手把...

Learn Go in Y Minutes

转自:https://learnxinyminutes.com/docs/zh-cn/go-cn/ 发明 Go 语言是出于更好地完成工作的需要。Go 不是计算机科学的最新发展潮流,但它却提供了解决现实...

实战企业级项目 践行App重构之路

实战企业级项目 践行App重构之路 完整无密 随着企业级App功能不断累加强大,App代码质量下降、设计缺陷、难以维护、迭代困难等问题越来越突出,App的重构迭代已经成为Android工程师急需解决的...

你好,米粒

米粒小米粒小小米粒其实有时候很孤单...

大学计算机必修课新讲--编译原理+操作系统+图形学

大学计算机必修课新讲--编译原理+操作系统+图形学 无密 [【点击下载】](http://www.97yrbl.com/t-310.html)编译原理,操作系统,图形学被称为程序员的三大浪漫,不仅因为...

2020最新慕课网全站课程完整无密网盘分享

*2020 慕课网所有课程全部都有,百分百高清原画,所有课程全部包含课件源码,完整无密,百度网盘链接分享,官方同步永久包更新!*官方品质,信誉保障!所有课程全部支持试看任何章节!*下载地址:&nbsp...

asdfasdfasdf

asdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdfasdf ~asdfasdfasdfasdfsadfasdfffffffffffffff...

asdfasdfasdf

tttttt...