基于React实现表单数据的添加和删除详解


Posted in Javascript onMarch 14, 2017

前言

最近在学习React,做了一个简单的Demo,用以自勉及和有需要的朋友们参考学习。

实现功能

在输入框中输入数据后,点击保存按钮,数据将会逐一显示在输入框下方,点击保存后显示的任何一条数据,该数据即可被删除。

实现思路

在开始实现之前,我们需要理清我们的思路,这样才能更好地去完成预定功能。

  1. 点击保存按钮时,输入框中的数据读取,可通过onChange绑定事件,获得输入框数据:e.target.value
  2. 自定义一个事件,输入数据后,点击保存按钮时,数据的存储操作交由该事件完成
  3. 当不断点击保存按钮时,数据应该是多个的,可选用数组来存储数据
  4. 数组中,数组的索引是唯一表示一个数据的方式,数据的操作可通过索引进行

实现过程

class ReactDemo extends React.Component{
 render(){
 return(
  <div>
  <input />
  <button>点击保存</button>
  </div>
 )
 }
}
ReactDOM.render(<ReactDemo />,document.getElementById('app'))

这是本次Demo的雏形,接下来我们将会在这上面一点一点地做修改,进行功能的完善。

此时,表单为非受控组件,也就是普通的组件,在输入框中输入任何数据,在输入框内均会显示。

React组件提供了this.state以及this.setState,利用它们,我们可以十分方便地管理、更新组件的状态。

constructor() {
 super()
 this.state = {
  val: '',
  arr: []
 }
 }

this.state通常在构造函数内部进行初始化,其值为对象,本例中,val用于保存输入框中的值,初始值为空字符串;arr是个数据,用于存储多个数据。

handleData(e) {
 this.setState({
  val: e.target.value
 })
 }

这里,this.setState会将val的值更新为e.target.value,当组件状态值(这里为val)发生改变,组件就会自动调用render()重新渲染UI 。

onButtonClick(e) {
  var val = this.state.val
  this.setState({
  arr: [val, ...this.state.arr]
  })
 }

展开运算符(…)是ES6的语法,它允许一个表达式在某处展开,利用这一特性,可将数组元素逐一展开:...this.state.arr,让val总是成作为数组的第一个元素,组成新数组[val, ...this.state.arr]后,赋给arr。

onDelete(index, e) {
 this.setState({
  arr: this.state.arr.filter((elem, i) => index !== i)
 })
 }

通过数组的索引对数据进行删除操作, [].filter()接受一个方法作为它的参数,并返回匹配条件(index !== i)的元素组成的新数组。

{arr1.map((i,index) =>(
 <div onClick={this.onDelete.bind(this,index)}>{i}</div>
 ))}

这种JSX的语法是由facebook官方提出的一种十分简明的写法,个人觉得好用到爆。[].map()对数组元素依次进行函数的调用,并返回函数调用结果组成的新数组。bind(this,index)的第二个参数index为原函数onDelete(index,e)省略掉的第一个参数。

好了,大功告成,让我们一起来看下效果吧…

基于React实现表单数据的添加和删除详解

添加效果

基于React实现表单数据的添加和删除详解

删除后效果

总结

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
JavaScript 精粹读书笔记(1,2)
Feb 07 Javascript
artdialog的图片/标题以及关闭按钮不显示的解决方法
Jun 27 Javascript
Extjs表单常见验证小结
Mar 07 Javascript
javascript操作Cookie(设置、读取、删除)方法详解
Mar 18 Javascript
node.js cookie-parser 中间件介绍
Jun 06 Javascript
js获取腾讯视频ID的方法
Oct 03 Javascript
原生js实现电商侧边导航效果
Jan 19 Javascript
jQuery Validate表单验证插件实现代码
Jun 08 jQuery
在一个页面实现两个zTree联动的方法
Dec 20 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
Jul 24 Javascript
微信小程序入门之广告条实现方法示例
Dec 05 Javascript
Ant Design Pro 之 ProTable使用操作
Oct 31 Javascript
Node.js 中exports 和 module.exports 的区别
Mar 14 #Javascript
JS检测数组类型的方法小结
Mar 14 #Javascript
轻松理解JavaScript闭包
Mar 14 #Javascript
微信小程序 页面跳转及数据传递详解
Mar 14 #Javascript
JavaScript ES6中export、import与export default的用法和区别
Mar 14 #Javascript
微信小程序 动态绑定数据及动态事件处理
Mar 14 #Javascript
Vue 2.0+Vue-router构建一个简单的单页应用(附源码)
Mar 14 #Javascript
You might like
php 执行系统命令的方法
2009/07/07 PHP
php使用iconv中文截断问题的解决方法
2015/02/11 PHP
php实现过滤UBB代码的类
2015/03/12 PHP
PHP回调函数与匿名函数实例详解
2017/08/16 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
Laravel模型间关系设置分表的方法示例
2018/04/21 PHP
在laravel中实现ORM模型使用第二个数据库设置
2019/10/24 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
Jquery幻灯片特效代码分享--鼠标点击按钮时切换(1)
2015/08/15 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
关于页面刷新vuex数据消失问题解决方案
2017/07/03 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
实例分析编写vue组件方法
2019/02/12 Javascript
Vue使用JSEncrypt实现rsa加密及挂载方法
2020/02/07 Javascript
[48:27]EG vs Liquid 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python可跨平台实现获取按键的方法
2015/03/05 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
详解python 发送邮件实例代码
2016/12/22 Python
在pandas多重索引multiIndex中选定指定索引的行方法
2018/11/16 Python
Python通用循环的构造方法实例分析
2018/12/19 Python
对python判断ip是否可达的实例详解
2019/01/31 Python
python获取点击的坐标画图形的方法
2019/07/09 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
cosme官方海外旗舰店:日本最大化妆品和美容产品的综合口碑网站
2017/01/18 全球购物
西式婚礼证婚词
2014/01/12 职场文书
董事长秘书职责
2014/01/31 职场文书
学生会感恩节活动方案
2014/10/11 职场文书
劳动仲裁撤诉申请书
2015/05/18 职场文书
2016年感恩教师节校园广播稿
2015/12/18 职场文书
简述python四种分词工具,盘点哪个更好用?
2021/04/13 Python
Python基础之常用库常用方法整理
2021/04/30 Python
python爬虫之selenium库的安装及使用教程
2021/05/23 Python
pytorch通过训练结果的复现设置随机种子
2021/06/01 Python