从一个简单表单谈起

假设我们要做一个表单,比如是这样,要怎么做?

你可能会这样写:firstName对应一个键盘记录,lastName对应一个键盘记录:

import React from 'react'class Uncontrolled extends React.Component {constructor(props) {super(props)this.state = {firstName: '',lastName: '',}this.handleChangeFirstName = this.handleChangeFirstName.bind(this)this.handleChangeLastName = this.handleChangeLastName.bind(this)this.handleSubmit = this.handleSubmit.bind(this)}handleChangeFirstName({ target }) {this.setState({firstName: target.value,})}handleChangeLastName({ target }) {this.setState({lastName: target.value,})}handleSubmit(e) {e.preventDefault()console.log(`${this.state.firstName} ${this.state.lastName}`)}render() {return (<form onSubmit={this.handleSubmit}><input type="text" onChange={this.handleChangeFirstName} /><input type="text" onChange={this.handleChangeLastName} /><button>Submit</button></form>)}}export default Uncontrolled

但这样写的话,复用性就会很差,如果我不是2个表格,而是20个表格呢?难道要绑定20个差异不大看起来十分类似的函数吗?

事实上,可以有更好的方案。正如之前看到的,事件对象的目标属性表示触发事件的输入框。因此,我们可以将输入框的名称和值作为变量。handleChange改造成如下形式:

  handleChange({ target }) {this.setState({[target.name]: target.value,})}

接着在渲染时为每个组件设置具体名称:

<input type="text" name="firstName" onChange={this.handleChange} />
<input type="text" name="lastName" onChange={this.handleChange} />

完整代码如下:

import React from 'react'class Uncontrolled extends React.Component {constructor(props) {super(props)this.state = {firstName: '',lastName: '',}this.handleChange = this.handleChange.bind(this)this.handleSubmit = this.handleSubmit.bind(this)}handleChange({ target }) {this.setState({[target.name]: target.value,})}handleSubmit(e) {e.preventDefault()console.log(`${this.state.firstName} ${this.state.lastName}`)}render() {return (<form onSubmit={this.handleSubmit}><input type="text" name="firstName" onChange={this.handleChange} /><input type="text" name="lastName" onChange={this.handleChange} /><button>Submit</button></form>)}}export default Uncontrolled

为表单设置默认值

但我们之前打开表单的时候,这个表单是没有默认值的。如果想要一打开的时候就添加默认值。一种思路是写成这样:

<input type="text" defaultValue="Hello React" />

另外,我们还可以给state赋初值的方式来给默认值:

import React from 'react'class Controlled extends React.Component {constructor(props) {super(props)this.state = {firstName: 'Dan',lastName: 'Abramov',}this.handleChange = this.handleChange.bind(this)this.handleSubmit = this.handleSubmit.bind(this)}handleChange({ target }) {this.setState({[target.name]: target.value,})}handleSubmit(e) {e.preventDefault()console.log(`${this.state.firstName} ${this.state.lastName}`)}render() {return (<form onSubmit={this.handleSubmit}><inputtype="text"name="firstName"value={this.state.firstName}onChange={this.handleChange}/><inputtype="text"name="lastName"value={this.state.lastName}onChange={this.handleChange}/><button>Submit</button></form>)}}export default Controlled

如果要多次点击

继续进一步探讨我们希望尽量减少写重复代码的思路。假如这个表单的Submit按钮点击一次和点击两次想要触发不同的效果呢?我们肯定不想去对每一种效果写一种handle函数,那有什么简单一点的方法吗?

  handleEvent(event) {switch (event.type) {case 'click':console.log('clicked')breakcase 'dblclick':console.log('double clicked')breakdefault:console.log('unhandled', event.type)}}
<button onClick={this.handleEvent} onDoubleClick={this.handleEvent}>Click me!</button>

这样就可以实现我们的需求。

React简单表单最佳实践相关推荐

  1. html+style+标签,20 + HTML表单最佳实践入门

    良好的HTML表单要求至少在四点注意: 语义学 无障碍 功能 设计 表格可能会很困难,有时甚至是困扰了用户;经常中断的形式在页面上用户的主要重点和方向:他们购买的礼物,或尝试新的Web应用程序的意图, ...

  2. maxcompute操作_MaxCompute表设计最佳实践

    MaxCompute表设计最佳实践 产生大量小文件的操作 MaxCompute表的小文件会影响存储和计算性能,因此我们先介绍下什么样的操作会产生大量小文件,从 而在做表设计的时候考虑避开此类操作. 使 ...

  3. [React]你有用过哪些React的表单库吗?说说它们的优缺点

    [React]你有用过哪些React的表单库吗?说说它们的优缺点 redux-form react-jsonschema-form formik unform 个人简介 我是歌谣,欢迎和大家一起交流前 ...

  4. 前端基础:通过表单元素实践《健康体检单》

    前端基础:通过表单元素实践<健康体检单> HTML 表单用于接收不同类型的用户输入,用户提交表单时向服务器传输数据,从而实现用户与Web服务器的交互. 一.项目说明 该项目是进行表格布局表 ...

  5. 行政区划数据库表结构设计最佳实践

    行政区划表设计最佳实践 这里只涉及行政区划,不涉及国家表:此设计仅提供参考,具体内容请根据项目需求设计 这里只涉及行政区划,不涉及国家表:此设计仅提供参考,具体内容请根据项目需求设计 主键:id,bi ...

  6. dwcc2015如何制作html,Dreamweaver CC2015简单表单的创建方法

    Dreamweaver CC 2015 官方正式版 软件大小:249M授权方式:免费软件 立即下载 Dreamweaver CC2015怎么创建简单的表单?Dreamweaver集网页制作和管理网站于 ...

  7. js与php表单验证,JS简单表单验证功能完整示例

    本文实例讲述了JS简单表单验证功能.分享给大家供大家参考,具体如下: 简单js表单验证demo Document //当用户名获取焦点时 function focus_username(){ docu ...

  8. 阿里巴巴数据库分库分表的最佳实践

    点击▲关注 "数据和云"   给公众号标星置顶 更多精彩 第一时间直达 1.阿里巴巴分布式数据层发展和演变 业务数据从原来的单库单表模式变成了数据被拆分到多个数据库,甚至多个表中, ...

  9. React组件设计模式与最佳实践

    React设计思想 UI=f(data)XUI = f(data)XUI=f(data)X 在React中,界面完全由数据驱动 在React中,一切都是组件 用户界面就是组件 export defau ...

最新文章

  1. UITableView性能提升和优化(第3章) 之一
  2. bestcoder #71 1003 找位运算的最大生成树
  3. 最大公约数和最小公倍数 模板
  4. 公网IP的判断和获取
  5. 机器学习算法总结--提升方法
  6. PHP(2):搭建PHP 运行环境中可能出现的问题及处理方法
  7. 负载均衡会话保持技术、原理、产品(以F5为例)
  8. OpenShift 4之访问权限分级授权
  9. Android 中View仅仅能接收到ACTION_DOWN无法接收ACTION_MOVE和ACTION_UP解决的方法
  10. ansible-playbook Roles include
  11. 日语口语中需要注意的问题~ 不定期更新
  12. 护壁桩嵌入深度_钻孔灌注桩嵌岩深度最少多少
  13. Error: java.lang.RuntimeException: Some file crunching failed, see logs for details
  14. 电脑上怎么看主板型号
  15. 如何使用cygwin在windows下Linux编程
  16. MATLAB设计课题推荐及选择老师技巧
  17. 存档:全球各国名称中英文对照表
  18. ThinkPHP5.0之PHPmailer发送邮箱(qq、163)
  19. 函数概念与特性——反函数、复合函数
  20. 推荐:几个优质的数据公众号

热门文章

  1. 戴尔 成铭3980台式计算机,能文能武!戴尔成铭3980商用台式机评测
  2. c语言sleep_编程代码:用C语言来实现下雪效果,这个冬天,雪花很美
  3. u32、u16、u8 数据类型
  4. es的query及filter
  5. Mongodb的索引
  6. java if-then和if-then-else语句(翻译自Java Tutorials)
  7. 一种获取过程调用堆栈信息的简单方法
  8. ms speech sdk51 TTS使用
  9. Python学习二——变量和简单数据类型
  10. 如何发表cscd核心论文_教育论文发表时几种核心期刊介绍