說(shuō)說(shuō)React的事(一)

在公司用React做項(xiàng)目已經(jīng)有一年多了侧纯,剛開(kāi)始接觸它的時(shí)候嘉栓,給我的第一感覺(jué)就是很有顛覆性,一言不合就往JS里面插入Html代碼捐祠。在MVC或者M(jìn)VVM的框架里碱鳞,我們宣揚(yáng)的是視圖V和模型M的分離,就是你負(fù)責(zé)扮靚踱蛀,我負(fù)責(zé)賺錢窿给。而React更多的是宣揚(yáng)組件化思想,各位看官請(qǐng)看下圖率拒。


各個(gè)組件組成了我的身體

那React到底有哪些好處呢崩泡?為了方便看官查閱,我在此羅列了出來(lái)猬膨。

  1. “輕”角撞;react是很輕量的框架
  2. 速度快,效率高勃痴;真正Dom其實(shí)是很巨大的谒所,直接操作Dom很耗性能。React引入virtual dom概念沛申,它不直接操作Dom而是將Dom結(jié)構(gòu)存儲(chǔ)在內(nèi)存中劣领,然后通過(guò)render中返回的內(nèi)容做一個(gè)Dom Diff的比較,再將變化反映到Dom做局部更新铁材。
  3. 組件化思想剖踊;利用React可以輕松構(gòu)建所需要的組件,并且各組件之間可輕易的組合衫贬,使得代碼重用及各模塊之間的測(cè)試變得更加簡(jiǎn)單德澈。
  4. 單向式響應(yīng)數(shù)據(jù)流;React實(shí)現(xiàn)了單向式相應(yīng)數(shù)據(jù)流固惯,使得數(shù)據(jù)交互變得非常簡(jiǎn)易清晰梆造,減少了許多重復(fù)代碼,比傳統(tǒng)的數(shù)據(jù)綁定簡(jiǎn)單。

那React到底是怎么一回事呢镇辉,我們現(xiàn)在來(lái)揭開(kāi)它的神秘面紗屡穗,例行慣例先來(lái)一段Hello World。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>Hello React!</title>
        <script src="build/react.js"></script>
        <script src="build/react-dom.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/babel-core/5.8.23/browser.min.js"></script>
    </head>
    <body>
        <div id="example"></div>
        <script type="text/babel">
        ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('example') );
        </script>
    </body>
</html>

以上的頁(yè)面在瀏覽器打開(kāi)就可以清晰的看到Hello, world!了忽肛。以上代碼的最后一個(gè)<script>片段要特別注意村砂,它的Type是text/babel,用此標(biāo)簽的作用是讓babel識(shí)別出并最終將jsx語(yǔ)句轉(zhuǎn)換為瀏覽器可識(shí)別可運(yùn)行的js語(yǔ)句屹逛。
上述代碼我們引用了三個(gè)庫(kù)

react.js:React的核心庫(kù)
react-dom.js: 提供與DOM的相關(guān)的功能
browser.min.js: 解析jsx語(yǔ)法础废,將jsx語(yǔ)法轉(zhuǎn)換為JavaScript語(yǔ)法,實(shí)際上這一部很消耗時(shí)間應(yīng)該放在服務(wù)器完成

當(dāng)然你也可以把ReactJs的代碼提取出來(lái)罕模,為了讓它看起來(lái)有組件的樣子评腺,我們改造成如下樣子。

var HelloWorld = React.createClass({
    render: function() {
        return (
            <h1>Hello, world!</h1>
        );
    }
});

ReactDOM.render(<HelloWorld/>, document.getElementById("example"));

Html頁(yè)面只需要引用它就可以了

<script type="text/babel" src="src/helloworld.js"></script>
運(yùn)行結(jié)果

需要注意的是淑掌,頁(yè)面在某些瀏覽器打開(kāi)可能會(huì)報(bào)錯(cuò)無(wú)法加載該文件例如谷歌chrome蒿讥,原因是它不是http請(qǐng)求,如果放在服務(wù)器是完全沒(méi)有問(wèn)題的抛腕。但我們沒(méi)有服務(wù)器想在本地看看怎么辦芋绸,別急,還是有辦法的担敌。Mac可以先退出瀏覽器再用以下命令打開(kāi)谷歌chrome侥钳。

open -a Google\ Chrome --args --disable-web-security --allow-file-access-from-files --user-data-dir=""

Windows的可以右擊谷歌瀏覽器快捷方式,打開(kāi)屬性在目標(biāo)位置后加上如下參數(shù)

--args --disable-web-security --allow-file-access-from-files --user-data-dir=""

繼續(xù)說(shuō)上面的代碼柄错,我們可以看到我們使用了<HelloWorld/>給id為example的元素渲染了內(nèi)容Hello, world!而此時(shí)此刻我們所創(chuàng)建的這個(gè)React對(duì)象就是個(gè)簡(jiǎn)單的組件了舷夺。這里有一點(diǎn)切記組件名字開(kāi)頭一定要大寫


現(xiàn)在假如我不想組件返回一個(gè)Hello售貌,world給我我想說(shuō)點(diǎn)別的给猾,比如說(shuō)洋氣的中文“你好世界”要怎么做呢。這時(shí)候我們可以用React的props颂跨。

var HelloWorld = React.createClass({
    render: function() {
        return (
            <h1>{this.props.words}</h1>
        );
    }
});

ReactDOM.render(<HelloWorld words="你好世界"/>, document.getElementById("example"));

運(yùn)行結(jié)果

props可用于父組件向子組件傳值敢伸,這將是組件的一個(gè)初始值,一旦設(shè)置之后將不能修改恒削。


你可能想父組件在沒(méi)有傳值給子組件時(shí)池颈,子組件可以有默認(rèn)的值可以用,這時(shí)候這個(gè)方法getDefaultProps就派上用場(chǎng)了钓丰。該方法是默認(rèn)給props的各屬性設(shè)置相應(yīng)的值躯砰。

var HelloWorld = React.createClass({
    getDefaultProps: function(){
        return {
            words: "你好世界"
        };
    },

    render: function() {
        return (
            <h1>{this.props.words}</h1>
        );
    }
});

ReactDOM.render(<HelloWorld/>, document.getElementById("example"));

組件肯定避免不了要與用戶互動(dòng),當(dāng)有數(shù)據(jù)更新的時(shí)候携丁,我們要怎么把新數(shù)據(jù)渲染到界面上呢琢歇。這里我們?nèi)杂蒙弦粋€(gè)栗子來(lái)闡述這個(gè)問(wèn)題,這時(shí)候我們會(huì)用到state

var HelloWorld = React.createClass({
    getInitialState: function(){
        return {
            words: "Hello, world!"
        };
    },

    sayChinese: function(){
        this.setState({words: "你好,世界!"});
    },

    render: function() {
        return (
            <div>
                <h1>{this.state.words}</h1>
                <button onClick={this.sayChinese}>Say Chinese!</button>
            </div>
        );
    }
});

ReactDOM.render(<HelloWorld/>, document.getElementById("example"));

點(diǎn)擊變成了中文

props一樣李茫,state也可以通過(guò)getInitialState設(shè)置初始值揭保,當(dāng)用戶點(diǎn)擊組件,調(diào)用了方法setState修改了狀態(tài)值魄宏,導(dǎo)致組件的狀態(tài)變化秸侣,每次修改完成后都會(huì)自動(dòng)調(diào)用render方法重新渲染組件,從這里也可以看出單向數(shù)據(jù)流的特性宠互。


看起來(lái)好像組件都可以調(diào)用props的值或者state里的屬性值來(lái)展示渲染數(shù)據(jù)味榛,但其實(shí)這兩者是有根本區(qū)別的。

props一旦定義就不能改變名秀,state可以隨時(shí)改變
props主要組件用于初始化,state用于與用戶交互和組件更新

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末藕溅,一起剝皮案震驚了整個(gè)濱河市匕得,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌巾表,老刑警劉巖汁掠,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異集币,居然都是意外死亡考阱,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鞠苟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乞榨,“玉大人,你說(shuō)我怎么就攤上這事当娱〕约龋” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵跨细,是天一觀的道長(zhǎng)鹦倚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)冀惭,這世上最難降的妖魔是什么震叙? 我笑而不...
    開(kāi)封第一講書人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮散休,結(jié)果婚禮上媒楼,老公的妹妹穿的比我還像新娘。我一直安慰自己戚丸,他們只是感情好匣砖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般猴鲫。 火紅的嫁衣襯著肌膚如雪对人。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,231評(píng)論 1 299
  • 那天拂共,我揣著相機(jī)與錄音牺弄,去河邊找鬼。 笑死宜狐,一個(gè)胖子當(dāng)著我的面吹牛势告,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抚恒,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼咱台,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了俭驮?” 一聲冷哼從身側(cè)響起回溺,我...
    開(kāi)封第一講書人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎混萝,沒(méi)想到半個(gè)月后遗遵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逸嘀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年车要,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崭倘。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翼岁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出司光,到底是詐尸還是另有隱情登澜,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布飘庄,位于F島的核電站脑蠕,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏跪削。R本人自食惡果不足惜谴仙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碾盐。 院中可真熱鬧晃跺,春花似錦、人聲如沸毫玖。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至烹玉,卻和暖如春驰怎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背二打。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工县忌, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人继效。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓症杏,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瑞信。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厉颤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

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

  • 最近看了一本關(guān)于學(xué)習(xí)方法論的書,強(qiáng)調(diào)了記筆記和堅(jiān)持的重要性凡简。這幾天也剛好在學(xué)習(xí)React逼友,所以我打算每天堅(jiān)持一篇R...
    gaoer1938閱讀 1,675評(píng)論 0 5
  • 原教程內(nèi)容詳見(jiàn)精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過(guò)程中的一些閱讀筆記潘鲫,個(gè)人覺(jué)得該教程講解深入淺出翁逞,比目前大...
    leonaxiong閱讀 2,834評(píng)論 1 18
  • GUIDS 第一章 為什么使用React肋杖? React 一個(gè)提供了用戶接口的JavaScript庫(kù)溉仑。 誕生于Fac...
    jplyue閱讀 3,532評(píng)論 1 11
  • 處在這個(gè)物欲橫流的社會(huì)上津畸,不免人的內(nèi)心也時(shí)時(shí)刻刻被牽動(dòng)著振定。 人們茶余飯后,甚至在工作的間隙肉拓,談?wù)摰亩际欠孔雍笃怠④囎印?..
    清風(fēng)伏筆閱讀 1,867評(píng)論 4 7
  • 第三遍重讀蔣勛先生的《孤獨(dú)六講》卑惜,與第一次的“粗讀”不同,在這一遍的閱讀里驻售,我順著全文的經(jīng)脈細(xì)細(xì)摸索露久,腦子里原本混...
    林驚蟄ya閱讀 179評(píng)論 0 0