初識(shí)React前端框架開發(fā)

對(duì)Facebook推出的React仰慕已久,一直沒(méi)有找到合適的機(jī)會(huì)嘗試衰琐,而react早已經(jīng)是最熱門的前端框架,coding.net的WebIDE炼蹦,墨刀的web原型設(shè)計(jì)應(yīng)用羡宙,都是非常成熟的react應(yīng)用;最近正好前后端都有很多想法掐隐,周末花一天時(shí)間折騰了一翻狗热,順利的完成入門訓(xùn)練。

項(xiàng)目采用純靜態(tài)方式實(shí)現(xiàn)虑省,全部都是靜態(tài)文件匿刮,不需要任何服務(wù)器就可以運(yùn)行效果。傳送門

React簡(jiǎn)單介紹

React一般被用來(lái)作為MVC中的V層探颈,它不依賴其他任何的庫(kù)熟丸,因此開發(fā)中,可以與任何其他的庫(kù)集成使用膝擂,包括Jquery虑啤、Backbone等。它可以在瀏覽器端運(yùn)行架馋,也可以通過(guò)nodejs在服務(wù)端渲染狞山。React的思想非常獨(dú)特,性能出眾叉寂,可以寫出重復(fù)代碼少萍启,邏輯清晰的前端代碼。

React的語(yǔ)法是jsx屏鳍,通過(guò)使用這種語(yǔ)法勘纯,可以在react代碼中直接混合使用js和html來(lái)編寫代碼,這樣代碼的邏輯就非常清晰钓瞭,當(dāng)然也意味著驳遵,需要將jsx代碼編譯成普通的javascript代碼,才能在瀏覽器中運(yùn)行山涡,這個(gè)過(guò)程根據(jù)實(shí)際項(xiàng)目情況堤结,可以選擇多種不同的思路,或者在服務(wù)器端通過(guò)webpack進(jìn)行編譯鸭丛【呵睿或者在前端加載,參見(jiàn)官網(wǎng)提供的入門代碼鳞溉。

<!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>

代碼中的babel browser瘾带,可以將jsx代碼轉(zhuǎn)換成js代碼的渲染工作;這個(gè)代碼需要加載額外的js文件熟菲,因此生產(chǎn)中最好在服務(wù)端完成看政。入門之后,我希望能夠使用require.js來(lái)實(shí)現(xiàn)異步按需加載模塊抄罕,而且代碼本身也可以實(shí)現(xiàn)模塊化帽衙。

首先通過(guò)bower下載依賴包,本次實(shí)踐贞绵,使用到的依賴包有react厉萝、requirejs、jquery榨崩,經(jīng)過(guò)實(shí)踐發(fā)現(xiàn)谴垫,還必須依賴jsx-requirejs-plugin,還有text.js才能成功的的實(shí)現(xiàn)requirejs + react母蛛。

項(xiàng)目結(jié)構(gòu)和功能實(shí)現(xiàn)

這個(gè)入門應(yīng)用實(shí)現(xiàn)的功能很簡(jiǎn)單翩剪,將自己感興趣的一些技術(shù),以圖文和鏈接組成的列表形式展示在頁(yè)面上彩郊,列表的數(shù)據(jù)前弯,以json形式存儲(chǔ)在js配置文件中蚪缀,requirejs加載業(yè)務(wù)邏輯模塊的時(shí)候,會(huì)作為依賴項(xiàng)加載數(shù)據(jù)恕出,并且以react.js的方式完成頁(yè)面的渲染询枚。

項(xiàng)目結(jié)構(gòu)

index.html是純靜態(tài)的頁(yè)面布局html代碼,核心是通過(guò)<script data-main="/static/app/index" src="/static/lib/requirejs/require.2.2.0.min.js"></script>這段代碼來(lái)加載依賴項(xiàng)浙巫,并運(yùn)行react業(yè)務(wù)邏輯代碼金蜀。

這個(gè)代碼指出了requirejs配置文件的位置,依賴項(xiàng)和入口點(diǎn)的畴,都是在/static/app/index.js中配置的渊抄。代碼如下:

'use strict';

require.config({
    baseUrl: '/static/app',
    paths: {
        jquery: '../lib/jquery/js/jquery.min',

        react: '../lib/react/react-with-addons.min',
        'react-dom':'../lib/react/react-dom',
        
        "JSXTransformer": '../lib/plugin/JSXTransformer',
        jsx: '../lib/plugin/jsx',
        text: '../lib/requirejs/text',
    },
    shim: {
        jquery: {
            "exports" : "$"
        }
    }
});

require([
    'jsx!app.react'
], function (App) {
    App.initialize();
});

require()中的jsx指示requirejs,在加載app.react模塊的時(shí)候丧裁,先通過(guò)jsx對(duì)代碼進(jìn)行編譯护桦,這樣就可以實(shí)現(xiàn)requirejs和react集成使用。require如果在config的paths中沒(méi)有找到模塊煎娇,就會(huì)從baseUrl開始查找要加載的模塊嘶炭;

app.react.js會(huì)加載該入門應(yīng)用的核心代碼

'use strict';

define([
    'react', 'react-dom', 'jquery','jsx!component/CardComponent.react',
    'data/interest'
], function (React , ReactDOM, $,CardComponent , interestData) {
    var initialize = function () {
        ReactDOM.render(
            <div class="js-intro-container">
            {
                interestData.map(function (card) {
                    console.log(card);
                    return <CardComponent cardData={card}/>
                })
            }
            </div>,
            document.getElementById('js-intro-container')
        );

    };
    return {
        initialize: initialize
    };
});

data/interest.js文件中存儲(chǔ)的是一個(gè)數(shù)組,數(shù)組中存儲(chǔ)的數(shù)據(jù)逊桦,將會(huì)使用在CardComponent組件中眨猎,這里的CaredComponent組件是React.createClass方法把一段html代碼段,封裝成一個(gè)模塊來(lái)調(diào)用强经。個(gè)人覺(jué)得react的核心封裝能力就體現(xiàn)在這里睡陪。代碼如下:

'use strict';

define([
    'react'
],function(React){
    return React.createClass({
        render: function() {
            return (
            <div className="row intro-row js-intro-row">
                // 此處省略......
                <img src={this.props.cardData.img} alt="" className="card-image"/>
                // 此處省略......
            </div>
            );
        }
    });
});

最終效果

至此,將所有項(xiàng)目相關(guān)的靜態(tài)代碼直接放到瀏覽器中就可以運(yùn)行代碼匿情,也可以直接部署到服務(wù)器的對(duì)應(yīng)目錄下運(yùn)行兰迫。

最終效果圖

react這種封裝組件和模塊化的方式,確實(shí)特別高效炬称。寫出的代碼邏輯很清晰汁果。非常值得親自動(dòng)手嘗試一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玲躯,一起剝皮案震驚了整個(gè)濱河市据德,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跷车,老刑警劉巖棘利,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異朽缴,居然都是意外死亡善玫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門密强,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)茅郎,“玉大人蜗元,你說(shuō)我怎么就攤上這事∠等撸” “怎么了奕扣?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)毕谴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)距芬,這世上最難降的妖魔是什么涝开? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮框仔,結(jié)果婚禮上舀武,老公的妹妹穿的比我還像新娘。我一直安慰自己离斩,他們只是感情好银舱,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著跛梗,像睡著了一般寻馏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上核偿,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天诚欠,我揣著相機(jī)與錄音,去河邊找鬼漾岳。 笑死轰绵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的尼荆。 我是一名探鬼主播左腔,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捅儒!你這毒婦竟也來(lái)了液样?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巧还,失蹤者是張志新(化名)和其女友劉穎蓄愁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體狞悲,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撮抓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摇锋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丹拯。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡站超,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出乖酬,到底是詐尸還是另有隱情死相,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布咬像,位于F島的核電站算撮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏县昂。R本人自食惡果不足惜肮柜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望倒彰。 院中可真熱鬧审洞,春花似錦、人聲如沸待讳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)创淡。三九已至痴晦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琳彩,已是汗流浹背阅酪。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汁针,地道東北人术辐。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像施无,于是被迫代替她去往敵國(guó)和親辉词。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

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