我從哪里來(lái),要到那里去:一個(gè)React組件的前世今生

1氮采、什么是React殷绍?

React 是一個(gè)用于構(gòu)建用戶界面的 JAVASCRIPT 庫(kù)。

React主要用于構(gòu)建UI鹊漠,很多人認(rèn)為 React 是 MVC 中的 V(視圖)篡帕。

React 起源于 Facebook 的內(nèi)部項(xiàng)目,用來(lái)架設(shè) Instagram 的網(wǎng)站贸呢,并于 2013 年 5 月開源。

React 擁有較高的性能拢军,代碼邏輯非常簡(jiǎn)單楞陷,越來(lái)越多的人已開始關(guān)注和使用它。

2茉唉、React有哪些關(guān)鍵知識(shí)點(diǎn)固蛾?

網(wǎng)上有不少好教材,這里就不在做原理性的講解度陆,重點(diǎn)講一下任何動(dòng)手艾凯,“知道”沒有意義,“做到”才有產(chǎn)生價(jià)值懂傀。

2.1趾诗、熟悉JSX語(yǔ)法

http://www.runoob.com/react/react-jsx.html

2.2、了解React組件的生命周期

http://www.runoob.com/react/react-component-life-cycle.html

2.3蹬蚁、了解React的數(shù)據(jù)組織方式

http://www.runoob.com/react/react-state.html

http://www.runoob.com/react/react-props.html

2恃泪、學(xué)習(xí)React的最好方法

動(dòng)手

3、動(dòng)手的最快方式

直接使用antd pro犀斋,環(huán)境搭建參考文章:http://www.reibang.com/p/9a9acc4411ba?from=groupmessage&isappinstalled=0

4贝乎、教學(xué)示例

4.1、創(chuàng)建一個(gè)React組件ShopMgr

在src/pages目錄下面新建文件ShopMgr.js叽粹,內(nèi)容如下

import React, { PureComponent } from 'react';
export default class ShopMgr extends PureComponent {
  render() {
    return (
      <div>你好览效,我是一個(gè)React組件</div>
    );
  }
}

4.2、將ShopMgr掛載到頁(yè)面上

修改config/router.config.js虫几,查找/dashboard/analysis锤灿,找到下面的代碼段

{
  path: '/dashboard/analysis',
  name: 'analysis',
  component: './Dashboard/Analysis',
}

將其修改為:

{
  path: '/dashboard/analysis',
  name: 'analysis',
  component: './ShopMgr',
}

4.2、啟動(dòng)項(xiàng)目

$ npm start

在瀏覽器上輸入http://127.0.0.1:8000/dashboard/analysis持钉,你將會(huì)看到下面的頁(yè)面:

React組件

4.3衡招、練習(xí)對(duì)內(nèi)部數(shù)據(jù)state的操作

  • 初始化容器:

    state = { count: 0 };
    
  • 獲取中的數(shù)據(jù):

    let { count } = this.state;
    
  • 修改容器中的數(shù)據(jù):

    this.setState({ count });
    

我們做一個(gè)計(jì)數(shù)器,作為練習(xí)工具:修改ShopMgr每强,為其增加一個(gè)顯示器始腾,兩個(gè)按鈕州刽,分別進(jìn)行加一減一操作

React組件2
import React, { Component } from 'react';
import { Alert, Button, Divider } from 'antd';

export default class ShopMgr extends Component {
  /**
   *  初始化內(nèi)部數(shù)據(jù)容器,里面放上一個(gè)計(jì)數(shù)器count浪箭,初始值為0
   * @type {{count: number}}
   */
  state = { count: 0 };

  /**
   * 對(duì)計(jì)數(shù)器進(jìn)行加一
   */
  add = () => {
    // 從內(nèi)部容器中穗椅,獲取計(jì)數(shù)器的值,count
    let { count } = this.state;
    // 計(jì)數(shù)器加一后奶栖,再將其放回容器匹表,此時(shí)React會(huì)檢測(cè)到容器中數(shù)據(jù)的變化,會(huì)自動(dòng)刷新界面
    count += 1;
    this.setState({ count });
  };

  /**
   * 對(duì)計(jì)數(shù)器進(jìn)行減一
   */
  sub = () => {
    // 從內(nèi)部容器中宣鄙,獲取計(jì)數(shù)器的值袍镀,count
    let { count } = this.state;
    // 計(jì)數(shù)器減一后,再將其放回容器冻晤,此時(shí)React會(huì)檢測(cè)到容器中數(shù)據(jù)的變化苇羡,會(huì)自動(dòng)刷新界面
    count -= 1;
    this.setState({ count });
  };

  render() {
    // 從內(nèi)部容器中,獲取計(jì)數(shù)器的值鼻弧,count
    const { count } = this.state;
    return (
      <div>
        {/* 顯示計(jì)數(shù)器的值 */}
        <Alert message={count} type="success" style={{ marginBottom: 20 }}/>
        {/* 將上面定義的add和sub函數(shù)设江,設(shè)置到相關(guān)的按鈕點(diǎn)擊事件上 */}
        <div>
          <Button type="primary" onClick={this.add}>+1</Button>
          <Divider type="vertical"/>
          <Button type="primary" onClick={this.sub}>-1</Button>
        </div>
      </div>
    );
  }
}

4.4、練習(xí)對(duì)外部數(shù)據(jù)的操作

我們修改上面的例子攘轩,增加一個(gè)奇數(shù)判斷器叉存,作為計(jì)數(shù)器的子組件,計(jì)數(shù)器的內(nèi)部count作為奇數(shù)判斷器的外部數(shù)據(jù)度帮。

  • 獲取外部數(shù)據(jù)

    const { count } = this.props;
    
React組件3
import React, { Component } from 'react';
import { Alert, Button, Divider } from 'antd';

class IsOddNum extends Component {
  render() {
    const { count } = this.props;
    let tips = `${count}是奇數(shù)`;
    if (count % 2 === 0) {
      tips = `${count}是偶數(shù)`;
    }
    return (
      <Alert message={tips} type="info" style={{ marginBottom: 20 }}/>
    );
  }
}

export default class ShopMgr extends PureComponent {
  /**
   *  初始化內(nèi)部數(shù)據(jù)容器歼捏,里面放上一個(gè)計(jì)數(shù)器count,初始值為0
   * @type {{count: number}}
   */
  state = { count: 0 };

  /**
   * 對(duì)計(jì)數(shù)器進(jìn)行加一
   */
  add = () => {
    // 從內(nèi)部容器中笨篷,獲取計(jì)數(shù)器的值甫菠,count
    let { count } = this.state;
    // 計(jì)數(shù)器加一后,再將其放回容器冕屯,此時(shí)React會(huì)檢測(cè)到容器中數(shù)據(jù)的變化寂诱,會(huì)自動(dòng)刷新界面
    count += 1;
    this.setState({ count });
  };

  /**
   * 對(duì)計(jì)數(shù)器進(jìn)行減一
   */
  sub = () => {
    // 從內(nèi)部容器中,獲取計(jì)數(shù)器的值安聘,count
    let { count } = this.state;
    // 計(jì)數(shù)器減一后痰洒,再將其放回容器,此時(shí)React會(huì)檢測(cè)到容器中數(shù)據(jù)的變化浴韭,會(huì)自動(dòng)刷新界面
    count -= 1;
    this.setState({ count });
  };

  render() {
    // 從內(nèi)部容器中丘喻,獲取計(jì)數(shù)器的值,count
    const { count } = this.state;
    return (
      <div>
        {/* 顯示計(jì)數(shù)器的值 */}
        <Alert message={count} type="success" style={{ marginBottom: 20 }}/>
        {/* 將上面定義的add和sub函數(shù)念颈,設(shè)置到相關(guān)的按鈕點(diǎn)擊事件上 */}
        <div style={{ marginBottom: 20 }}>
          <Button type="primary" onClick={this.add}>+1</Button>
          <Divider type="vertical"/>
          <Button type="primary" onClick={this.sub}>-1</Button>
        </div>

        {/* 掛載子組件泉粉,將count傳入其中 */}
        <IsOddNum count={count}/>
      </div>
    );
  }
}

4.4、跟蹤組件的生命周期

觀察IsOddNum的打印即可

import React, { Component } from 'react';
import { Alert, Button, Divider } from 'antd';

class IsOddNum extends Component {
  componentWillMount() {
    console.log('IsOddNum::componentWillMount');
  }

  componentDidMount() {
    console.log('componentDidMount ');
  }

  componentWillReceiveProps(nextPropx) {
    console.log('IsOddNum::componentWillReceiveProps ');
  }

  shouldComponentUpdate() {
    console.log('IsOddNum::shouldComponentUpdate');
    return true;
  }

  componentDidUpdate() {
    console.log('IsOddNum::componentDidUpdate');
  }

  componentWillUnmount() {
    console.log('IsOddNum::componentWillUnmount');
  }

  render() {
    const { count } = this.props;
    let tips = `${count}是奇數(shù)`;
    if (count % 2 === 0) {
      tips = `${count}是偶數(shù)`;
    }
    return (
      <Alert message={tips} type="info" style={{ marginBottom: 20 }}/>
    );
  }
}

export default class ShopMgr extends Component {
  /**
   *  初始化內(nèi)部數(shù)據(jù)容器,里面放上一個(gè)計(jì)數(shù)器count嗡靡,初始值為0
   * @type {{count: number}}
   */
  state = { count: 0 };

  /**
   * 對(duì)計(jì)數(shù)器進(jìn)行加一
   */
  add = () => {
    // 從內(nèi)部容器中跺撼,獲取計(jì)數(shù)器的值,count
    let { count } = this.state;
    // 計(jì)數(shù)器加一后讨彼,再將其放回容器歉井,此時(shí)React會(huì)檢測(cè)到容器中數(shù)據(jù)的變化,會(huì)自動(dòng)刷新界面
    count += 1;
    this.setState({ count });
  };

  /**
   * 對(duì)計(jì)數(shù)器進(jìn)行減一
   */
  sub = () => {
    // 從內(nèi)部容器中哈误,獲取計(jì)數(shù)器的值哩至,count
    let { count } = this.state;
    // 計(jì)數(shù)器減一后,再將其放回容器蜜自,此時(shí)React會(huì)檢測(cè)到容器中數(shù)據(jù)的變化菩貌,會(huì)自動(dòng)刷新界面
    count -= 1;
    this.setState({ count });
  };

  render() {
    // 從內(nèi)部容器中,獲取計(jì)數(shù)器的值重荠,count
    const { count } = this.state;
    return (
      <div>
        {/* 顯示計(jì)數(shù)器的值 */}
        <Alert message={count} type="success" style={{ marginBottom: 20 }}/>
        {/* 將上面定義的add和sub函數(shù)菜谣,設(shè)置到相關(guān)的按鈕點(diǎn)擊事件上 */}
        <div style={{ marginBottom: 20 }}>
          <Button type="primary" onClick={this.add}>+1</Button>
          <Divider type="vertical"/>
          <Button type="primary" onClick={this.sub}>-1</Button>
        </div>

        {/* 掛載子組件,將count傳入其中 */}
        <IsOddNum count={count}/>
      </div>
    );
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晚缩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子媳危,更是在濱河造成了極大的恐慌荞彼,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件待笑,死亡現(xiàn)場(chǎng)離奇詭異鸣皂,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)暮蹂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門寞缝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人仰泻,你說(shuō)我怎么就攤上這事荆陆。” “怎么了集侯?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵被啼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我棠枉,道長(zhǎng)浓体,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任辈讶,我火速辦了婚禮命浴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己生闲,他們只是感情好媳溺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跪腹,像睡著了一般褂删。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上冲茸,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天屯阀,我揣著相機(jī)與錄音,去河邊找鬼轴术。 笑死难衰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的逗栽。 我是一名探鬼主播盖袭,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼彼宠!你這毒婦竟也來(lái)了鳄虱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凭峡,失蹤者是張志新(化名)和其女友劉穎拙已,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體摧冀,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡倍踪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了索昂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片建车。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖椒惨,靈堂內(nèi)的尸體忽然破棺而出缤至,到底是詐尸還是另有隱情,我是刑警寧澤康谆,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布凄杯,位于F島的核電站,受9級(jí)特大地震影響秉宿,放射性物質(zhì)發(fā)生泄漏戒突。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一描睦、第九天 我趴在偏房一處隱蔽的房頂上張望膊存。 院中可真熱鬧,春花似錦、人聲如沸隔崎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爵卒。三九已至虚缎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間钓株,已是汗流浹背实牡。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轴合,地道東北人创坞。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像受葛,于是被迫代替她去往敵國(guó)和親题涨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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

  • 作為一個(gè)合格的開發(fā)者总滩,不要只滿足于編寫了可以運(yùn)行的代碼纲堵。而要了解代碼背后的工作原理;不要只滿足于自己的程序...
    六個(gè)周閱讀 8,428評(píng)論 1 33
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,734評(píng)論 25 707
  • iOS在開發(fā)中,系統(tǒng)的UIDatePickerView沒有提供只可以選擇年澜建、月的類型,需要使用UIPickerVi...
    ONE2閱讀 533評(píng)論 0 0
  • 今天和媽媽一起把我們之前走過(guò)的淮海路又走了一遍蝌以。 我和你去淮海路散步的時(shí)候炕舵,還沒有出冬季。那天晚上跟畅,還有點(diǎn)冷咽筋。我清...
    顧墨璃閱讀 285評(píng)論 0 0
  • 從覺察到覺醒 1、觀照你的身體 覺察的第一步就是觀照你的身體徊件。慢慢地奸攻,你能夠?qū)ψ约旱拿恳粋€(gè)姿勢(shì)、動(dòng)作有所警覺虱痕,隨著...
    阿寶陽(yáng)光閱讀 476評(píng)論 0 1