React 第二章——面向組件編程

1.基本理解與使用

1.1自定義組件

  • 1>定義組件(2 種方式)
    /*方式1: 工廠函數(shù)組件(簡單組件)*/
function MyComponent () {
  return <h2>工廠函數(shù)組件(簡單組件)</h2>
}

/*方式2: ES6類組件(復(fù)雜組件)*/

class MyComponent2 extends React.Component {
  render () {
    console.log(this) // MyComponent2的實(shí)例對(duì)象
    return <h2>ES6類組件(復(fù)雜組件)</h2>
  }
  • 2> 渲染組件標(biāo)簽
 ReactDOM.render(<MyComponent/>,document.getElementById('example1'))
 ReactDOM.render(<MyComponent2/>,document.getElementById('example2'))

效果:


image.png

注意:

  • 組件名首字母必須大寫
  • 虛擬 DOM 元素只能有一個(gè)根元素
  • 虛擬 DOM 元素必須有結(jié)束標(biāo)簽

2.組件的三大屬性

一、state

理解:

  1. state是組件對(duì)象最重要的屬性, 值是對(duì)象(可以包含多個(gè)數(shù)據(jù))
  2. 組件被稱為"狀態(tài)機(jī)", 通過更新組件的state來更新對(duì)應(yīng)的頁面顯示(重新渲染組件)

編碼操作:

  1. 初始化狀態(tài):
  constructor (props) {
    super(props)
    this.state = {
      stateProp1 : value1,
      stateProp2 : value2
    }
  }
  1. 讀取某個(gè)狀態(tài)值
  this.state.statePropertyName
  1. 更新狀態(tài)---->組件界面更新
  this.setState({
    stateProp1 : value1,
    stateProp2 : value2
  })

二元镀、props

理解:

  1. 每個(gè)組件對(duì)象都會(huì)有props(properties的簡寫)屬性
  2. 組件標(biāo)簽的所有屬性都保存在props中

編碼操作:

  1. 內(nèi)部讀取某個(gè)屬性值
this.props.propertyName
  1. 對(duì) props 中的屬性值進(jìn)行類型限制和必要性限制
Person.propTypes = {
name: React.PropTypes.string.isRequired,
age: React.PropTypes.number.isRequired
}
  1. 擴(kuò)展屬性: 將對(duì)象的所有屬性通過props傳遞
<Person {...person}/>

 //   ...作用:
 //   1.打包
 //  function fn(...as){} fn(1,2,3)
//    2.解包
 //   const arr1=[1,2,3] const arr2=[6,...arr1,9]
   
  1. 默認(rèn)屬性值
Person.defaultProps = {
name: 'Mary'
}
  1. 組件類的構(gòu)造函數(shù)
constructor (props) {
super(props)
console.log(props) // 查看所有屬性
}

面試題

問題: 請(qǐng)區(qū)別一下組件的 props 和 state 屬性

  1. state: 組件自身內(nèi)部可變化的數(shù)據(jù)
  2. props: 從組件外部向組件內(nèi)部傳遞數(shù)據(jù), 組件內(nèi)部只讀不修改

三椒楣、refs

理解:

  • 1.組件內(nèi)的標(biāo)簽都可以定義 ref 屬性來標(biāo)識(shí)自己
  <input type="text" ref={input=>this.input=input}/>
  • 2.在組件中可以通過 this.input 來得到對(duì)應(yīng)的真實(shí) DOM 元素

  • 3.作用:通過 ref 獲取組件內(nèi)容特定標(biāo)簽對(duì)象螺垢,進(jìn)行讀取其相關(guān)數(shù)據(jù)

事件處理:

  1. 通過 onXxx 屬性指定組件的事件處理函數(shù)(注意大小寫)

a. React使用的是自定義(合成)事件, 而不是使用的原生DOM事件
b. React中的事件是通過事件委托方式處理的(委托給組件最外層的元素)

  1. 通過 event.target 得到發(fā)生事件的DOM元素對(duì)象
<input onFocus={this.handleClick}/>
handleFocus(event) {
event.target  //返回input對(duì)象
}

3.組件的組合

組件化編寫功能流程:

  • 1.拆分組件

  • 2.實(shí)現(xiàn)靜態(tài)組件(只有靜態(tài)界面,沒有動(dòng)態(tài)數(shù)據(jù)和交互)

  • 3.實(shí)現(xiàn)動(dòng)態(tài)組件

    a. 實(shí)現(xiàn)初始化數(shù)據(jù)動(dòng)態(tài)顯示
    b. 實(shí)現(xiàn)交互功能

4.收集表單數(shù)據(jù)

  • 1) 問題: 在react應(yīng)用中, 如何收集表單輸入數(shù)據(jù)

  • 2) 包含表單的組件分類

a. 受控組件: 表單項(xiàng)輸入數(shù)據(jù)能自動(dòng)收集成狀態(tài)

  handleChange(event){
        //讀取輸入的值
        const pwd=event.target.value
        //更新 pwd 的狀態(tài)
        this.setState({pwd})
     }

<input type=
b.  非受控組件: 需要時(shí)才手動(dòng)讀取表單輸入框中的數(shù)據(jù)

<input type="text" ref={input=>this.nameinput=input}/>

"password" value={this.state.pwd} onChange={this.handleChange} />

阻止事件的默認(rèn)行為:

 event.preventDefault()

5.組件生命周期

5.1 生命周期詳述

1) 組件的三個(gè)生命周期狀態(tài):

* Mount:插入真實(shí) DOM
* Update:被重新渲染
* Unmount:被移出真實(shí) DOM

2) React 為每個(gè)狀態(tài)都提供了勾子(hook)函數(shù)

* componentWillMount()
* componentDidMount()
* componentWillUpdate()
* componentDidUpdate()
* componentWillUnmount()

3) 生命周期流程:

a. 第一次初始化渲染顯示: ReactDOM.render()

  * constructor(): 創(chuàng)建對(duì)象初始化state
  * componentWillMount() : 將要插入回調(diào)
  * render() : 用于插入虛擬DOM回調(diào)
  * componentDidMount() : 已經(jīng)插入回調(diào)

b. 每次更新state: this.setSate()

  * componentWillUpdate() : 將要更新回調(diào)
  * render() : 更新(重新渲染)
  * componentDidUpdate() : 已經(jīng)更新回調(diào)

c. 移除組件: ReactDOM.unmountComponentAtNode(containerDom)

  * componentWillUnmount() : 組件將要被移除回調(diào)

5.2 重要的勾子

  1. render(): 初始化渲染或更新渲染調(diào)用
  2. componentDidMount(): 開啟監(jiān)聽, 發(fā)送ajax請(qǐng)求
  3. componentWillUnmount(): 做一些收尾工作, 如: 清理定時(shí)器
  4. componentWillReceiveProps(): 后面需要時(shí)講
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌乓旗,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件集索,死亡現(xiàn)場(chǎng)離奇詭異屿愚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)务荆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門妆距,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛹含,你說我怎么就攤上這事毅厚。” “怎么了浦箱?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵吸耿,是天一觀的道長。 經(jīng)常有香客問我酷窥,道長咽安,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任蓬推,我火速辦了婚禮妆棒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沸伏。我一直安慰自己糕珊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布毅糟。 她就那樣靜靜地躺著红选,像睡著了一般。 火紅的嫁衣襯著肌膚如雪姆另。 梳的紋絲不亂的頭發(fā)上喇肋,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天坟乾,我揣著相機(jī)與錄音,去河邊找鬼蝶防。 笑死甚侣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的间学。 我是一名探鬼主播殷费,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼菱鸥!你這毒婦竟也來了宗兼?” 一聲冷哼從身側(cè)響起躏鱼,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤氮采,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后染苛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鹊漠,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年茶行,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了躯概。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畔师,死狀恐怖娶靡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情看锉,我是刑警寧澤姿锭,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站伯铣,受9級(jí)特大地震影響呻此,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜腔寡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一焚鲜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧放前,春花似錦忿磅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至叽粹,卻和暖如春览效,著一層夾襖步出監(jiān)牢的瞬間却舀,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工锤灿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挽拔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓但校,卻偏偏與公主長得像螃诅,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子状囱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 摘要: 以前我們熟悉的jquery編程的方式是以面向?qū)ο蟮姆绞絹磉M(jìn)行編程的亭枷,而react將這種編程方式提升了一個(gè)層...
    liquan_醴泉閱讀 809評(píng)論 0 1
  • 作為一個(gè)合格的開發(fā)者袭艺,不要只滿足于編寫了可以運(yùn)行的代碼。而要了解代碼背后的工作原理叨粘;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,449評(píng)論 1 33
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中猾编。 1. Hello world 這段代碼將一個(gè)一級(jí)標(biāo)題插入到指...
    ryanho84閱讀 6,243評(píng)論 0 9
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記升敲,個(gè)人覺得該教程講解深入淺出答倡,比目前大...
    leonaxiong閱讀 2,840評(píng)論 1 18
  • 3. JSX JSX是對(duì)JavaScript語言的一個(gè)擴(kuò)展語法, 用于生產(chǎn)React“元素”驴党,建議在描述UI的時(shí)候...
    pixels閱讀 2,828評(píng)論 0 24