<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      Fork me on GitHub

      React 基礎入門

      React 起源于 Facebook 內部項目,是一個用來構建用戶界面的 Javascript 庫,相當于MVC架構中的V層框架,與市面上其他框架不同的是,React 把每一個組件當成了一個狀態機,組件內部通過 state 來維護組件狀態的變化,當組件的狀態發生變化時,React 通過虛擬DOM技術來增量并且高效的更新真實DOM。本文將對React 的這些特點進行簡單的介紹。

      Hello React 

      考慮到有的同學還不曾了解過 React,我們先來寫一個簡單的 React 組件,讓大家一睹為快!

      // 創建一個HelloReact組件
      var HelloReact = React.createClass({
          render:function(){
              return (
                  <div>
                       Hello React!
                  </div>
              )
          }
      });
      
      // 使用HelloReact組件
      ReactDOM.render(
          <HelloReact />,
          document.querySelector('body')
      )

      這樣就定義了一個React組件,當然要運行這段代碼是有條件的,需要引入React庫,還需要引入JSX語法轉換庫,這里不多說了,這些基礎的東西還需要各位親自實踐才好!

      虛擬DOM(Virtual DOM)

      在前端開發的過程中,我們經常會做的一件事就是將變化的數據實時更新到UI上,這時就需要對DOM進行更新和重新渲染,而頻繁的DOM操作通常是性能瓶頸產生的原因之一,有時候我們會遇到這樣一種尷尬的情況:比如有一個列表數據,當用戶執行刷新操作時,Ajax會重新從后臺請求數據,即使新請求的數據和上次完全相同,DOM也會被全部更新一遍并進行重新渲染,這樣就產生了不必要的性能開銷。

      React為此引入了虛擬DOM(Virtual DOM)機制:對于每一個組件,React會在內存中構建一個相對應的DOM樹,基于React開發時所有的DOM構造都是通過虛擬DOM進行,每當組件的狀態發生變化時,React都會重新構建整個DOM數據,然后將當前的整個DOM樹和上一次的DOM樹進行對比,得出DOM結構變化的部分(Patchs),然后將這些Patchs 再更新到真實DOM中。整個過程都是在內存中進行,因此是非常高效的。借用一張圖可以清晰的表示虛擬DOM的工作機制:

      React 生命周期

      React 把每個組件都當作一個狀態機來維護和管理,因此每個組件都擁有一套完整的生命周期,大致可以分為三個過程:初始化、更新和銷毀。生命周期的每一個過程都明確的反映了組件的狀態變化。對于開發來說就能很容易的把握組件的每個狀態,不同的狀態時期做對應的事情,互不干擾。以下是和組件生命周期相關的幾個方法:

      getDefaultProps

      getInitialState

      componentWillMount

      componentDidMount

      componentWillReceiveProps

      shouldComponentUpdate

      componentWillUpdate

      componentDidUpdate

      componentWillUnmount

      初始化

      對于外部系統來說,組件是一個獨立存在的封閉系統,內部的邏輯被隱藏,只對外暴露傳遞數據的接口,而React為我們提供了兩種方式來向組件傳遞數據,即 props 和 state。

      props 是在調用 ReactDOM.render() 時通過標簽屬性xxx傳遞,然后通過 this.props.xxx 來獲取,getDefaultProps 允許你為組件設置一個默認的props值,在沒有傳遞props的情況下顯示默認值。

      // 創建HelloReact組件
      var HelloReact = React.createClass({
          /**
           * 當設置props的默認值 當沒有傳遞時顯示默認值
           * @return {}
           */
          getDefaultProps:function(){
             return {
                 data:"暫無數據"
             }
          },
          render:function(){
              return (
                  <div>
                     //顯示data,當props發生變化時會自動更新
                     {this.props.data}
                  </div>
              )
          }
      });//傳遞props屬性data
      ReactDOM.render(
         <HelloReact data={"Hello React!"} />,
         document.querySelector('body')
      )

      和 props 不同的是,state不能通過外部傳遞,因此在使用state之前,需要在 getInitialState 中為state設置一個默認值,然后才能通過 this.state.xxx 來訪問,當組件被掛載完成時,觸發 componentDidMount 方法,我們可以在這里通過Ajax請求服務器數據,然后再通過 setState() 把state的值設置為真實數據。

      // 創建HelloReact組件
      var HelloReact = React.createClass({
          /**
           * 設置組件的初始值
           * @returns {{data: Array, msg: string}}
           */
          getInitialState:function(){
              return {
                  data:"數據加載中..." //初始值為[]
              }
          },
          /**
           * 掛載后首次加載數據
           */
          componentDidMount:function(){
              this.requestData();//請求數據
          },
          /**
           * 請求后臺數據
           */
          requestData:function(){
              $.ajax({
                  url:'xxxx.ashx',
                  data:{},
                  success:function(data){
                      this.setState({
                          data:data  //通過setState()更新服務器數據
                      })
                  }
              }.bind(this))
          },
          render:function(){
              return (
                  <div>
                     {this.state.data}
                  </div>
              )
          }
      });
      ReactDOM.render(
          <HelloReact  />,
          document.querySelector('body')
      )

      更新

      props屬性是只讀的,如果想要改變props的值,只能通過重新調用render()來傳遞新的props,但要注意的是,重新執行render()組件不會被重新掛載,而是通過虛擬DOM技術進行增量更新和渲染,這時還會觸發 componentWillReceiveProps 方法,并將新的props作為參數傳遞,你可以在這里對新的props進行處理。

      相比props,state天生就是用來反映組件狀態的,因此它的值是可以被改變的,當state的值被改變時,通過setState就可以改變state的值,React同樣也是采用虛擬DOM技術來計算需要被更新的部分,而不是牽一發動全身的更新和渲染。

      當 props 和 state 的狀態發生變化后,組件在即將更新之前還會觸發一個叫 shouldConponentUpdate 的方法,如果 shouldConponentUpdate 返回的是 true,不管props和state 的值和上一次相比有沒有變化,React 都會老老實實的進行對比。此時,如果你確定以及肯定兩次數據沒有變化,那就讓 shouldConponentUpdate 返回 false,React就不會進行diff了,更不會重新渲染了。瞬間省去了 diff 的時間。

      銷毀

      當組件從DOM中被移除時,React會銷毀之。在銷毀之前,細心的React還觸發 componentWillUnmount 來通知你,看你最后有沒有什么話想對這個即將銷毀的組件說,當然你沒什么事就不用了。

      props 與 state 

      我們已經知道可以通過 props 和 state 兩種方式向組件傳遞數據,props 是只讀的不能被改變,而 state 是用來反映一個組件的狀態,是可以改變的。因此,當組件所需要的數據在調用時是已經確定的,不頻繁發生變化的,就可以使用props來傳遞,相反,當組件所需要的數據在調用時不能確定,需要等待異步回調時才能確定,比如ajax請求數據,input 的 onchange事件,這時就需要使用state 來記錄和改變這些值得變化。

       

      原創發布 @一像素 2016

       

      posted @ 2016-03-06 21:58  一像素  閱讀(14682)  評論(7)    收藏  舉報
      主站蜘蛛池模板: 激情五月天一区二区三区| 国产一区二区三区小说| 一区二区三区成人| 做暖暖视频在线看片免费 | 宜兰县| 亚洲春色在线视频| 国产一区二区三区不卡观| 老司机亚洲精品一区二区| 亚洲成A人片在线观看的电影| AV教师一区高清| 日本高清www无色夜在线视频| 无码人妻丝袜在线视频| 免费一区二三区三区蜜桃| 亚洲天堂精品一区二区| 亚洲人成色77777在线观看| 亚洲男人的天堂网站| 丰满少妇内射一区| 中文字幕人乱码中文| 国产福利永久在线视频无毒不卡| 精品一二三四区在线观看| 成人特黄特色毛片免费看| 久久日产一线二线三线| 亚洲综合国产精品第一页| 国产午夜福利精品视频| 开心激情站开心激情网六月婷婷| 麻豆精品一区二区三区蜜桃| A级毛片100部免费看| 精人妻无码一区二区三区| 99热久久这里只有精品| 国产精品一区在线蜜臀| 精品人妻av区乱码| 麻豆蜜桃伦理一区二区三区| 免费人成自慰网站| 激情综合五月网| 国产成人8X人网站视频| 亚洲免费观看在线视频| 亚洲中文字幕精品无人区| 国产性色的免费视频网站| 双峰县| 日本亚洲一区二区精品久久| 国产高清在线精品一区APP|