react生命周期componentWillMount、componentDidMount是現(xiàn)在React請求數(shù)據的兩個生命周期,
這個生命周期在React是在render前執(zhí)行,而且只執(zhí)行一次,在這里this.setState在頁面更新一次,而且不會重新渲染。
問題一:但是我有一個疑問,因為ajax是異步請求,在瀏覽器的時間循環(huán)機制中是在第一次macrotask事件結束前調用回調函數(shù)的this.setState(這個時候dom應該已經或者是vnode已將形成),但是dom應該已經或者是vnode已將形成是調用的render的函數(shù),這里是不是矛盾了?
問題二:React數(shù)據請求到底在哪個生命周期中請求,React推薦在componentDidMount請求數(shù)據,這個優(yōu)勢是什么(這里調用會導致重新渲染)
首先,編程中,沒有是不是最優(yōu),只有是不是最適合。
然后問問題之前最后搜索一下官網。
componentWillMount
componentWillMount() is invoked just before mounting occurs. It is called before render(), therefore calling setState() synchronously in this method will not trigger an extra rendering. Generally, we recommend using the constructor() instead.
簡單來說,就是在這里setState,可以避免一次額外的rendering,推薦可以用constructor代替
componentDidMount
componentDidMount() is invoked immediately after a component is mounted. Initialization that requires DOM nodes should go here. If you need to load data from a remote endpoint, this is a good place to instantiate the network request
這里setState會引發(fā)一次額外的rendering,并且該方法只有第一次控件初始化時才會調用。
如果你的界面本身是基于數(shù)據返回來創(chuàng)建的,避免用戶看到不友好的界面,那么你可以在constructor中去同步請求,并等待數(shù)據返回然后setState
如果你希望用戶能盡快的看到界面,那么你可以在componentDidMount中去做網絡請求,這樣你會先渲染一次沒有數(shù)據的界面,然后等待數(shù)據返回,會再rendering一次。
為什么react推薦第二種呢?因為網絡請求不穩(wěn)定,用戶一直等待網絡請求回來,再刷新界面。使用第一種的話,如果因為網絡原因,用戶可能回在空白頁面呆的時間比較久,對用戶不友好,所以從用戶友好角度來講,我們更愿意讓用戶先看到一個沒有數(shù)據的方式,再通過一個spin的動畫,來加載數(shù)據。
北大青鳥APTECH成立于1999年。依托北京大學優(yōu)質雄厚的教育資源和背景,秉承“教育改變生活”的發(fā)展理念,致力于培養(yǎng)中國IT技能型緊缺人才,是大數(shù)據專業(yè)的國家
達內教育集團成立于2002年,是一家由留學海歸創(chuàng)辦的高端職業(yè)教育培訓機構,是中國一站式人才培養(yǎng)平臺、一站式人才輸送平臺。2014年4月3日在美國成功上市,融資1
北大課工場是北京大學校辦產業(yè)為響應國家深化產教融合/校企合作的政策,積極推進“中國制造2025”,實現(xiàn)中華民族偉大復興的升級產業(yè)鏈。利用北京大學優(yōu)質教育資源及背
博為峰,中國職業(yè)人才培訓領域的先行者
曾工作于聯(lián)想擔任系統(tǒng)開發(fā)工程師,曾在博彥科技股份有限公司擔任項目經理從事移動互聯(lián)網管理及研發(fā)工作,曾創(chuàng)辦藍懿科技有限責任公司從事總經理職務負責iOS教學及管理工作。
浪潮集團項目經理。精通Java與.NET 技術, 熟練的跨平臺面向對象開發(fā)經驗,技術功底深厚。 授課風格 授課風格清新自然、條理清晰、主次分明、重點難點突出、引人入勝。
精通HTML5和CSS3;Javascript及主流js庫,具有快速界面開發(fā)的能力,對瀏覽器兼容性、前端性能優(yōu)化等有深入理解。精通網頁制作和網頁游戲開發(fā)。
具有10 年的Java 企業(yè)應用開發(fā)經驗。曾經歷任德國Software AG 技術顧問,美國Dachieve 系統(tǒng)架構師,美國AngelEngineers Inc. 系統(tǒng)架構師。