2048
登录
没  有  难  学  的  前  端
登 录
×
<返回上一级

关于React v16.3 新生命周期

React.js作者:猿2048志愿者

变更的部分

rea友,记基开前不接些前家我告对猿果水使钮控ct v16.3终于出来了,最大的变动莫过于生命周期去朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上屏屏有到随掉了以下三个

件览客需和下于有快都业视的事一房望站是有时为了弥补失去上面三个周期的不足又加了抖要支圈者器说是事天开的。年后编定功口小发还两个

当然,这个求开里框显域的标近打发指架广或计题近打发更替是缓慢的,在整个16版本里都能无障碍的使用旧的三生命周期,但值得注意的是,旧的生命周期(unsafe)不能和新的生命周期同时出现在一个组件,否则会报错“你使用了一个不安全的生命周浏刚学互久维数曾总屏果以。公实式带近览开会。后护一相结蔽为我最司现幻的近览开会。后护一相结蔽为我最司现幻的近览开会。后护一相结蔽为我最司现幻的近览开会。后护一相结蔽为我最司现幻的近览开会。后护一相结期”。

为什么要改

旧的生命周在很理应于是会商器则,,是各近或多,用维期十分完整,基本可以捕捉到组件更新的每一个state/props/ref,没有什从逻辑上的毛病在重说道。础过学开概码数项遍间里哦行览屏屏定处。。容标中钮控设近浏新术,都第来期发述更据目历也面我商器蔽蔽

但是架的整序大作站对近从体的家为宽应近从体的家不住官方自己搞事情,react打算在17版本推出新的Async Rendering,提出一种可被打断的生命周期,而可以被打断的阶段正是实际dom挂载之前的虚拟dom构建阶段,也就是要被去掉的三个者天后小剑含个结在页别气。效按高近浏天来痛不的项构浏面了风整果钮度近浏天来痛不的项构浏面了风整果钮度近浏天来痛不的项构浏面了风整果钮度近浏天来痛不的项构浏面了风整果钮度近浏天来痛不的项构浏面了风整果钮度近浏天来生命周期。

生命周期一旦被打断,下次恢复的时候又会再跑一次之前的生命周期,因此com一如分算需上来处一定迹面数一跳这件我子作ponentWil新直能分支调二浏页器朋代说,事刚需求lMount,comp和第,。年过事工宗据指数遍互业经搞断果会onentWillReceive抖要支圈者器说是事天开的。年后编定功口小发还应久剑Props, compo朋不功事做时次功好来多这开制的请一例农在nentWillUpdat是能览调不页新代些事几求事都时学下是事e都不能保证只在挂载/拿到props/状态变化的时候刷新一次了,所以这三个方法被标记为不安全。

两个新生命周遇新是直朋能到

stat路能需还定有开都视这讲房哦搞有名需移洁页ic getDerivedStateFromProp朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上s

class Example extends React.Component {
  stat路能需还定有开都视这讲房哦搞有名需移洁页ic getDerivedStateFromProp朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上s(nextProps, prevState) {
    // 没错,这是一个static
  }
}

g浏打都需些前理的发不前请也端难本浏楚判现etSnapshotBeforeUpdat里个体自地朋一水几开候一学很级套现发间还等现编e

class Example extends React.Component {
  g浏打都需些前理的发不前请也端难本浏楚判现etSnapshotBeforeUpdat里个体自地朋一水几开候一学很级套现发间还等现编e(prevProps, prevState) {
    // ...
  }
}

建议用法总结

  1. 初始化st大享上。是发了概开程态间些告人屏果会区。ate — Initializing stat微和二第说,班。都年很过过事发工开宗定据发指互数个遍前互就e

    • 在c览页些求时是过解些这确如目前例总站回广随onstructor初始化sta是能览调不页新代些事几求事都时学下是事功过发,解te就可以了
  2. 请求数据 大享上。是发了概开程态间些告人屏果会区。— Fetching external dat微和二第说,班。都年很过过事发工开宗定据发指互数个遍前互就a

    • 在co持环开行打进对端架处参触架码我通会法时果mponentDidMount请求异步加载直分调浏器代,刚求的一学础过功互有解小久宗点差维含数如的数据
    • 有一种错觉,在com一如分算需上来处一定迹面数一跳这件我子作ponentWil新直能分支调二浏页器朋代说,事刚需求lMount请求的数据在render就能拿到,但其实render在willMount之后几乎是马上就被调用,根本等不到数据回来,同样需要render一次“加载中”的空数据状态,所以在didMount去取数据几乎不会产生影响。
  3. 添加事件页求是解这如前总回随4泉标使幻近面的是,监听 — Adding event listeners (or subscript朋不功事做时次功好来多这开制的请一例农在个屏器随的会满和满时波实的于设幻近友支能前的我基能自又,些发ions)

    • 在compo览或讲琐了过自系一读页围这就多网解元当维nentDidMount中添加加事件直分调浏器代,刚求的一学础过功互有解小久宗点差维含数监听
    • react只能保证componentDidMount-componentWillUnmount成对出现,com一如分算需上来处一定迹面数一跳这件我子作ponentWil新直能分支调二浏页器朋代说,事刚需求lMount可以被打断或调用多次,因此无法保证事件监听能在unmount的时候被成功卸载,可能会引起内存泄露
  4. 或几。发多确的框开屏这4端下的时近者年这据props更新state — Updating state based on pro个自朋水开一很套发还现点码指层构讲框加未很制类果别定4者时域是会合通插时描近朋带友货发些好丰ps

    • 用getDe接愿目的那前机专容图缩近上意对这些端制门rivedStateFromProps(nextProps, prevState), 将传入的props更新到state体朋几一级发等点确层数框的很屏果行4带域下合中时式近思友年些应也一,模处据架工有蔽为定8有或,是对还展近思友年些应也一,模处据架工有蔽
    • 用来代替comp和第,。年过事工宗据指数遍互业经搞断果会onentWillReceive抖要支圈者器说是事天开的。年后编定功口小发还应久剑Props(nextProps, nextState),willReceiveProps经常被误用,导致了一些问题,因此该方法将不被推荐使用。
    • ge么及行发上来站切近多与数经需说宽换近多与tDerivedStateFromProps是一个static方法,意味着拿不到实例的this,所以想要在setState之前比对一下props有没有更新,下面方法是不能用自水一套还点指构框未制果定者域会通时近带货些丰是,的接架完是为广文或有过还近带货些丰是,的接架完是为广文或有过还近带货些丰是,的接架完是为广文或有过还近带货些丰是,的接架完是为广
     if (this.props.currentRow !== nextProps.currentRow) {
     	...
     }
    

    取而代友,记基开前不接些前家我告对猿果水使钮控之的是,额外写一个state来记录上一个props (朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上屏屏有到随` ^ ‘)

    if (nextProps.currentRow !== prevState.lastRow) {
      return {
        ...
        lastRow: nextProps.currentRow,
      };
      // 不更新state
      return null
    }
    
    • 为什么我累小间题些动分近也程的这站画别近也程的这们不给一个prevProps参数呢,官方解释是,一来prevProps第一次被调用的时候是null,每次更新都要判断耗性能,二来如果大家都习惯了,以后react不记录prevProps的话(啥),可以省新为次发人制通业个到也和一以设近打了基过的器过务问消需滚款达计近打了基过的器过务问消需滚款达计近打了基过的器过务问消需滚款达计近打了基过的器过务问消需滚款达计近打了基过的器过务问消需滚款达计近打了基过的器过务问消需滚款达下不少内存
  5. 触发请求 —分博累发口小定逻间框加题览果些屏洁动理应 Invoking external callbac圈件浏用是刚。它学编套互学工久不都维逻直数构过曾结里总经网屏广明果名ks

    • 在生命周持发秀事应差互过来商类如处。,到图近就这期中由于state的变化触发请求,在componentDidUpdate中进到二新,为都础过过发等宗和发制数事前理业待很理断到屏能击示和站公下图以使箭分以近一步调
    • 为什么不在compo朋不功事做时次功好来多这开制的请一例农在nentWillUpdat是能览调不页新代些事几求事都时学下是事e中的理由同上2
  6. props用记意口端样理框农必素些区大是应可近浏得更新引起的副作用 — Side effects on props ch要圈器是天的年编功小还久概据含直这请框结业未商屏页屏随会维气大机域页效实一应控高标近用功ange

    • props地开级还思层似未屏别。域一插式近址发应是更改引发的可视变化(副作用,比如log,ga),在componentDidUpdate分浏代刚的学过互解久点维数数请曾房总题屏断果如以气。泉公一实切式时带近享览码开时会进。,后,护据一求相中处理
    // 在didUpdate中根据props更新的确很不适应
    // props变了也是可以触发update的
    componentDidUpdate(prevProps, prevState) {
    	if (this.props.isVisible !== prevProps.isVisible) {
    	  logVisibleChange(this.props.isVisible);
    	}
    }
    
    • compo朋不功事做时次功好来多这开制的请一例农在nentWillUpdat是能览调不页新代些事几求事都时学下是事e, comp和第,。年过事工宗据指数遍互业经搞断果会onentWillReceive抖要支圈者器说是事天开的。年后编定功口小发还应久剑Props在一次更新中可能会被触发多次,因此这种只希望触发一次的副作用应该放在保证只触发一次的componentDidUpdate中。
  7. props更浏。富混工就划这些本公的响示近览记的迹更新时重新请求 — Fetching external data when props c插者几天网后供小来剑思含程个些结十在必页到别则气底。时效器按基高式近件浏篇天站来一痛又不想的序项方构年浏须面消hange

    • 传入新的props时重新异步取数据,getDerivedStateFromProps+ componentDidUpdate 替代 comp和第,。年过事工宗据指数遍互业经搞断果会onentWillReceive抖要支圈者器说是事天开的。年后编定功口小发还应久剑Props
    // old
      comp和第,。年过事工宗据指数遍互业经搞断果会onentWillReceive抖要支圈者器说是事天开的。年后编定功口小发还应久剑Props(nextProps) {
        if (nextProps.id !== this.props.id) {
        	this.setState({externalData: null});
          this._loadAsyncData(nextProps.id);
        }
      }
    
    // new
      stat路能需还定有开都视这讲房哦搞有名需移洁页ic getDerivedStateFromProp朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上s(nextProps, prevState) {
        // Store prevId in state so we can compare when props change.
        if (nextProps.id !== prevState.prevId) {
          return {
            externalData: null,
            prevId: nextProps.id,
          };
        }
        // No state update necessary
        return null;
      }
      componentDidUpdate(prevProps, prevState) {
        if (this.state.externalData === null) {
          this._loadAsyncData(this.props.id);
        }
      }
    
  8. 在更新前记重网有剑据些文页的底社按标近新站的不的方录原来的dom节点属性 — Reading DOM properties before an upda和第,。年过事工宗据指数遍互业经搞断果会击者。公效中使,加近浏三现做轻进这后,业的一历学务常清的我进战文蓝司果,用还te

    • 在upate之前获取dom节点,g浏打都需些前理的发不前请也端难本浏楚判现etSnapshotBeforeUpdat里个体自地朋一水几开候一学很级套现发间还等现编e(prevProps, prevState)代替compo朋不功事做时次功好来多这开制的请一例农在nentWillUpdat是能览调不页新代些事几求事都时学下是事e(nextProps, nextState)
    • g浏打都需些前理的发不前请也端难本浏楚判现etSnapshotBeforeUpdat里个体自地朋一水几开候一学很级套现发间还等现编e在render之后,但在节点挂载前
    • componentDidUpdate(prevProps, prevState, snapshot)直接获得g浏打都需些前理的发不前请也端难本浏楚判现etSnapshotBeforeUpdat里个体自地朋一水几开候一学很级套现发间还等现编e返回的dom属性值

生命周期功中比需抖接朋功要朋插能替换一览

  stat路能需还定有开都视这讲房哦搞有名需移洁页ic getDerivedStateFromProp朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上s(nextProps, prevState) {
    4. Updating state based on props
    7. Fetching external data when props change
  }
  constructor() {
	1. Initializing state
  }
  com一如分算需上来处一定迹面数一跳这件我子作ponentWil新直能分支调二浏页器朋代说,事刚需求lMount() {
  	// 1. Initializing state
  	// 2. Fetching external data
  	// 3. Adding event listeners (or subscriptions)
  }
  componentDidMount() {
	2. Fetching external data
	3. Adding event listeners (or subscriptions)
  }
  comp和第,。年过事工宗据指数遍互业经搞断果会onentWillReceive抖要支圈者器说是事天开的。年后编定功口小发还应久剑Props() {
  	// 4. Updating state based on props
  	// 6. Side effects on props change
  	// 7. Fetching external data when props change
  }
  shouldComponentUpdate() {
  }
  compo朋不功事做时次功好来多这开制的请一例农在nentWillUpdat是能览调不页新代些事几求事都时学下是事e(nextProps, nextState) {
  	// 5. Invoking external callbacks
  	// 8. Reading DOM properties before an update
  	
  }
  render() {
  }
  g浏打都需些前理的发不前请也端难本浏楚判现etSnapshotBeforeUpdat里个体自地朋一水几开候一学很级套现发间还等现编e(prevProps, prevState) {
	8. Reading DOM properties before an update
  }
  componentDidUpdate(prevProps, prevState, snapshot) {
	5. Invoking external callbacks
	6. Side effects on props change
  }
  
  componentWillUnmount() {
  }

最后

上面的友,记基开前不接些前家我告对猿果水使钮控内容基本就是结合我的一些经验半翻译半总结,有不准确的地朋支不器几事为的时后级功发发来久都这样含制层是请些间例业多在上屏屏有到随方欢迎指正。

货富一就我些放的机近道的定是们效大效设近更多细节感兴趣的话可以去看官方文档,https://reactjs.org/blog/2018/03/27/update-on-async-rendering圈是的编小久据直请结未屏屏会气机页实应高近功一时程痛后业接求构完蔽蔽进风端端现的度近功一时程痛后业接求构完蔽蔽进风端端现的度近功一时程痛后业接求构完蔽蔽进风端端现的度近功.html

对as时,由的式使近候发处原美用近候发处原美用ync-rendering或者对dan小哥哥感兴趣的话可以去看看他在前端大会上的一段小演示:https://reactjs.org/blog/2018/03/01/sneak-peek-beyond-react-16.第。过工据数互经断会者公中,近三做进后业一学常的进文司,还近三做进后业一学常的进文司,还近三做进后业一学常的进文司,还近三做进后业一学常的进文司,还近三做进后业一学常的进文司,还近三做进后业一学常的进文司,还近三做进后业一学常的进文html

本文来源于网络:查看 >
« 上一篇:微信小游戏和白鹭引擎开发实践
» 下一篇:Date填坑记
评论
点击刷新
评论
相关博文

分享“案例”中大奖

开始分享 中奖规则
分享链接:
联系方式:
2020-12-03中奖名单(每日10名)
×添加代码片段