React 中文版

React_Image.svg
React_Image.svg

React 是 Facebook 推出的一個用來構(gòu)建用戶界面的 JavaScript 庫卸伞。具備以下特性:

  • 不是一個 MVC 框架
  • 不使用模板
  • 響應(yīng)式更新非常簡單
  • HTML5 僅僅是個開始

僅僅是 UI

許多人使用 React 作為 MVC 架構(gòu)的 V 層。 盡管 React 并沒有假設(shè)過你的其余技術(shù)棧仔燕, 但它仍可以作為一個小特征輕易地在已有項目中使用

虛擬 DOM

React 為了更高超的性能而使用虛擬 DOM 作為其不同的實現(xiàn)沪蓬。 它同時也可以由服務(wù)端 Node.js 渲染 - 而不需要過重的瀏覽器 DOM 支持

數(shù)據(jù)流

React 實現(xiàn)了單向響應(yīng)的數(shù)據(jù)流双吆,從而減少了重復(fù)代碼,這也是它為什么比傳統(tǒng)數(shù)據(jù)綁定更簡單绷落。

一個簡單的組件

React 組件通過一個render()方法,接受輸入的參數(shù)并返回展示的對象始苇。

以下這個例子使用了 JSX砌烁,它類似于XML的語法

輸入的參數(shù)通過render()傳入組件后,將存儲在this.props

JSX 是可選的催式,并不強制要求使用函喉。

點擊 "Compiled JS" 可以看到 JSX 編譯之后的 JavaScript 代碼

Live JSX Editor

    var HelloMessage = React.createClass({
      render: function() {
        return <div>Hello {this.props.name}</div>;
      }
    });
 
    React.render(<HelloMessage name="John" />, mountNode)
Hello John

Compiled JS

var HelloMessage = React.createClass({displayName: "HelloMessage",
  render: function() {
    return React.createElement("div", null, "Hello ", this.props.name);
  }
});

React.render(React.createElement(HelloMessage, {name: "John"}), mountNode);

一個有狀態(tài)的組件

除了接受輸入數(shù)據(jù)(通過 this.props ),組件還可以保持內(nèi)部狀態(tài)數(shù)據(jù)(通過 this.state )荣月。當(dāng)一個組件的狀態(tài)數(shù)據(jù)的變化管呵,展現(xiàn)的標記將被重新調(diào)用 render() 更新。

Live JSX Editor

var Timer = React.createClass({
  getInitialState: function() {
    return {secondsElapsed: 0};
  },
  tick: function() {
    this.setState({secondsElapsed: this.state.secondsElapsed + 1});
  },
  componentDidMount: function() {
    this.interval = setInterval(this.tick, 1000);
  },
  componentWillUnmount: function() {
    clearInterval(this.interval);
  },
  render: function() {
    return (
      <div>Seconds Elapsed: {this.state.secondsElapsed}</div>
    );
  }
});
 
React.render(<Timer />, mountNode);

Compiled JS

var Timer = React.createClass({displayName: "Timer",
  getInitialState: function() {
    return {secondsElapsed: 0};
  },
  tick: function() {
    this.setState({secondsElapsed: this.state.secondsElapsed + 1});
  },
  componentDidMount: function() {
    this.interval = setInterval(this.tick, 1000);
  },
  componentWillUnmount: function() {
    clearInterval(this.interval);
  },
  render: function() {
    return (
      React.createElement("div", null, "Seconds Elapsed: ", this.state.secondsElapsed)
    );
  }
});

React.render(React.createElement(Timer, null), mountNode);

一個應(yīng)用程序

通過使用propsstate, 我們可以組合構(gòu)建一個小型的 Todo 程序哺窄。

下面例子使用state去監(jiān)測當(dāng)前列表的項以及用戶已經(jīng)輸入的文本捐下。 盡管事件綁定似乎是以內(nèi)聯(lián)的方式,但他們將被收集起來并以事件代理的方式實現(xiàn)萌业。

Live JSX EditorCompiled JS

var TodoList = React.createClass({
  render: function() {
    var createItem = function(itemText) {
      return <li>{itemText}</li>;
    };
    return <ul>{this.props.items.map(createItem)}</ul>;
  }
});
var TodoApp = React.createClass({
  getInitialState: function() {
    return {items: [], text: ''};
  },
  onChange: function(e) {
    this.setState({text: e.target.value});
  },
  handleSubmit: function(e) {
    e.preventDefault();
    var nextItems = this.state.items.concat([this.state.text]);
    var nextText = '';
    this.setState({items: nextItems, text: nextText});
  },
  render: function() {
    return (
      <div>
        <h3>TODO</h3>
        <TodoList items={this.state.items} />
        <form onSubmit={this.handleSubmit}>
          <input onChange={this.onChange} value={this.state.text} />
          <button>{'Add #' + (this.state.items.length + 1)}</button>
        </form>
      </div>
    );
  }
});
 
React.render(<TodoApp />, mountNode);

Compiled JS

var TodoList = React.createClass({displayName: "TodoList",
  render: function() {
    var createItem = function(itemText) {
      return React.createElement("li", null, itemText);
    };
    return React.createElement("ul", null, this.props.items.map(createItem));
  }
});
var TodoApp = React.createClass({displayName: "TodoApp",
  getInitialState: function() {
    return {items: [], text: ''};
  },
  onChange: function(e) {
    this.setState({text: e.target.value});
  },
  handleSubmit: function(e) {
    e.preventDefault();
    var nextItems = this.state.items.concat([this.state.text]);
    var nextText = '';
    this.setState({items: nextItems, text: nextText});
  },
  render: function() {
    return (
      React.createElement("div", null, 
        React.createElement("h3", null, "TODO"), 
        React.createElement(TodoList, {items: this.state.items}), 
        React.createElement("form", {onSubmit: this.handleSubmit}, 
          React.createElement("input", {onChange: this.onChange, value: this.state.text}), 
          React.createElement("button", null, 'Add #' + (this.state.items.length + 1))
        )
      )
    );
  }
});

React.render(React.createElement(TodoApp, null), mountNode);

一個使用外部插件的組件

React 是靈活的坷襟,并且提供方法允許你跟其他庫和框架對接。

下面例子展現(xiàn)了一個案例生年,使用外部庫 Markdown 實時轉(zhuǎn)化 textarea 的值婴程。

Live JSX Editor

var converter = new Showdown.converter();
 
var MarkdownEditor = React.createClass({
  getInitialState: function() {
    return {value: 'Type some *markdown* here!'};
  },
  handleChange: function() {
    this.setState({value: this.refs.textarea.getDOMNode().value});
  },
  render: function() {
    return (
      <div className="MarkdownEditor">
        <h3>Input</h3>
        <textarea
          onChange={this.handleChange}
          ref="textarea"
          defaultValue={this.state.value} />
        <h3>Output</h3>
        <div
          className="content"
          dangerouslySetInnerHTML={{
            __html: converter.makeHtml(this.state.value)
          }}
        />
      </div>
    );
  }
});
 
React.render(<MarkdownEditor />, mountNode);

Compiled JS

var converter = new Showdown.converter();

var MarkdownEditor = React.createClass({displayName: "MarkdownEditor",
  getInitialState: function() {
    return {value: 'Type some *markdown* here!'};
  },
  handleChange: function() {
    this.setState({value: this.refs.textarea.getDOMNode().value});
  },
  render: function() {
    return (
      React.createElement("div", {className: "MarkdownEditor"}, 
        React.createElement("h3", null, "Input"), 
        React.createElement("textarea", {
          onChange: this.handleChange, 
          ref: "textarea", 
          defaultValue: this.state.value}), 
        React.createElement("h3", null, "Output"), 
        React.createElement("div", {
          className: "content", 
          dangerouslySetInnerHTML: {
            __html: converter.makeHtml(this.state.value)
          }}
        )
      )
    );
  }
});

React.render(React.createElement(MarkdownEditor, null), mountNode);

快速入門

下載 React v0.13.0

本教程部分內(nèi)容來源于 React 中文網(wǎng) - reactjs.cn
React 官網(wǎng):http://facebook.github.io/react/

更新日期 更新內(nèi)容
2015-04-10 React 中文版發(fā)布

版本信息

書中演示代碼基于以下版本:

語言/框架 版本信息
react 0.13.1

課程目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抱婉,隨后出現(xiàn)的幾起案子档叔,更是在濱河造成了極大的恐慌桌粉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衙四,死亡現(xiàn)場離奇詭異铃肯,居然都是意外死亡,警方通過查閱死者的電腦和手機届搁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門缘薛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人卡睦,你說我怎么就攤上這事宴胧。” “怎么了表锻?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵恕齐,是天一觀的道長。 經(jīng)常有香客問我瞬逊,道長显歧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任确镊,我火速辦了婚禮士骤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蕾域。我一直安慰自己拷肌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布旨巷。 她就那樣靜靜地躺著巨缘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪采呐。 梳的紋絲不亂的頭發(fā)上若锁,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天,我揣著相機與錄音斧吐,去河邊找鬼又固。 笑死,一個胖子當(dāng)著我的面吹牛会通,可吹牛的內(nèi)容都是我干的口予。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼涕侈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了煤辨?” 一聲冷哼從身側(cè)響起裳涛,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤木张,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后端三,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舷礼,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年郊闯,在試婚紗的時候發(fā)現(xiàn)自己被綠了妻献。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡团赁,死狀恐怖育拨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情欢摄,我是刑警寧澤熬丧,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站怀挠,受9級特大地震影響析蝴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绿淋,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一闷畸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吞滞,春花似錦佑菩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至组贺,卻和暖如春凸舵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背失尖。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工啊奄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人掀潮。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓菇夸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親仪吧。 傳聞我的和親對象是個殘疾皇子庄新,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,507評論 2 359

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

  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個人覺得該教程講解深入淺出择诈,比目前大...
    leonaxiong閱讀 2,842評論 1 18
  • 深入JSX date:20170412筆記原文其實JSX是React.createElement(componen...
    gaoer1938閱讀 8,073評論 2 35
  • 最近看了一本關(guān)于學(xué)習(xí)方法論的書械蹋,強調(diào)了記筆記和堅持的重要性。這幾天也剛好在學(xué)習(xí)React羞芍,所以我打算每天堅持一篇R...
    gaoer1938閱讀 1,690評論 0 5
  • 這是屬于·科瓦伊·萊納德的黃金時代哗戈。 在職業(yè)生涯的第六個年頭,他已經(jīng)成為一支王牌球隊當(dāng)仁不讓的核心了——在他身后荷科,...
    ThuleWang閱讀 205評論 0 0
  • 剛剛知道班級里兩個男生過了大連海事的初試唯咬,兩個司考c證都遠沒有拿到而考研只用兩個月時間的準備的男生。我在想畏浆,是不是...
    依然井柏然閱讀 152評論 0 0