ReactJS基礎(chǔ)學(xué)習(xí)-02

React 組件

React 允許將代碼封裝成組件(component),然后像插入普通 HTML 標(biāo)簽一樣仰冠,在網(wǎng)頁中插入這個(gè)組件。React.createClass 方法就用于生成一個(gè)組件類

接下來我們封裝一個(gè)輸出 "Hello World蝶糯!" 的組件洋只,組件名為 HelloMessage:

//組件類的第一個(gè)字母必須大寫
var HelloMessage = React.createClass({
  //所有組件類都必須有自己的 render 方法,用于輸出組件昼捍。
  render: function() {
    // 注意:組件類只能包含一個(gè)頂層標(biāo)簽识虚,否則也會(huì)報(bào)錯(cuò)。
    return <h1>Hello World妒茬!</h1>;
  }
});
// ReactDOM.render 是 React 的最基本方法担锤,用于將模板轉(zhuǎn)為 HTML 語言,并插入指定的 DOM 節(jié)點(diǎn)乍钻。
ReactDOM.render(
  //模板插入 <HelloMessage /> 時(shí)肛循,會(huì)自動(dòng)生成 HelloMessage 的一個(gè)實(shí)例
  <HelloMessage />,
  document.getElementById('example')
);

代碼解析

React.createClass 方法用于生成一個(gè)組件類 HelloMessage。

<code><HelloMessage /> </code>實(shí)例組件類并輸出信息银择。

注意:們我這里用大寫字母開頭育拨,以區(qū)別組件與html元素

復(fù)合組件

我們可以通過創(chuàng)建多個(gè)組件來合成一個(gè)組件,即把組件的不同功能點(diǎn)進(jìn)行分離欢摄。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>React 實(shí)例</title>
    <script src="react.min.js"></script>
    <script src="react-dom.min.js"></script>
    <script src="browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
   var WebSite = React.createClass({
      render: function() {
        return (
          <div>
            {/*獲取React.render上的屬性 */}
            <Name nameComponent={this.props.name} />
            <Link siteComponent={this.props.site} />
          </div>
        );
      }
    });

    var Name = React.createClass({
      render: function() {
        return (
          <!-- 組件的屬性可以在組件類的this.props 對(duì)象上獲取 -->
          <h1>{this.props.nameComponent}</h1>
        );
      }
    });

    var Link = React.createClass({
      render: function() {
        return (
          <a href={this.props.site}>
            {this.props.siteComponent}
          </a>
        );
      }
    });
    
    React.render(
      <WebSite name="學(xué)哥" site=" http://www.xuege.com" />,
      document.getElementById('example')
    );
    </script>
  </body>
</html>

實(shí)例中 WebSite 組件使用了 Name 和 Link 組件來輸出對(duì)應(yīng)的信息熬丧,也就是說 WebSite 擁有 Name 和 Link 的實(shí)例。

組件中的React State(狀態(tài))

React 把組件看成是一個(gè)狀態(tài)機(jī)(State Machines)怀挠。通過與用戶的交互析蝴,實(shí)現(xiàn)不同狀態(tài),然后渲染 UI绿淋,讓用戶界面和數(shù)據(jù)保持一致闷畸。

React 里,只需更新組件的 state吞滞,然后根據(jù)新的 state 重新渲染用戶界面(不要操作 DOM)佑菩。

以下實(shí)例中創(chuàng)建了 LikeButton 組件,getInitialState 方法用于定義初始狀態(tài)裁赠,也就是一個(gè)對(duì)象殿漠,這個(gè)對(duì)象可以通過 this.state 屬性讀取。當(dāng)用戶點(diǎn)擊組件佩捞,導(dǎo)致狀態(tài)變化绞幌,this.setState 方法就修改狀態(tài)值,每次修改以后一忱,自動(dòng)調(diào)用 this.render 方法莲蜘,再次渲染組件谭确。

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>菜鳥教程 React 實(shí)例</title>
    <script src="react.min.js"></script>
    <script src="react-dom.min.js"></script>
    <script src="browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
      //創(chuàng)建LikeButton組件
      var LikeButton = React.createClass({
        //初始化狀態(tài)
        getInitialState: function() {
          return {liked: false};
        },
        //設(shè)置點(diǎn)擊事件的函數(shù),用來切換狀態(tài)
        handleClick: function() {
          this.setState({liked: !this.state.liked});
        },
        //render函數(shù)用于輸出組件
        render: function() {
          var text = this.state.liked ? '喜歡' : '不喜歡';
          return (
            <p onClick={this.handleClick}>
              你<b>{text}</b>我票渠。點(diǎn)我切換狀態(tài)逐哈。
            </p>
          );
        }
      });
      
      //ReactDOM.render 是 React 的最基本方法,用于將模板轉(zhuǎn)為 HTML 語言问顷,并插入指定的 DOM 節(jié)點(diǎn)鞠眉。
      React.render(
        <LikeButton />,
        document.getElementById('example')
      );
    </script>
  </body>
</html>

組件中的this.props 對(duì)象

state 和 props 主要的區(qū)別在于 props 是不可變的,而 state 可以根據(jù)與用戶交互來改變择诈。這就是為什么有些容器組件需要定義 state 來更新和修改數(shù)據(jù)械蹋。 而子組件只能通過 props 來傳遞數(shù)據(jù)。

組件中的this.props 對(duì)象組件傳遞參數(shù)

var HelloMessage = React.createClass({
  render: function() {
    return <h1>Hello {this.props.name}</h1>;
  }
});

ReactDOM.render(
  <HelloMessage name="xuege" />,
  document.getElementById('example')
);

默認(rèn) Props

var HelloMessage = React.createClass({
  getDefaultProps: function() {
    return {
      name: 'xuege'
    };
  },
  render: function() {
    return <h1>Hello {this.props.name}</h1>;
  }
});

ReactDOM.render(
  <HelloMessage />,
  document.getElementById('example')
);

props與state對(duì)比Demo

<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>菜鳥教程 React 實(shí)例</title>
    <script src="react.min.js"></script>
    <script src="react-dom.min.js"></script>
    <script src="browser.min.js"></script>
  </head>
  <body>
    <div id="example"></div>
    <script type="text/babel">
    var WebSite = React.createClass({
      getInitialState: function() {
        return {
          name: "學(xué)哥",
          site: "http://www.xuege.com"
        };
      },
     
      render: function() {
        return (
          <div>
            {/*這里要使用初始化的數(shù)據(jù)羞芍,所以不能使用props屬性 */}
            <Name nameComponent={this.state.name} />
            <Link siteComponent={this.state.site} />
          </div>
        );
      }
    });

    var Name = React.createClass({
      render: function() {
        return (
          //子組件中使用props屬性獲取父組件中的state獲取到的數(shù)據(jù)
          <h1>{this.props.nameComponent}</h1>
        );
      }
    });

    var Link = React.createClass({
      render: function() {
        return (
          <a href={this.props.site}>
            {this.props.siteComponent}
          </a>
        );
      }
    });

    React.render(
      <WebSite />,
      document.getElementById('example')
    );
    </script>
  </body>
</html>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末哗戈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荷科,更是在濱河造成了極大的恐慌唯咬,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畏浆,死亡現(xiàn)場離奇詭異胆胰,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)刻获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門蜀涨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝎毡,你說我怎么就攤上這事厚柳。” “怎么了沐兵?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵别垮,是天一觀的道長。 經(jīng)常有香客問我扎谎,道長碳想,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任毁靶,我火速辦了婚禮胧奔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘老充。我一直安慰自己葡盗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布啡浊。 她就那樣靜靜地躺著觅够,像睡著了一般。 火紅的嫁衣襯著肌膚如雪巷嚣。 梳的紋絲不亂的頭發(fā)上喘先,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音廷粒,去河邊找鬼窘拯。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坝茎,可吹牛的內(nèi)容都是我干的涤姊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼嗤放,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼思喊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起次酌,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤酗钞,失蹤者是張志新(化名)和其女友劉穎娇澎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骇扇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窖维。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啦吧。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖璃搜,靈堂內(nèi)的尸體忽然破棺而出文兑,到底是詐尸還是另有隱情,我是刑警寧澤腺劣,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布绿贞,位于F島的核電站,受9級(jí)特大地震影響橘原,放射性物質(zhì)發(fā)生泄漏籍铁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一趾断、第九天 我趴在偏房一處隱蔽的房頂上張望拒名。 院中可真熱鬧,春花似錦芋酌、人聲如沸增显。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽同云。三九已至糖权,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間炸站,已是汗流浹背星澳。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留旱易,地道東北人禁偎。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像阀坏,于是被迫代替她去往敵國和親如暖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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

  • React Native是基于React的忌堂,在開發(fā)React Native過程中少不了的需要用到React方面的知...
    亓凡閱讀 1,466評(píng)論 1 4
  • 現(xiàn)在最熱門的前端框架盒至,毫無疑問是 React 。上周浸船,基于 React 的 React Native 發(fā)布妄迁,結(jié)果一...
    sakura_L閱讀 428評(píng)論 0 0
  • JSX 知識(shí)準(zhǔn)備 JSX 并不是一門全新的語言,僅僅是一個(gè)語法糖李命,允許開發(fā)者在javascript中編寫XML語言...
    艾倫先生閱讀 4,504評(píng)論 4 20
  • 用匠心做菜登淘,滿足味蕾的同時(shí)滿足與精神。讓老百姓花最少的錢封字,品嘗最好的美食黔州,是小食後一直的追求?? 三得支付,一倍??...
    小食後大掌柜閱讀 296評(píng)論 0 0
  • 有忍不住的眼淚,一股一股冒出來笆制。 也好绅这,總算踏實(shí)了。 也說不清那眼淚在辆,是傷心呢证薇,還是安心。 很久很久了匆篓,久到剛剛認(rèn)...
    我是張望好時(shí)光閱讀 217評(píng)論 0 1