組建開(kāi)發(fā)選擇-React

先講故事:周一同事給我看了新頁(yè)面的原型烘挫,有大量新增的表單诀艰。也就是說(shuō),會(huì)有相當(dāng)數(shù)量的dom操作饮六。眾所周知其垄,用js去生成dom性能是相當(dāng)差的。怎么來(lái)實(shí)現(xiàn)需求的同時(shí)提升性能呢卤橄? 找小強(qiáng)討論--用React绿满!

漫談

  • 現(xiàn)在最紅的幾個(gè)前端框架是什么?AngularJs窟扑?Backboon喇颁?ReactJs?對(duì)嚎货,他們都算是當(dāng)紅炸子雞无牵。都是用來(lái)實(shí)現(xiàn)模塊化、自動(dòng)化雙向數(shù)據(jù)綁定厂抖、語(yǔ)義化標(biāo)簽茎毁。

  • 于是,為什么我選React忱辅?Backboon第一個(gè)被排除七蜘,對(duì)他是這個(gè)領(lǐng)域的鼻祖。然并卵墙懂,他老了橡卤,且很久沒(méi)跟新了,最根本的內(nèi)存泄漏問(wèn)題始終沒(méi)有解決损搬。
    AngularJS碧库,唔嗷~ 很抱歉我沒(méi)用過(guò)這貨柜与,盡管它擴(kuò)展性非常強(qiáng),但是他的學(xué)習(xí)曲線太陡峭了嵌灰,而且這次我們僅僅是為了解決動(dòng)態(tài)dom性能的問(wèn)題弄匕,AngularJS太龐大了。

  • 我們并不是說(shuō)React的功能不強(qiáng)大沽瞭,要知道React是從最早的UI引擎變成了一整套前后端通吃的 Web App 解決方案迁匠。終極目標(biāo)是用web app的方式去寫(xiě)native app~ 然后我們只要寫(xiě)一次ui,就同時(shí)能在服務(wù)區(qū) 瀏覽器和手機(jī)上看啦~

  • 回歸主題驹溃,React生成dom為毛性能那么好城丧?根據(jù) React 的設(shè)計(jì),所有的 DOM 變動(dòng)豌鹤,都先在虛擬 DOM 上發(fā)生亡哄,然后再將實(shí)際發(fā)生變動(dòng)的部分,反映在真實(shí) DOM上布疙,這種算法叫做 DOM diff 蚊惯,它可以極大提高網(wǎng)頁(yè)的性能表現(xiàn)。有興趣可以了解下拐辽,當(dāng)然你也別來(lái)問(wèn)我拣挪,我是拾人牙慧,算法什么的我完全不懂俱诸。

搞起

  • 明確下我們只搞瀏覽器端菠劝!好了 搞~

  • 標(biāo)準(zhǔn)代碼格式

<!DOCTYPE html>
<html>
<head>
<script src="../build/react.js"></script>
<script src="../build/JSXTransformer.js"></script>
</head>
<body>
<div id="example"></div>
<script type="text/jsx">
xx帥帥嗒
</script>
</body>
</html>

script 標(biāo)簽的 type 屬性為 text/jsx 。這是因?yàn)?React 獨(dú)有的 JSX 語(yǔ)法睁搭,跟 JavaScript 不兼容赶诊。凡是使用 JSX 的地方,都要加上 type="text/jsx" 

- React 提供兩個(gè)庫(kù): react.js 和 JSXTransformer.js 园骆,它們必須首先加載舔痪。其中,JSXTransformer.js 的作用是將 JSX 語(yǔ)法轉(zhuǎn)為 JavaScript 語(yǔ)法锌唾。這一步很消耗時(shí)間锄码,實(shí)際上線的時(shí)候,應(yīng)該將它放到服務(wù)器完成晌涕。這個(gè)我倒最后再講滋捶。下面我們就寫(xiě)個(gè)demo

- ```
<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/JSXTransformer.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/jsx">
      React.render(
        <h1>Hello, Rex!</h1>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

啊發(fā)現(xiàn)有什么特別~ 跟傳統(tǒng)js相比jsx語(yǔ)法允許直接寫(xiě)html標(biāo)簽,不需要引號(hào)~

<!DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    <script src="../build/JSXTransformer.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/jsx">
      var names = ['Rex', 'xx', 'Sxx'];
      React.render(
        <div>
        {
          names.map(function (name) {
            return <div>Hello, {name}!</div>
          })
        }
        </div>,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

這個(gè)demo說(shuō)明把jsx語(yǔ)法解釋的更清楚余黎,遇到<開(kāi)頭的html標(biāo)簽就用html來(lái)解析重窟,遇到{開(kāi)頭的用js規(guī)則解析。

var arr = [
  <h1>Hello world!</h1>,
  <h2>Rex is superman</h2>,
];
React.render(
  <div>{arr}</div>,
  document.getElementById('example')
);

如果數(shù)組里的對(duì)象像這個(gè)demo一樣是html結(jié)構(gòu)的話惧财,將會(huì)直接被輸出

var LikeButton = React.createClass({
  getInitialState: function() {
    return {liked: false};
  },
  handleClick: function(event) {
    this.setState({liked: !this.state.liked});
  },
  render: function() {
    var text = this.state.liked ? 'like' : 'haven\'t liked';
    return (
      <p onClick={this.handleClick}>
        You {text} this. Click to toggle.
      </p>
    );
  }
});
React.render(
  <LikeButton />,
  document.getElementById('example')
);

getInitialState 方法用于定義初始狀態(tài)巡扇,也就是一個(gè)對(duì)象扭仁,這個(gè)對(duì)象可以通過(guò) this.state 屬性讀取。當(dāng)用戶點(diǎn)擊組件厅翔,導(dǎo)致?tīng)顟B(tài)變化乖坠,this.setState 方法就修改狀態(tài)值,每次修改以后知给,自動(dòng)調(diào)用 this.render 方法瓤帚,再次渲染組件

警告描姚!

  • 昨天回去嘗試寫(xiě)demo涩赢,發(fā)現(xiàn)出問(wèn)題了,搞了好久~ 問(wèn)題出在0.13版更新之后提供了對(duì)ES6的支持轩勘。并且取消了了函數(shù)自動(dòng)綁定筒扒。用新版React去跑我demo的同學(xué),xx在這里給你道歉了~舉例:
<button onClick={this.handleSubmit}>Submit</button>

需要改寫(xiě)成

<button onClick={this.handleSubmit.bind(this)}>Submit</button>

未完待續(xù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绊寻,一起剝皮案震驚了整個(gè)濱河市花墩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澄步,老刑警劉巖冰蘑,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異村缸,居然都是意外死亡祠肥,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)梯皿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仇箱,“玉大人,你說(shuō)我怎么就攤上這事东羹〖燎牛” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵属提,是天一觀的道長(zhǎng)权逗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)冤议,這世上最難降的妖魔是什么斟薇? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮求类,結(jié)果婚禮上奔垦,老公的妹妹穿的比我還像新娘。我一直安慰自己尸疆,他們只是感情好椿猎,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布惶岭。 她就那樣靜靜地躺著,像睡著了一般犯眠。 火紅的嫁衣襯著肌膚如雪按灶。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,688評(píng)論 1 305
  • 那天筐咧,我揣著相機(jī)與錄音鸯旁,去河邊找鬼。 笑死量蕊,一個(gè)胖子當(dāng)著我的面吹牛铺罢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播残炮,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼韭赘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了势就?” 一聲冷哼從身側(cè)響起泉瞻,我...
    開(kāi)封第一講書(shū)人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苞冯,沒(méi)想到半個(gè)月后袖牙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舅锄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年鞭达,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巧娱。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碉怔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出禁添,到底是詐尸還是另有隱情撮胧,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布老翘,位于F島的核電站芹啥,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏铺峭。R本人自食惡果不足惜墓怀,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卫键。 院中可真熱鬧傀履,春花似錦、人聲如沸莉炉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至梆暮,卻和暖如春服协,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背啦粹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工偿荷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人唠椭。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓跳纳,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親泪蔫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子棒旗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

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

  • 現(xiàn)在最熱門(mén)的前端框架喘批,毫無(wú)疑問(wèn)是React撩荣。在基于React的React Native發(fā)布一天之內(nèi),就獲得了 50...
    Mycro閱讀 1,013評(píng)論 3 6
  • 現(xiàn)在最熱門(mén)的前端框架饶深,毫無(wú)疑問(wèn)是 React 餐曹。上周,基于 React 的 React Native 發(fā)布敌厘,結(jié)果一...
    sakura_L閱讀 431評(píng)論 0 0
  • Yes, React is taking over front-end development. The ques...
    Transnet2014閱讀 970評(píng)論 0 2
  • 原教程內(nèi)容詳見(jiàn)精益 React 學(xué)習(xí)指南台猴,這只是我在學(xué)習(xí)過(guò)程中的一些閱讀筆記,個(gè)人覺(jué)得該教程講解深入淺出俱两,比目前大...
    leonaxiong閱讀 2,839評(píng)論 1 18
  • 上學(xué)第二天饱狂,中午時(shí)候老師通知我留下!老師為什么要讓我留下呢宪彩?我心情很激動(dòng)也很高興休讳!我還以為老師讓我休息或者讓我做一...
    榮沛鋡閱讀 213評(píng)論 0 4