React組件之Clock

這個(gè)例子是React官方文檔里面的叼架,代碼也在CodePen,例子非常簡(jiǎn)單衣撬,展示了React組件開(kāi)發(fā)的基本過(guò)程乖订,這里將這個(gè)例子進(jìn)行分析記錄,當(dāng)做學(xué)習(xí)筆記吧具练!首先看代碼:

//HTML
 <div id="root">
    <!-- This element's contents will be replaced with your component. -->
</div>

//JS
function FormattedDate(props) {
  return <h2>It is {props.date.toLocaleTimeString()}.</h2>;
}

class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),
      1000
    );
  }

  componentWillUnmount() {
    clearInterval(this.timerID);
  }

  tick() {
    this.setState({
      date: new Date()
    });
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <FormattedDate date={this.state.date} />
      </div>
    );
  }
}

function App() {
  return (
    <div>
      <Clock />
      <Clock />
      <Clock />
    </div>
  );
}

ReactDOM.render(<App />, document.getElementById('root'));

程序的運(yùn)行過(guò)程:

1乍构、在html里面定義一個(gè)div,id為root

2扛点、 調(diào)用ReactDOM.render使用App渲染id為root的div哥遮,這里會(huì)調(diào)用函數(shù)App

3、函數(shù)App返回的是什么呢占键?不是字符串昔善,也不是HTML元潘,而是JSX畔乙,JSX是JavaScript語(yǔ)法的擴(kuò)展,Babel會(huì)將JSX編譯成React.createElement()的調(diào)用翩概,這里可以簡(jiǎn)單看成返回界面布局就行了

4牲距、在函數(shù)App返回的布局中返咱,有三個(gè)Clock組件,Clock組件繼承React.Component牍鞠,當(dāng)被傳入ReactDOM.render中后咖摹,會(huì)調(diào)用Clock構(gòu)造方法

5、在Clock構(gòu)造方法可以接收一個(gè)props, 它來(lái)保存組件的組件的屬性难述,這里并沒(méi)有傳入任何屬性值萤晴,在構(gòu)造方法里面初始化組件的狀態(tài)state,給狀態(tài)設(shè)置了date字段

6胁后、接下來(lái)會(huì)調(diào)用Clock的render方法來(lái)渲染組件店读,render方法也是返回了JSX,里面有Hello World的標(biāo)題攀芯,并且調(diào)用FormattedDate函數(shù)屯断,傳入?yún)?shù)date,返回時(shí)間的JSX侣诺,在FormattedDate函數(shù)里通過(guò)props.date獲取傳入的date

7殖演、這時(shí)候就已經(jīng)可以看到三個(gè)Clock顯示時(shí)間了

8、那時(shí)間怎么自動(dòng)更新的呢年鸳?當(dāng)Clock被插入DOM時(shí)趴久,會(huì)觸發(fā)componentDidMount,當(dāng)Clock從DOM移除時(shí)阻星,會(huì)觸發(fā)componentWillUnmount朋鞍,所以在componentDidMount調(diào)用時(shí)開(kāi)始定時(shí)更新,在componentWillUnmount關(guān)閉定時(shí)更新

9妥箕、定時(shí)更新會(huì)調(diào)用tick方法滥酥,tick方法調(diào)用setState來(lái)更新date字段

10、setState方法會(huì)觸發(fā)render方法的重新調(diào)用畦幢,進(jìn)而更新時(shí)間

由于筆者之前是做移動(dòng)端開(kāi)發(fā)坎吻,React的組件的概念跟iOS和Android的View的概念基本一致,甚至一些方法可以對(duì)應(yīng)的上宇葱,如componentDidMount和componentWillUnmount可對(duì)應(yīng)Android View中的onAttachedToWindow和onDetachedFromWindow, Clock中的render可對(duì)應(yīng)Android View中的onDraw瘦真。可以看出來(lái)編程理念都是大同小異黍瞧。組件化實(shí)際上就是模塊化诸尽,提高了代碼的復(fù)用性和可維護(hù)性。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末印颤,一起剝皮案震驚了整個(gè)濱河市您机,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖际看,帶你破解...
    沈念sama閱讀 217,185評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咸产,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡仲闽,警方通過(guò)查閱死者的電腦和手機(jī)脑溢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)赖欣,“玉大人屑彻,你說(shuō)我怎么就攤上這事《ニ保” “怎么了酱酬?”我有些...
    開(kāi)封第一講書人閱讀 163,524評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)云矫。 經(jīng)常有香客問(wèn)我膳沽,道長(zhǎng),這世上最難降的妖魔是什么让禀? 我笑而不...
    開(kāi)封第一講書人閱讀 58,339評(píng)論 1 293
  • 正文 為了忘掉前任挑社,我火速辦了婚禮,結(jié)果婚禮上巡揍,老公的妹妹穿的比我還像新娘痛阻。我一直安慰自己,他們只是感情好腮敌,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評(píng)論 6 391
  • 文/花漫 我一把揭開(kāi)白布阱当。 她就那樣靜靜地躺著,像睡著了一般糜工。 火紅的嫁衣襯著肌膚如雪弊添。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,287評(píng)論 1 301
  • 那天捌木,我揣著相機(jī)與錄音油坝,去河邊找鬼。 笑死刨裆,一個(gè)胖子當(dāng)著我的面吹牛澈圈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播帆啃,決...
    沈念sama閱讀 40,130評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瞬女,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了努潘?” 一聲冷哼從身側(cè)響起诽偷,我...
    開(kāi)封第一講書人閱讀 38,985評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盯桦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后渤刃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡贴膘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評(píng)論 3 334
  • 正文 我和宋清朗相戀三年卖子,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片刑峡。...
    茶點(diǎn)故事閱讀 39,779評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡洋闽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出突梦,到底是詐尸還是另有隱情诫舅,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評(píng)論 5 345
  • 正文 年R本政府宣布宫患,位于F島的核電站刊懈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏娃闲。R本人自食惡果不足惜虚汛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望皇帮。 院中可真熱鬧卷哩,春花似錦、人聲如沸属拾。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,716評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)渐白。三九已至尊浓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間纯衍,已是汗流浹背眠砾。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,857評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留托酸,地道東北人褒颈。 一個(gè)月前我還...
    沈念sama閱讀 47,876評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像励堡,于是被迫代替她去往敵國(guó)和親谷丸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評(píng)論 2 354

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

  • 作為一個(gè)合格的開(kāi)發(fā)者应结,不要只滿足于編寫了可以運(yùn)行的代碼刨疼。而要了解代碼背后的工作原理泉唁;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,443評(píng)論 1 33
  • $ 前言 ? 最近在考慮框架轉(zhuǎn)型,鑒于作為一名JSer揩慕,要時(shí)時(shí)刻刻保持對(duì)新技術(shù)和流行技術(shù)的敏感性亭畜,而 React、...
    果汁涼茶丶閱讀 22,000評(píng)論 5 32
  • 本筆記基于React官方文檔迎卤,當(dāng)前React版本號(hào)為15.4.0拴鸵。 1. 安裝 1.1 嘗試 開(kāi)始之前可以先去co...
    Awey閱讀 7,705評(píng)論 14 128
  • HTML模版 之后出現(xiàn)的React代碼嵌套入模版中。 1. Hello world 這段代碼將一個(gè)一級(jí)標(biāo)題插入到指...
    ryanho84閱讀 6,232評(píng)論 0 9
  • 我們的工作不應(yīng)該是表面膚淺的蜗搔,而應(yīng)該是深刻的劲藐。我們必須直抵內(nèi)心。要抵達(dá)內(nèi)心我們必須去做——愛(ài)在做事中被證得樟凄。人們更...
    芷凡bonita閱讀 94評(píng)論 0 0