React--State & 生命周期

常用生命周期

constructor()

用途: 初始化 props吸祟、state宛琅,用來寫bind this

class Parent entends React.Component{
  constructor(props){
    super(props)
    this.state = { name: 'fanison' }
    this.onClick = this.onClick.bind(this)
  }
  // 新語法
  onClick = ()=> {}
}

shouldComponentUpdate()

用途:

  • 返回 true 表示不阻止UI更新
  • 返回 false 表示阻止UI更新
  • 允許我們手動判斷是否要進行組件更新,可以根據(jù)應(yīng)用場景靈活地設(shè)置返回值测柠,以避免不必要的更新。
  onClick = () =>{
    // 先加一,再減一店煞; 新對象與舊對象地址不同,會render兩次
    this.setState(state => ({n: state.n +1}));
    this.setState(state =>({n: state.n - 1}));
  };
  // 使用  shouldComponentUpdate 對比 nextState和 this.state的每個屬性风钻,如果全都相等顷蟀,就不更新;如果有一個不等骡技,就更新
  shouldComponentUpdate(nextProps,nextState){
    if(nextState.n === this.state.n){
      return false
    }else{
      return true
    }
  }
render(){
    console.log('render了一次')
    return(
      <div>
        {this.state.n}
        <button onClick={this.onClick}>+1-1</button>
      </div>
    )
  }

補充: 大多數(shù)情況可以使用 React.PureComponent代替 shouldComponentUpdate()

PureComponent 會在 render 之前對比新 state 和舊 state 的每一個 key鸣个,以及新 props 和舊 props 的每一個 key。
如果所有 key 的值全都一樣布朦,就不會 render囤萤;如果有任何一個 key 的值不同,就會 render是趴。

class App extends React.PureComponent{
  constructor(props) {
    super(props);
    this.state = {
      n : 1
    };
  }
  onClick = () =>{
    this.setState(state => ({n: state.n +1}));
    this.setState(state =>({n: state.n - 1}));
  };
  render(){
    console.log('render了一次')
    return(
      <div>
        {this.state.n}
        <button onClick={this.onClick}>+1-1</button>
      </div>
    )
  }
}
export default App;

render()

用途:

  • 展示視圖 return (<div>...</div>)
  • 只能有一個根元素
  • 如果有兩個根元素涛舍,要用<React.Fragment>包起來
  • <React.Fragment /> 可以縮寫成 <></>
//render 里面可以寫 if...else
render(){
    let message
    if(this.state.n % 2 === 0 ){
      message = <div>偶數(shù)</div>
    }else{
      message = <div>奇數(shù)</div>
    }
    return(
      <div>
        {message}
        <button onClick={this.onClick}>+1</button>
      </div>
    )
  }

// render 里面可以寫?:表達式
render(){
    return(
      <div>
        {this.state.n % 2 === 0 ? <div>偶數(shù)</div>:<span>奇數(shù)</span>}
        {this.state.n % 2 === 0 ? <div>偶數(shù)</div>:null}
        {this.state.n % 2 === 0 && <div>偶數(shù)</div>}
        <button onClick={this.onClick}>+1</button>
      </div>
    )
  }

// render里面不能直接寫for循環(huán),需要用數(shù)組
render(){
    let result = []
    for(let i=0;i<this.state.array.length;i++){
      result.push(this.state.array[i])
    }
    return(
      <div>
        {result}
      </div>
    )
  }

// render里面可以寫 array.map(循環(huán))
render(){
    return(
      <div>
        {this.state.array.map(n=><span key={n}>{n}</span>)}
      </div>
    )
  }

componentDidMount() 組件已出現(xiàn)在頁面

用途:

  • 在元素插入頁面后執(zhí)行代碼唆途,這些代碼依賴DOM
  • 可以發(fā)起加載數(shù)據(jù)的 AJAX 請求
  • 首次渲染會執(zhí)行此鉤子
  • 可在此處獲取div高度
class App extends React.PureComponent{
  constructor(props) {
    super(props);
    this.state = {
      width:undefined
    };
    this.divRef = React.createRef();
  }

componentDidMount(): void {
  const div = document.getElementById('xxx')
  console.log(div)
  const width = div.getBoundingClientRect().width
  this.setState({width:width})
  // 使用 divRef.current
  const div2 = this.divRef.current
  console.log(div2)
  const {width} = div2.getBoundingClientRect()
  this.setState({width:width})
}

 render(){
   return(
     <>
      <div id="xxx"> GetElementById: {this.state.width} px </div>
      <div ref={this.divRef}>Hello,World {this.state.width} px </div>
     </>
   )
 }

componentDidUpdate() //組件已更新

componentWillUnmount() //組件將死

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末富雅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肛搬,更是在濱河造成了極大的恐慌没佑,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件温赔,死亡現(xiàn)場離奇詭異蛤奢,居然都是意外死亡,警方通過查閱死者的電腦和手機让腹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門远剩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骇窍,你說我怎么就攤上這事瓜晤。” “怎么了腹纳?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵痢掠,是天一觀的道長驱犹。 經(jīng)常有香客問我,道長足画,這世上最難降的妖魔是什么雄驹? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮淹辞,結(jié)果婚禮上医舆,老公的妹妹穿的比我還像新娘。我一直安慰自己象缀,他們只是感情好蔬将,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著央星,像睡著了一般霞怀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莉给,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天毙石,我揣著相機與錄音,去河邊找鬼颓遏。 笑死徐矩,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的州泊。 我是一名探鬼主播丧蘸,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遥皂!你這毒婦竟也來了力喷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤演训,失蹤者是張志新(化名)和其女友劉穎弟孟,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體样悟,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡拂募,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了窟她。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陈症。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖震糖,靈堂內(nèi)的尸體忽然破棺而出录肯,到底是詐尸還是另有隱情,我是刑警寧澤吊说,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布论咏,位于F島的核電站优炬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏厅贪。R本人自食惡果不足惜蠢护,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望养涮。 院中可真熱鬧葵硕,春花似錦、人聲如沸贯吓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宣决。三九已至,卻和暖如春昏苏,著一層夾襖步出監(jiān)牢的瞬間尊沸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工贤惯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留洼专,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓孵构,卻偏偏與公主長得像屁商,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子颈墅,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353