事件处理
- 通过onXxx属性指定事件处理函数(注意大小写)
- React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
- React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
- 通过event.target得到发生事件的DOM元素对象
非受控组件
页面中输入类的DOM,现用现取 <input ref={c => this.username = c}/>
受控组件
页面输入类的DOM受事件的控制
<input onChange={this.inp}/>
类似于vue中双向数据绑定
此外衍生出两个概念:高阶函数 + 函数柯里化,使用参数,在事件传参的时候最为常见
高阶函数
- 函数接收的参数是一个函数
- 函数调用的返回值是一个函数 符合其中一条,则说明是高阶函数
例如:Promise(fn()) map(fn) setTimeout(fn())
函数柯里化
通过函数继续返回函数的方式,实现多次接收参数统一处理的函数编码形式组件的形式
例如:function sum(a){
return (b)=>{
return (c)=>{
return a + b + c
}
}
}
const result = sum(1)(2)(3)
像闭包,和平常开发中封装的一些方法
组件的声明周期
旧:
新:
对生命周期进行总结:
- 组件从创建到死亡它会经历一些特定的阶段。
- React组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。
- 我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。 在旧的生命周期中,大致分为,初始化阶段,更新阶段(包括父组件render,setState(),forceUpdate()),卸载阶段
初始化阶段
constructor()
componentWillMount()
render()componentDidMount()
更新阶段(父组件render)
经历的生命周期钩子
componentWillReceiveProps()
shouldComponentUpdate()
componentWillUpdate()
render()
componentDidUpdate()
注意:
componentWillReceiveProps(props) 第一次传递的props不算,所以第一次不会执行这个钩子
shouldComponentUpdate(nextProps, nextState)
在props改变或state改变时被调用,必须返回true或false来决定给是否重新渲染组件
更新阶段(setState())
经历的生命周期钩子
shouldComponentUpdate()
componentWillUpdate()
render()
componentDidUpdate()
注意:
经历的生命周期钩子
componentDidUpdate(prevProps, prevState) 在组件完成更新后立即调用。在初始化时不会被调用。
在此处是做这些事情的好时机:
1. 执行依赖新 DOM 节点的操作
2. 依据新的属性发起新的ajax请求
特别注意:
注意:一定要在确认属性变化后再发起ajax请求,否则极有可能进入死循环:
DidUpdate -> ajax -> changeState -> DidUpdate -> ...)
更新阶段(forceUpdate())强制刷新
componentWillUpdate()
render()
componentDidUpdate()
卸载阶段
componentWillUnmount 在组件从 DOM 中移除之前立刻被调用。
此处最适合做以下操作:
1. 清除定时器
2. 终止ajax请求
接下来是新的生命周期
多了两个新的生命周期钩子
getDerivedStateFromProps
getSnapshotBeforeUpdate
注意:
getDerivedStateFromProps 用法
static getDerivedStateFromProps(props, state)
getDerivedStateFromProps 会在调用 render 方法之前调用,
并且在初始挂载及后续更新时都会被调用。它应返回一个对象来更新 state,如果返回 `null` 则不更新任何内容。
此方法适用于罕见的用例,即 state 的值在任何时候都取决于 props。例如,实现 <Transition>
组件可能很方便,该组件会比较当前组件与下一组件,以决定针对哪些组件进行转场动画。
getSnapshotBeforeUpdate()
用法
getSnapshotBeforeUpdate(prevProps, prevState)
getSnapshotBeforeUpdate()
在最近一次渲染输出(提交到 DOM 节点)之前调用。它使得组件能在发生更改之前从 DOM 中捕获一些信息(例如,滚动位置)。此生命周期方法的任何返回值将作为参数传递给 componentDidUpdate()
。
此用法并不常见,但它可能出现在 UI 处理中,如需要以特殊方式处理滚动位置的聊天线程等。
总结:不常用