事件处理
- 通过onXxx属性指定事件处理函数(注意大小写)
- React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
- React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
- 通过event.target得到发生事件的DOM元素对象
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="test"></div>
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
<script type="text/babel">
/*
一。通过onXxx属性指定事件处理函数
1)React使用的是自定义(合成)事件,而不是使用原生的DOM事件 ——为了更好的兼容
2)React中的事件是通过事件委托的方式处理的(委托给组件最外层的元素)———为了更高效
二。通过event.target得到发生事件的DOM元素对象——不要过度使用ref
*/
class Demo extends React.Component{
//创建ref容器
myRef = React.createRef()
myRef2 = React.createRef()
//展示左侧输入框的数据
showData = (event)=>{
console.log(event.target);
alert(this.myRef.current.value);
}
//展示右侧输入框的数据
showData2 = (event)=>{
alert(event.target.value);//绑定的事件源等于触发的事件源
}
render(){
return(
<div>
<input ref={this.myRef} type="text" placeholder="点击按钮提示数据"/>
<button onClick={this.showData}>点我提示左侧的数据</button>
<input onBlur={this.showData2} type="text" placeholder="失去焦点提示数据"/>
</div>
)
}
}
//渲染组件到页面
ReactDOM.render(<Demo/>,document.getElementById('test'))
</script>
</body>
</html>
包含表单的组件分类
- 受控组件
- 非受控组件:现用现取
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="test"></div>
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
<script type="text/babel">
//创建组件 非受控组件 现用现取
class Login extends React.Component{
handleSubmit=(event)=>{
event.preventDefault();//阻止表单提交
const {username,password}=this
alert(`用户名是${username.value},密码是${password.value}`)
}
render(){
return (
<form onSubmit={this.handleSubmit} >
用户名:<input ref={c=>this.username=c} name="username"type="text"/>
密码:<input ref={c=>this.password=c} name="password"type="password"/>
<button>登陆</button>
</form>
)
}
}
ReactDOM.render(<Login/>,document.querySelector('#test'))
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="test"></div>
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
<script type="text/babel">
//创建组件 受控组件 不是现用现取的
class Login extends React.Component{
//初始化状态
state={username:'',password:''}
saveUsername=(event)=>{
// console.log(event.target.value);
this.setState({username:event.target.value})
}
savePassword=(event)=>{
// console.log(event.target.value);
this.setState({password:event.target.value})
}
handleSubmit=(event)=>{
event.preventDefault()
const {username,password}=this.state
alert(`用户名是${username},密码是${password}`)
}
render(){
return (
<form onSubmit={this.handleSubmit} >
用户名:<input onChange={this.saveUsername} name="username"type="text"/>
密码:<input onChange={this.savePassword} name="password"type="password"/>
<button>登陆</button>
</form>
)
}
}
ReactDOM.render(<Login/>,document.querySelector('#test'))
</script>
</body>
</html>
高阶函数:如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。
1.若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。
2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。
常见的高阶函数有:Promise、setTimeout、arr.map()等等
函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。
function sum(a){
return(b)=>{
return (c)=>{
return a+b+c
}
}
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="test"></div>
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
<script type="text/babel">
/*
高阶函数:如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。
1.若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。
2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。
常见的高阶函数有:Promise、setTimeout、arr.map()等等
函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。
function sum(a){
return(b)=>{
return (c)=>{
return a+b+c
}
}
}
*/
class Login extends React.Component{
//初始化状态
state={username:'',password:''}
// saveUsername=(event)=>{
// // console.log(event.target.value);
// this.setState({username:event.target.value})
// }
// savePassword=(event)=>{
// // console.log(event.target.value);
// this.setState({password:event.target.value})
// }
saveData=(dataType)=>{
return (event)=>{
console.log(dataType);
this.setState({[dataType]:event.target.value})// obj[a] = 'tom'
}
}
handleSubmit=(event)=>{
event.preventDefault()
const {username,password}=this.state
alert(`用户名是${username},密码是${password}`)
}
render(){
return (
<form onSubmit={this.handleSubmit} >
用户名:<input onChange={this.saveData('username')} name="username"type="text"/>
密码:<input onChange={this.saveData('password')} name="password"type="password"/>
<button>登陆</button>
</form>
)
}
}
// this.saveFormData('username')这叫把saveformdata的返回值赋作为onchange的回调 必须把一个函数作为onchange的回调,管你写不写小括号
ReactDOM.render(<Login/>,document.querySelector('#test'))
</script>
</body>
</html>
如果不用函数柯里化的实现方式
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div id="test"></div>
<script src="js/react.development.js"></script>
<script src="js/react-dom.development.js"></script>
<script src="js/babel.min.js"></script>
<script type="text/babel">
/*
高阶函数:如果一个函数符合下面2个规范中的任何一个,那该函数就是高阶函数。
1.若A函数,接收的参数是一个函数,那么A就可以称之为高阶函数。
2.若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数。
常见的高阶函数有:Promise、setTimeout、arr.map()等等
函数的柯里化:通过函数调用继续返回函数的方式,实现多次接收参数最后统一处理的函数编码形式。
function sum(a){
return(b)=>{
return (c)=>{
return a+b+c
}
}
}
*/
class Login extends React.Component{
//初始化状态
state={username:'',password:''}
// saveUsername=(event)=>{
// // console.log(event.target.value);
// this.setState({username:event.target.value})
// }
// savePassword=(event)=>{
// // console.log(event.target.value);
// this.setState({password:event.target.value})
// }
saveData=(dataType,event)=>{
this.setState({[dataType]:event.target.value})// obj[a] = 'tom'
}
handleSubmit=(event)=>{
event.preventDefault()
const {username,password}=this.state
alert(`用户名是${username},密码是${password}`)
}
render(){
return (
<form onSubmit={this.handleSubmit} >
用户名:<input onChange={event=>this.saveData('username',event)} name="username"type="text"/>
密码:<input onChange={event=>this.saveData('password',event)} name="password"type="password"/>
<button>登陆</button>
</form>
)
}
}
// this.saveFormData('username')这叫把saveformdata的返回值赋作为onchange的回调 必须把一个函数作为onchange的回调,管你写不写小括号
ReactDOM.render(<Login/>,document.querySelector('#test'))
</script>
</body>
</html>