之前的文章我们介绍了  React 事件,方法, React定义方法的几种方式 获取数据 改变数据 执行方法传值。接下来我们将介绍 React 表单事件 键盘事件 事件对象以及 React中 的 ref 获取 dom 节点 、双向数据绑定,约束性和非约束性组件。

 import React, {Component} from 'react';

 class Home extends Component {
constructor(props) {
super(props);
this.state = {
name: "zhangsan",
}; } getData = (event) => {
console.log(this.state.name);
event.target.style.color = "red";
} // event
inputChange1 = (event)=>{
this.setState({
name: event.target.value
})
} // ref
inputChange2 = ()=>{
this.setState({
name: this.refs.name.value
})
} // 键盘事件
inputChange3 = (event)=>{
console.log(event.keyCode)
} inputGet = () =>{
console.log(this.state.name)
} render() {
return (
<div>
<p>Hello {this.state.name}</p> <button onClick={this.getData}>获取event</button> <br/><br/> {/*event*/}
<input onChange={this.inputChange1} type="text"/>
<button onClick={this.inputGet}>获取input值</button> <br/><br/> {/*ref*/}
<input ref="name" onChange={this.inputChange2} type="text"/>
<button onClick={this.inputGet}>获取input值</button> <br/><br/> {/*键盘事件*/}
<input onKeyUp={this.inputChange3} type="text"/>
<button onClick={this.inputGet}>获取input值</button> <br/><br/> {/*value defaultValue*/}
<input value={this.state.name} onChange={this.inputChange1} type="text"/>
<input defaultValue={this.state.name} onChange={this.inputChange1} type="text"/>
</div>
);
}
} export default Home;

在调用 getData 的方法时传值 event,就可以获取到该元素的原生 DOM 属性,我们可以对其进行操作,如改变元素颜色:event.target.style.color = "red";

在 React 中并没有提供类似于 Vue 中 model 的双向数据绑定,所以我们得自己来写,在 input 框中输入内容时我们可以根据 onChange 事件实时获取 input 框中的内容,再通过 event 事件获取到原生 DOM 里面的 value 值再赋给 this.state 中的数据,既可以达到双向数据绑定的目标。

当然 React 提供了类似于 Vue 的 ref 属性,我们同样可以通过 ref 绑定属性名,然后通过 refs 获取到该属性名,就能获取到 input 框的 value 值。然后达到双向数据绑定的目标。

React 中同样为我们提供了键盘事件 onKeyUp 和 onKeyDown ,我们可以根据该事件达到双向数据绑定的目标。

在 input 框最初赋值时可以有 value 和 defaultValue 两种赋值方式,

defaultValue 是原生 DOM 中的 value 属性,可以是一个死值,也可以是 this.state 中的数据,React 不会去管它。这样的组件叫做非约束性组件。

value 是 React 中的一个属性,它的值可以是一个死值,也可以是 this.state 中的数据, 但是需要通过 onChange 事件配合使用,如果不写 onChange 事件会报错。这样的组件叫做非约束性组件。

最后运行结果为:

最新文章

  1. 自定义ActionBar标题与菜单中的文字样式
  2. Java工程图标前面的红色叹号
  3. django with mysql (part-4)
  4. Sublime Text插件之Emmet
  5. nginx 1.安装
  6. Altium designer PCB中过孔铺地连接的设置
  7. C#去除byte数组头尾杂质(即不需要的数据)
  8. 如何判断是REQUEST请求是来自移动终端还是来自PC端
  9. html-----vedio标签(HTML5新标签VIDEO在IOS上默认全屏播放)
  10. mysql安装使用--2 用户管理
  11. log4cxx第三篇----使用多个logger
  12. MySql 存储过程 退出
  13. Android-HttpClient-Get请求获取网络图片设置壁纸
  14. Linux基础命令---diff
  15. lua内存管理
  16. 20155220 2016-2017-2 《java程序设计》第四周总结
  17. C语言使用数学库编译不通过问题
  18. Java学习(运算符,引用数据类型)
  19. python开发_python中的list操作
  20. Java的post(HTTPS)请求-----接口测试

热门文章

  1. BCH硬分叉在即,Bitcoin ABC和NChain两大阵营PK
  2. 怎样拆分View Controller进而实现轻量级的View Controller[UIKit]
  3. PHP生成图片太慢了。。有些都不出来、
  4. Java中synchronized
  5. Java for LeetCode 120 Triangle
  6. Java for LeetCode 112 Path Sum
  7. 前端基础之---css
  8. dojo 官方翻译 dojo/string 版本1.10
  9. php中一些比常见做法更好的实践
  10. Android蓝牙通讯【转】