ReactJs小書筆記(二)

ReactJs小書筆記(二)

ReactJs小書官方文檔:傳送門

17 前端應(yīng)用狀態(tài)管理——狀態(tài)提升

  1. 概念:當(dāng)平級的組件之間的需要進行數(shù)據(jù)傳遞的時候肉拓,需要將組件之間的共享的狀態(tài)交給組件附近最近的父節(jié)點保管后频,然后通過 props 把狀態(tài)傳遞給子組件,實現(xiàn)組件之間的數(shù)據(jù)共享暖途;
  2. 總結(jié):當(dāng)某個狀態(tài)被多個組件依賴或者影響的時候卑惜,就把該狀態(tài)提升到這些組件的最近公共父組件中去管理,用 props 傳遞數(shù)據(jù)或者函數(shù)來管理這種依賴或著影響的行為驻售;
  3. 問題:一旦發(fā)生狀態(tài)提升露久,就需要修改原來保存這個狀態(tài)的組件的代碼,也要把整個數(shù)據(jù)傳遞路徑經(jīng)過的組件都修改一遍芋浮,好讓數(shù)據(jù)能夠一層層地傳遞下去;這樣對代碼的組織管理維護帶來很大的問題壳快。

18 掛載階段的組件生命周期(1)

  1. 組件初始化階段
    • constructor():(構(gòu)造器)初始化組件纸巷;
    • componentWillMount():組件掛載開始之前,也就是在組件調(diào)用 render 方法之前調(diào)用眶痰;
    • render(): 將構(gòu)造好的 DOM 元素掛載到頁面;
    • componentDidMount():組件掛載完成以后,也就是 DOM 元素已經(jīng)插入頁面后調(diào)用蜓耻;
  2. 組件的刪除階段
    • 即將從頁面中刪除
    • componentWillUnmount():組件對應(yīng)的 DOM 元素從頁面中刪除之前調(diào)用母蛛;
    • 從頁面中刪除

19 掛載階段的組件生命周期(2)

利用生命周期函數(shù)實現(xiàn)一個時鐘的應(yīng)用:

import React, { Component } from 'react';

class Clock extends Component {
  constructor () {
    super()
    this.state = {
      date: new Date()
    }
  }
  componentWillMount () {
    this.timer = setInterval(() => {
      this.setState({ date: new Date() })
    }, 1000)
  }
  render () {
    return (
      <div>
          <p>現(xiàn)在的時間是:</p>
        <h3>
          {this.state.date.toLocaleTimeString()}
        </h3>
      </div>
    )
  }
}

class App extends Component {
  constructor () {
    super()
    this.state = { isShowClock: true }
  }

  handleShowOrHide () {
    this.setState({
      isShowClock: !this.state.isShowClock
    })
  }
  render () {
    return (
      <div>
        {this.state.isShowClock ? <Clock /> : null }
        <button onClick={this.handleShowOrHide.bind(this)}>
          顯示或隱藏時鐘
        </button>
      </div>
    )
  }
  componentWillUnmount () {
    clearInterval(this.timer)
  }
}

export default App;

20 更新階段的組件生命周期

  1. shouldComponentUpdate(nextProps, nextState):你可以通過這個方法控制組件是否重新渲染;如果返回 false 組件就不會重新渲染七婴。這個生命周期在 React.js 性能優(yōu)化上非常有用祟偷;
  2. componentWillReceiveProps(nextProps):組件從父組件接收到新的 props 之前調(diào)用;
  3. componentWillUpdate():組件開始重新渲染之前調(diào)用打厘;
  4. render() :將構(gòu)造好的 DOM 元素掛載到頁面修肠;
  5. componentDidUpdate():組件重新渲染并且把更改變更到真實的 DOM 以后調(diào)用;

21 ref 和 React.js中的DOM操作

  1. React.js 中基本不會和DOM直接打交道户盯;React.js 提供了一系列的 on* 方法幫助我們進行事件監(jiān)聽嵌施,所以 React.js 當(dāng)中不需要直接調(diào)用 addEventListener 的 DOM API饲化;并且React.js 重新渲染的機制幫助我們免除了絕大部分的 DOM 更新操作;
  2. React.js 當(dāng)中提供了 ref 屬性來幫助我們獲取已經(jīng)掛載的元素的 DOM 節(jié)點吗伤,可以給某個 JSX 元素加上 ref 屬性吃靠,如 進入頁面實現(xiàn)自動 focus 到輸入框:
class AutoFocusInput extends Component {
  componentDidMount () {
    this.input.focus()
  }
  render () {
    return (
      <input ref={(input) => this.input = input} />
    )
  }
}
ReactDOM.render(
  <AutoFocusInput />,
  document.getElementById('root')
)
  1. 組件標(biāo)簽也可以使用 ref 屬性,獲取該組件的DOM節(jié)點足淆;

注意: ReactJs 中能不用 ref 就不用巢块;特別是要避免用 ref 來做 React.js 本來就可以幫助你做到的頁面自動更新的操作和事件監(jiān)聽,多余的 DOM 操作其實是代碼里面的“噪音”缸浦,不利于我們理解和維護夕冲。

22 props.children 和容器類組件

  1. 容器類的組件中可以填充任意的內(nèi)容,其定義了一種外層的結(jié)構(gòu)裂逐,如下:
import React, { Component } from 'react';
class Card extend Component {
  constructor () {
    super()
    this.state= {}
  }
  render(
    <div className='card'>
      <div className='card-content'>
        {this.props.content}
      </div>
    </div>
  )
}
ReactDOM.render(
  {/*通過給 Card 組件傳入一個 content 屬性歹鱼,這個屬性可以傳入任意的 JSX 結(jié)構(gòu)。然后在 Card 內(nèi)部會通過 {this.props.content} 把內(nèi)容渲染到頁面上*/}
  <Card content={
    <div>
      <h2>React.js 小書</h2>
       <div>開源卜高、免費弥姻、專業(yè)、簡單</div>
      訂閱:<input />
    </div>
  } />,
  document.getElementById('root')
)
  1. 使用 props.children 掺涛,能夠使得組件獲取所有嵌套在組件中的 JSX 結(jié)構(gòu)庭敦,如下:
import React, { Component } from 'react';
class Card extends Component {
  render () {
    return (
      <div className='card'>
        <div className='card-content'>
          {this.props.children}
        </div>
      </div>
    )
  }
}
ReactDOM.render(
  <Card>
    <h2>React.js 小書</h2>
    <div>開源、免費薪缆、專業(yè)秧廉、簡單</div>
    訂閱:<input />
  </Card>,
  document.getElementById('root')
)
  1. props.children 值打印出來,可以知道其本質(zhì)是一個數(shù)組拣帽,因而甚至可以在組件內(nèi)部把數(shù)組中的 JSX 元素安置在不同的地方:
class Layout extends Component {
  render () {
    return (
      <div className='two-cols-layout'>
        <div className='sidebar'>
          {this.props.children[0]}
        </div>
        <div className='main'>
          {this.props.children[1]}
        </div>
      </div>
    )
  }
}

23 dangerouslySetHTML 和 style 屬性

23.1 dangerouslySetHTML 屬性

  1. 出于安全考慮的原因(XSS 攻擊)疼电,在 React.js 當(dāng)中所有的表達式插入的內(nèi)容都會被自動轉(zhuǎn)義,就相當(dāng)于 jQuery 里面的 text(…) 函數(shù)一樣减拭,任何的 HTML 格式都會被轉(zhuǎn)義掉蔽豺,而 React.js 提供了一個屬性 dangerouslySetInnerHTML ,可以讓我們設(shè)置動態(tài)設(shè)置元素的 innerHTML
class Editor extends Component {
  constructor() {
    super()
    this.state = {
      content: '<h1>React.js 小書</h1>'
    }
  }
  // content中的內(nèi)容會完全展示拧粪,其中 h1 標(biāo)簽被轉(zhuǎn)義了修陡,顯示為字符串
  render () {
    return (
      <div className='editor-wrapper'>
        {this.state.content}
      </div>
    )
  }

  // 使用 `dangerouslySetInnerHTML` 屬性能夠設(shè)置動態(tài)設(shè)置元素的 `innerHTML`
  render () {
    return (
      <div
        className='editor-wrapper'
        dangerouslySetInnerHTML={{__html: this.state.content}} />
    )
  }
}

23.2 style 屬性

React.js 中使用 style 屬性時,需要把 CSS 屬性變成一個對象再傳給元素:

<h1 style={{fontSize: '12px', color: 'red'}}>React.js 小書</h1>

其中 style 接受一個對象可霎,這個對象里面是這個元素的 CSS 屬性鍵值對魄鸦,原來 CSS 屬性中帶 - 的元素都必須要去掉 - 換成駝峰命名

24 PropTypes 和組件參數(shù)驗證

  1. 原由:JavaScript 的靈活性體現(xiàn)在弱類型癣朗、高階函數(shù)等語言特性上号杏,然而語言的弱類型很容易出 bug,所以在 React.js 中給組件的配置參數(shù)加上類型驗證;
  2. 安裝使用 React 提供的第三方庫 prop-types 進行類型驗證:npm install --save prop-types盾致;
import React, { Component } from 'react'
import PropTypes from 'prop-types'

class Comment extends Component {
  static propTypes = {
    comment: PropTypes.object
  }

  render () {
    const { comment } = this.props
    return (
      <div className='comment'>
        <div className='comment-user'>
          <span>{comment.username} </span>:
        </div>
        <p>{comment.content}</p>
      </div>
    )
  }
  1. prop-types 類型驗證參數(shù):
PropTypes.array
PropTypes.bool
PropTypes.func
PropTypes.number
PropTypes.object
PropTypes.string
PropTypes.node
PropTypes.element
  1. prop-types 中通過 isRequired 關(guān)鍵字來強制組件某個參數(shù)必須傳入:
...
static propTypes = {
  comment: PropTypes.object.isRequired
}
...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末主经,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子庭惜,更是在濱河造成了極大的恐慌罩驻,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件护赊,死亡現(xiàn)場離奇詭異惠遏,居然都是意外死亡,警方通過查閱死者的電腦和手機骏啰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門节吮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人判耕,你說我怎么就攤上這事透绩。” “怎么了壁熄?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵帚豪,是天一觀的道長。 經(jīng)常有香客問我草丧,道長狸臣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任昌执,我火速辦了婚禮烛亦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懂拾。我一直安慰自己煤禽,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布委粉。 她就那樣靜靜地躺著呜师,像睡著了一般娶桦。 火紅的嫁衣襯著肌膚如雪贾节。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天衷畦,我揣著相機與錄音栗涂,去河邊找鬼。 笑死祈争,一個胖子當(dāng)著我的面吹牛斤程,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼忿墅,長吁一口氣:“原來是場噩夢啊……” “哼扁藕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疚脐,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亿柑,失蹤者是張志新(化名)和其女友劉穎棍弄,沒想到半個月后呼畸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡蛮原,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年卧须,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞬痘。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡故慈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出框全,到底是詐尸還是另有隱情察绷,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布津辩,位于F島的核電站拆撼,受9級特大地震影響闸度,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蚜印,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一莺禁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窄赋,春花似錦哟冬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春纸淮,著一層夾襖步出監(jiān)牢的瞬間平斩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工咽块, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留双戳,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓糜芳,卻偏偏與公主長得像飒货,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子峭竣,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1塘辅、什么是react React.js 是一個幫助你構(gòu)建頁面 UI 的庫。React.js 將幫助我們將界面分成了...
    谷子多閱讀 2,557評論 1 13
  • 40皆撩、React 什么是React扣墩?React 是一個用于構(gòu)建用戶界面的框架(采用的是MVC模式):集中處理VIE...
    萌妹撒閱讀 1,014評論 0 1
  • ReactJs小書筆記(一) ReactJs小書官方文檔:傳送門 1 react簡介 React.js 不是一個框...
    Haleng閱讀 688評論 0 0
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中。 1. Hello world 這段代碼將一個一級標(biāo)題插入到指...
    ryanho84閱讀 6,232評論 0 9
  • It's a common pattern in React to wrap a component in an ...
    jplyue閱讀 3,265評論 0 2