React創(chuàng)建組件的三種方法

無(wú)狀態(tài)函數(shù)式組件

創(chuàng)建純展示組件辑舷,只負(fù)責(zé)根據(jù)傳入的props來(lái)展示卖哎,不涉及到要state狀態(tài)的操作,是一個(gè)只帶有一個(gè)render方法的組件類(lèi)

創(chuàng)建形式如下:

function HelloComponent(props) {
  return <div>Hello {props.name}</div>
}
ReactDOM.render(<HelloComponent name="yourName" />, mountNode) 

特點(diǎn):

  • 組件不會(huì)被實(shí)例化,整體渲染性能得到提升
  • 組件不能訪問(wèn)this對(duì)象
  • 組件無(wú)法訪問(wèn)生命周期的方法
  • 無(wú)狀態(tài)組件只能訪問(wèn)輸入的props三椿,同樣的props會(huì)得到同樣的渲染結(jié)果,不會(huì)有副作用

無(wú)狀態(tài)組件使得代碼結(jié)構(gòu)更加清晰葫辐,減少代碼冗余搜锰,在開(kāi)發(fā)過(guò)程中,盡量使用無(wú)狀態(tài)組件

React.createClass

是ES5的原生的JavaScript來(lái)實(shí)現(xiàn)的React組件
該例子實(shí)現(xiàn)了一個(gè)交互列表耿战,用戶(hù)輸入信息蛋叼,按回車(chē)后觸發(fā)鍵盤(pán)事件將獲取到的輸入值渲染生成列表項(xiàng),輸入信息的數(shù)量可以是任意多個(gè)

具體形式如下:

var Greeting = React.createClass({
    getInitialState: function () {
        return {
            work_list: []
        };
    },
    render: function () {
        return (
            <div>
                <input type="text" ref="myWork" placeholder="What need to be done?" onKeyUp={this.Enter}/>

                <ul>
                    {
                        this.state.work_list.map(function (textValue) {
                            return <li key={textValue}>{textValue}</li>;
                        })
                    }
                </ul>

            </div>
        );
    },
    Enter: function (event) {
        var works = this.state.work_list;
        var work = this.refs.myWork.value;
        if (event.keyCode == 13) {
            works.push(work);
            this.setState({work_list: works});
            this.refs.myWork.value = "";
        }


    }
});

給文本框增加onKeyUp監(jiān)聽(tīng)鍵盤(pán)事件

組件在插入頁(yè)面前其實(shí)是在虛擬 DOM 中的表示剂陡,因此狈涮,在渲染成最終實(shí)際的 DOM 前,不能通過(guò)直接訪問(wèn)組件內(nèi)的元素來(lái)試圖獲取它的屬性鹏倘。文本輸入框用于獲取用戶(hù)的輸入薯嗤。這時(shí)就必須獲取真實(shí)的 DOM 節(jié)點(diǎn),虛擬 DOM 是拿不到用戶(hù)輸入的纤泵。為了做到這一點(diǎn)骆姐,我們?cè)谖谋据斎肟蛱砑恿艘粋€(gè)ref屬性 myWork,然后通過(guò)this.refs.myWork就指向這個(gè)虛擬 DOM 的子節(jié)點(diǎn)捏题,這樣就可以通過(guò)this.refs.myWork.value獲取到它的值

特點(diǎn):

  • React.createClass會(huì)自綁定函數(shù)方法導(dǎo)致不必要的性能開(kāi)銷(xiāo)
  • React.createClass的mixins不夠自然玻褪、直觀

React.Component

React.Component是以ES6的形式來(lái)創(chuàng)建react的組件的,是React目前極為推薦的創(chuàng)建有狀態(tài)組件的方式公荧,相對(duì)于 React.createClass可以更好實(shí)現(xiàn)代碼復(fù)用带射。將上面React.createClass的形式改為React.Component形式如下:

class Greeting extends React.Component{
   constructor (props) {
       super(props);
       this.state={
            work_list: []
        }

        this.Enter=this.Enter.bind(this); //綁定this
    }
    render() {
        return (
            <div>
                <input type="text" ref="myWork" placeholder="What need to be done?" onKeyUp={this.Enter}/>

                <ul>
                    {
                        this.state.work_list.map(function (textValue) {
                            return <li key={textValue}>{textValue}</li>;
                        })
                    }
                </ul>

            </div>
        );
    }
    Enter(event) {
        var works = this.state.work_list;
        var work = this.refs.myWork.value;
        if (event.keyCode == 13) {
            works.push(work);
            this.setState({work_list: works});
            this.refs.myWork.value = "";
        }


    }
}
關(guān)于this

React.createClass創(chuàng)建的組件,其每一個(gè)成員函數(shù)的this都有React自動(dòng)綁定循狰,任何時(shí)候使用窟社,直接使用this.method即可券勺,函數(shù)中的this會(huì)被正確設(shè)置

React.Component創(chuàng)建的組件,其成員函數(shù)不會(huì)自動(dòng)綁定this灿里,需要手動(dòng)綁定关炼,否則this不能獲取當(dāng)前組件實(shí)例對(duì)象

React.Component三種手動(dòng)綁定this的方法
  1. 在構(gòu)造函數(shù)中綁定
 constructor(props) {
       super(props);
       this.Enter = this.Enter.bind(this);
  }
  1. 使用bind綁定
    <div onKeyUp={this.Enter.bind(this)}></div> 
  1. 使用arrow function綁定
    <div onKeyUp={(event)=>this.Enter(event)}></div> 

我們?cè)趯?shí)際應(yīng)用中應(yīng)該選擇哪種方法來(lái)創(chuàng)建組件呢?

  • 只要有可能匣吊,盡量使用無(wú)狀態(tài)組件創(chuàng)建形式
  • 否則(如需要state儒拂、生命周期方法等),使用React.Component這種es6形式創(chuàng)建組件
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末色鸳,一起剝皮案震驚了整個(gè)濱河市社痛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌命雀,老刑警劉巖蒜哀,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吏砂,居然都是意外死亡凡怎,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)赊抖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人寨典,你說(shuō)我怎么就攤上這事氛雪。” “怎么了耸成?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵报亩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我井氢,道長(zhǎng)弦追,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任花竞,我火速辦了婚禮劲件,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘约急。我一直安慰自己零远,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布厌蔽。 她就那樣靜靜地躺著牵辣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奴饮。 梳的紋絲不亂的頭發(fā)上纬向,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天择浊,我揣著相機(jī)與錄音,去河邊找鬼逾条。 笑死琢岩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膳帕。 我是一名探鬼主播粘捎,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼危彩!你這毒婦竟也來(lái)了攒磨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤汤徽,失蹤者是張志新(化名)和其女友劉穎娩缰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谒府,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拼坎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了完疫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片泰鸡。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖壳鹤,靈堂內(nèi)的尸體忽然破棺而出盛龄,到底是詐尸還是另有隱情,我是刑警寧澤芳誓,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布余舶,位于F島的核電站,受9級(jí)特大地震影響锹淌,放射性物質(zhì)發(fā)生泄漏匿值。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一赂摆、第九天 我趴在偏房一處隱蔽的房頂上張望挟憔。 院中可真熱鬧,春花似錦烟号、人聲如沸曲楚。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)龙誊。三九已至,卻和暖如春喷楣,著一層夾襖步出監(jiān)牢的瞬間趟大,已是汗流浹背鹤树。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留逊朽,地道東北人罕伯。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像叽讳,于是被迫代替她去往敵國(guó)和親追他。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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

  • 原教程內(nèi)容詳見(jiàn)精益 React 學(xué)習(xí)指南岛蚤,這只是我在學(xué)習(xí)過(guò)程中的一些閱讀筆記邑狸,個(gè)人覺(jué)得該教程講解深入淺出,比目前大...
    leonaxiong閱讀 2,838評(píng)論 1 18
  • 目前涤妒,react組件有三種寫(xiě)法单雾,分別是es5的createClass寫(xiě)法,es6的class寫(xiě)法她紫,以及statel...
    ZoomFunc閱讀 1,658評(píng)論 0 1
  • React創(chuàng)建組件的三種方式及其區(qū)別 React推出后硅堆,出于不同的原因先后出現(xiàn)三種定義react組件的方式,殊途同...
    程序猿吳彥祖閱讀 258評(píng)論 0 0
  • react腳手架大集合 react4.0 官網(wǎng)redux入門(mén)教程react-native中文官網(wǎng)react官方文檔...
    pauljun閱讀 491評(píng)論 0 7
  • 突然發(fā)現(xiàn)奧迪3系列是為那些囊中羞澀贿讹,又想享受品牌的人準(zhǔn)備滴渐逃。
    簡(jiǎn)單的詩(shī)句閱讀 119評(píng)論 0 1