事件处理 + (受)非受控组件 + 生命周期

112 阅读3分钟

事件处理

  1. 通过onXxx属性指定事件处理函数(注意大小写)
  • React使用的是自定义(合成)事件, 而不是使用的原生DOM事件
  • React中的事件是通过事件委托方式处理的(委托给组件最外层的元素)
  1. 通过event.target得到发生事件的DOM元素对象

非受控组件

页面中输入类的DOM,现用现取 <input ref={c => this.username = c}/>

受控组件

页面输入类的DOM受事件的控制
<input onChange={this.inp}/>
类似于vue中双向数据绑定

此外衍生出两个概念:高阶函数 + 函数柯里化,使用参数,在事件传参的时候最为常见

高阶函数

  1. 函数接收的参数是一个函数
  2. 函数调用的返回值是一个函数 符合其中一条,则说明是高阶函数

例如:Promise(fn()) map(fn) setTimeout(fn())

函数柯里化

通过函数继续返回函数的方式,实现多次接收参数统一处理的函数编码形式组件的形式

例如:function sum(a){
         return (b)=>{
           return (c)=>{
             return a + b + c
           }
         }
     }
    const result =  sum(1)(2)(3)
像闭包,和平常开发中封装的一些方法

组件的声明周期

旧: react生命周期(旧).png 新:

react生命周期(新).png 对生命周期进行总结:

  1. 组件从创建到死亡它会经历一些特定的阶段。
  2. React组件中包含一系列勾子函数(生命周期回调函数), 会在特定的时刻调用。
  3. 我们在定义组件时,会在特定的生命周期回调函数中,做特定的工作。 在旧的生命周期中,大致分为,初始化阶段,更新阶段(包括父组件render,setState(),forceUpdate()),卸载阶段

初始化阶段

constructor()
componentWillMount()
render()componentDidMount()

更新阶段(父组件render)

经历的生命周期钩子
componentWillReceiveProps()
shouldComponentUpdate()
componentWillUpdate()
render()
componentDidUpdate()

注意:

 componentWillReceiveProps(props) 第一次传递的props不算,所以第一次不会执行这个钩子
shouldComponentUpdate(nextProps, nextState) 
在props改变或state改变时被调用,必须返回truefalse来决定给是否重新渲染组件

更新阶段(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 处理中,如需要以特殊方式处理滚动位置的聊天线程等。

总结:不常用