一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第21天,点击查看活动详情。
事件处理与收集表单数据
Ⅰ-事件处理
- 通过onXxx属性指定事件处理函数(注意大小写)
a)React使用的是自定义(合成事件,而不是使用的原生DOM事件) ----为了更好的兼容性
b)React中的事件是通过事件委托的方式处理的(委托给组件最外层的元素)----为了更高效
- 通过event.target得到发生事件的DOM元素对象 -----不要过度使用ref
Ⅱ-表单组件的分类
就形式上来说,
受控组件就是为某个form表单组件添加value属性;非受控组件就是没有添加value属性的组件
1、受控组件
state = {//初始化状态
username:'', //用户名
password:'' //密码
}
//保存用户名到状态中
saveUsername = (event)=>{
this.setState({username:event.target.value})
}
//保存密码到状态中
savePassword = (event)=>{
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} type="text" name="username"/>
密码:<input onChange={this.savePassword} type="password" name="password"/>
<button>登录</button>
</form>
)
}
}
2、非受控组件
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} type="text" name="username"/>
密码:<input ref={c => this.password = c} type="password" name="password"/>
<button>登录</button>
</form>
)
}
}
高阶函数与函数柯里化
① 高阶函数:
如果一个函数符合下面两个规范中的任何一个,那该函数就是高阶函数
- 若A函数,接受的参数是一个函数,那么A就可以称之为高阶函数
- 若A函数,调用的返回值依然是一个函数,那么A就可以称之为高阶函数
常见的高阶函数有:Promise、setTimeout、arr.map()等等
② 函数的柯里化
通过函数调用继续返回函数的方式,实现对此接受参数最后统一处理的函数编码形式
function sum(a){ return (b)=>{return c=>{ return a+b+c} }}
③ 不用函数柯里化实现事件的绑定
直接使用回调函数,因为他本身就是以一个函数为返回值
<input onChange={event => this.saveFormData('username',event) } type="text" name="username"/>
生命周期
- 组件从创建到死亡它会经历一些特定的阶段
- React组件中包含一系列钩子函数(生命周期回调函数),会在特定的时刻调用
- 我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作
1、React生命周期(旧)
各个生命周期钩子调用顺序
初始化阶段:由ReactDOM.render()触发 --初次渲染
- constructor()
- compinentWillMount()
- render()
- componentDidMount() ==>
常用组件将要渲染一般在这个钩子中做一些初始化的事情,如:开启定时器,发送网络请求,订阅消息等
更新阶段:由组件内部的this.setState()或者父组件的render触发
- shouldComponentUpdate() 组件应该更新
- componentWillUpdate() 组件将要更新
- render() ===>
必须使用的一个- componentDidUpdate() 组件将要更新
卸载组件:由ReactDOM.unmountComponentAtNode(
卸载节点上的组件)触发
- componentWillUnmount() ===>
常用组件将要卸载一般在这个钩子中做一些首位的事情,如:关闭定时器,取消订阅等
2、React生命周期(新)
初始化阶段:由ReactDOM.render()触发 ---初次渲染
- constructor()
- getDerivedStateFromProps() 从Props获得派生状态
- render()
- componentDidMount() ====>
常用更新阶段:由组件内部的this.setState()或者父组件的render触发
- getDerivedStateFromProps() 从Props获得派生状态
- shouldComponentUpdate() 组件应该更新
- render()
- getSnapshotBeforeUpdate() 在更新前获得快照
- componentDidUpdate()
卸载组件:由ReactDOM.unmountComponentAtNode()触发
- componentWillUnmount() ===>
常用一般在这个钩子中做一些收尾的事情,如:关闭定时器、取消订阅消息
3、重要的钩子
- render:初始化渲染或者更新渲染调用
- componentDidMount() :开启监听,发送ajax请求
- componentWillUnmount(): 做一些收尾工作,如:清理定时器
4、即将废弃的钩子
- componentWillMount
- componentWillReceiveProps
- componentWillUpdate
ps:现在使用会出现警告,之后版本可能需要加上UNSAFE_前缀才能使用,以后可能会被彻底废弃,不建议使用推测React团队认为提高使用成本将会间接影响我们,让我们去适应新的钩子,所以加上这个