初识React前端框架开发

对Facebook推出的React仰慕已久,一直没有找到合适的机会尝试,而react早已经是最热门的前端框架,coding.net的WebIDE,墨刀的web原型设计应用,都是非常成熟的react应用;最近正好前后端都有很多想法,周末花一天时间折腾了一翻,顺利的完成入门训练。

项目采用纯静态方式实现,全部都是静态文件,不需要任何服务器就可以运行效果。传送门

React简单介绍

React一般被用来作为MVC中的V层,它不依赖其他任何的库,因此开发中,可以与任何其他的库集成使用,包括Jquery、Backbone等。它可以在浏览器端运行,也可以通过nodejs在服务端渲染。React的思想非常独特,性能出众,可以写出重复代码少,逻辑清晰的前端代码。

React的语法是jsx,通过使用这种语法,可以在react代码中直接混合使用js和html来编写代码,这样代码的逻辑就非常清晰,当然也意味着,需要将jsx代码编译成普通的javascript代码,才能在浏览器中运行,这个过程根据实际项目情况,可以选择多种不同的思路,或者在服务器端通过webpack进行编译。或者在前端加载,参见官网提供的入门代码。

<!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代码转换成js代码的渲染工作;这个代码需要加载额外的js文件,因此生产中最好在服务端完成。入门之后,我希望能够使用require.js来实现异步按需加载模块,而且代码本身也可以实现模块化。

首先通过bower下载依赖包,本次实践,使用到的依赖包有react、requirejs、jquery,经过实践发现,还必须依赖jsx-requirejs-plugin,还有text.js才能成功的的实现requirejs + react。

项目结构和功能实现

这个入门应用实现的功能很简单,将自己感兴趣的一些技术,以图文和链接组成的列表形式展示在页面上,列表的数据,以json形式存储在js配置文件中,requirejs加载业务逻辑模块的时候,会作为依赖项加载数据,并且以react.js的方式完成页面的渲染。

项目结构

index.html是纯静态的页面布局html代码,核心是通过<script data-main="/static/app/index" src="/static/lib/requirejs/require.2.2.0.min.js"></script>这段代码来加载依赖项,并运行react业务逻辑代码。

这个代码指出了requirejs配置文件的位置,依赖项和入口点,都是在/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模块的时候,先通过jsx对代码进行编译,这样就可以实现requirejs和react集成使用。require如果在config的paths中没有找到模块,就会从baseUrl开始查找要加载的模块;

app.react.js会加载该入门应用的核心代码

'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文件中存储的是一个数组,数组中存储的数据,将会使用在CardComponent组件中,这里的CaredComponent组件是React.createClass方法把一段html代码段,封装成一个模块来调用。个人觉得react的核心封装能力就体现在这里。代码如下:

'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>
            );
        }
    });
});

最终效果

至此,将所有项目相关的静态代码直接放到浏览器中就可以运行代码,也可以直接部署到服务器的对应目录下运行。

最终效果图

react这种封装组件和模块化的方式,确实特别高效。写出的代码逻辑很清晰。非常值得亲自动手尝试一下。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容