React基礎(chǔ)教程實(shí)例代碼

一樓給敬佩的阮老師

React實(shí)例教程地址

引入原則:

<head>
  <script src='../build/react.js></script>
  <script src='../build/react-dom.js></script>
  <script src='../build/browser.min.js></script>
</head>

body區(qū)域

<div id='example'></div>
<script type='text/bable'>
  //**our codes goes here!
</script>

實(shí)際上線用babel進(jìn)行轉(zhuǎn)換

bable src --out-dir build

ReactDOM.render()

示例:

ReactDOM.render(
   <h1>hello world!</h1>,
   document.getElementById('example');
)

JSX語法

var names =['Alice','Emily','Kate'];

ReactDOM.render(
  <div>
  {
     names.map(function(name){
        return <div>Hello,{name}!</div>
    })
  }
  </div>,
  document.getElementById('example')
);

JSX允許在模板中直接插入JavaScript變量

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

組件

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

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

ReactDOM.render(
  <HelloMessage name='john' />,
  document.getElementById('example')
);
  • 組件的第一個(gè)字母必須大寫
  • 組件只能包含一個(gè)頂層標(biāo)簽
  • class屬性需要寫成className

this.props.children

this.props.children 表示組件所有的子節(jié)點(diǎn)

var NoteList = React.createClass({
   render:function(){
     return(
       <ol>
       {
          React.Children.map(this.props.children,function(child){
             return <li>{child}</li>
            })
        }
        </ol>
      );
    }
});

ReactDOM.render(
  <NoteList>
    <span>hello</span>
    <span>World</span>
  </NoteList>,
  document.body
);

使用React.Children.map來遍歷子節(jié)點(diǎn)蚪缀,不用擔(dān)心this.props.children的數(shù)據(jù)類型

PropTypes

驗(yàn)證實(shí)例的屬性是否符合要求

var MyTitle = react.createClass({
   propTypes:{
     title:React.PropTypes.string.isRequired,
     },
   render:function(){
      return <h1>{this.props.title}</h1>
     }
});

var data = 123;

ReactDOM.render(
  <MyTitle title={data} />,
  document.body
 );
     

getDefaultProps可以用來設(shè)置組件屬性的默認(rèn)值

getDefaultProps:function(){
   return {
      title: 'Hello World'
      };
  }

獲取真實(shí)的DOM節(jié)點(diǎn)

有時(shí)需要從組件中獲取真實(shí)的DOM節(jié)點(diǎn)慢蜓,需要用到ref屬性碌奉。

var MyComponet = React.CreatClass({
   handleClick:function(){
     this.refs.myTextInput.focus();
   },
   render:function(){
     return (
       <div>
         <input type='text' ref='myTextInput' />
         <input type='button' value ='Focus the text input'
         onClick={this.handleClick} />
        </div>
      );
    }
});

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

指定click事件回調(diào)函數(shù)拒贱,確保DOM真實(shí)渲染后觸發(fā),除此還支持KeyDown等事件

this.state

組件視為狀態(tài)機(jī),用戶互動(dòng),狀態(tài)變化妨猩,重新渲染UI。

var LikeButton = React.CreatClass({
   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 onClicked={this.handleClick}>
              You {text} this. Click to toggle.
           </p>
        );
    }
});

ReactDom.render(
   <LikeButton />,
   document.body
);

this.props表示一旦定義不再更改的屬性秽褒,this.state表示隨用戶互動(dòng)產(chǎn)生變化的特性壶硅。

表單

var Input = React.createClass({
    getInitialState:function(){
        return {value:'Hello!'};
    },
    handleChange:function(event){
        this.setState({value:event.target.value});
    },
    render:function(){
        var value = this.state.value;
        return (
           <div>
              <input type='text' value = {value}  
              onChange = {this.handleChange} />
              <p>{value}</p>
            </div>
        );
    }
});

ReactDOM.render(<Input />,document.body);

這里取得輸入框的值沒有使用this.props.value,選用了event.target.value。

組件的生命周期

  • Mounting: 已插入真實(shí)DOM
  • Updating: 正在被重新渲染
  • Unmounting:已移除真實(shí)DOM
var Hello = React.createClass({
    getInitialState:function()
        return {
           opacity:1.0
        }
    },
    
    compontentDidMount:function(){
         this.timer = setInterval (function() {
            var opacity = this.state.opacity;
            opacity -= .05;
            if(opacity < 0.1){
               opacity = 1.0;
            }
            this.setState({
               opacity:opacity
            });
        }.bind(this),100);
    },
    render: function(){
        return (
          <div style = {{opacity:this.state.opacity}}>
              Hello {{this.props.name}
          </div>
        );
    }
});

ReactDOM.render(
   <Hello name='world' />,
   document.body
);

bind(this)——原生JS寫法销斟。

Ajax

使用compontentDidMount方法設(shè)置Ajax請(qǐng)求

var UserGist = React.createClass({
    getInitialState:function(){
       return {
          username:'',
          lastGistUrl:''
        }
    },
    
    componentDidMount: function(){
        $.get(this.props.source,function(result){
             var lastGist = result[0];
             if(this.isMounted()){
                this.setState({
                   username:lastGist.owner.login,
                   lastGistUrl:lastGist.html_url
                });
            }
        }.bind(this));
    },
    
    render:function(){
        return (
           <div>
              {this.state.username}'s last gist is
              <a href={this.state.lastGistUrl}>here</a>.
           </div>
        );
    }
});

ReactDOM.render(
    <UserGist source = 'http:xx.xxx.com' />,
    document.body
);
    

把其他途徑獲取的對(duì)象傳入組件

ReactDOM.render(
    <RepoList promise = {$.getJSON('http://xx.xxx.com)} />,
    document.body
);

var RepoList = React.createClass({
    getInitialState: function(){
        return { loading:true, error : null , data : null}
    },
    
    componentDidMount(){
        this.props.promise.then(
            value => this.setState({loading:false,data:value}),
            error => this.setState({loading:false,error:error}));
    },
    
    render:function(){
        if(this.state.loading){
           return <span>Loading…</span>
        }
        else if(this.state.error !== null){
           return <span>Error: {this.state.error.message}</span>;
        }
        else{
           var repos = this.state.data.items;
           var reposList = repos.map(function(repo){
               return (
                  <li>
                     <a href={repo.html}>{repo.name}</a>
                  </li>
                );
            });
            return (
                <main>
                   <h1>Most Popular JavaScript Projects in Github</h1>
                   <ol>
                      {repoList}
                   </ol>
                </main>
            );
        }
    }
});
                    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末森瘪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子票堵,更是在濱河造成了極大的恐慌,老刑警劉巖逮栅,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悴势,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡措伐,警方通過查閱死者的電腦和手機(jī)特纤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侥加,“玉大人捧存,你說我怎么就攤上這事〉0埽” “怎么了昔穴?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長提前。 經(jīng)常有香客問我吗货,道長,這世上最難降的妖魔是什么狈网? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任宙搬,我火速辦了婚禮,結(jié)果婚禮上拓哺,老公的妹妹穿的比我還像新娘勇垛。我一直安慰自己,他們只是感情好士鸥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布闲孤。 她就那樣靜靜地躺著,像睡著了一般烤礁。 火紅的嫁衣襯著肌膚如雪崭放。 梳的紋絲不亂的頭發(fā)上哨苛,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音币砂,去河邊找鬼建峭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛决摧,可吹牛的內(nèi)容都是我干的亿蒸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼掌桩,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼边锁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起波岛,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤茅坛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后则拷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贡蓖,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年煌茬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斥铺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坛善,死狀恐怖晾蜘,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情眠屎,我是刑警寧澤剔交,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站改衩,受9級(jí)特大地震影響省容,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜燎字,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一腥椒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧候衍,春花似錦笼蛛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春惋戏,著一層夾襖步出監(jiān)牢的瞬間领追,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工响逢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绒窑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓舔亭,卻偏偏與公主長得像些膨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钦铺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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

  • 按照慣例订雾,先給ReactJS背書 React是一個(gè)Facebook開發(fā)的UI庫,于2013年5月開源矛洞,并迅速的從最...
    艾倫先生閱讀 3,234評(píng)論 1 12
  • 本筆記基于React官方文檔洼哎,當(dāng)前React版本號(hào)為15.4.0。 1. 安裝 1.1 嘗試 開始之前可以先去co...
    Awey閱讀 7,705評(píng)論 14 128
  • 作者:阮一峰原文地址:http://www.ruanyifeng.com/blog/2015/03/react.h...
    IT程序獅閱讀 1,094評(píng)論 0 16
  • 現(xiàn)在最熱門的前端框架沼本,毫無疑問是React噩峦。在基于React的React Native發(fā)布一天之內(nèi),就獲得了 50...
    Mycro閱讀 1,013評(píng)論 3 6
  • 原教程內(nèi)容詳見精益 React 學(xué)習(xí)指南擅威,這只是我在學(xué)習(xí)過程中的一些閱讀筆記,個(gè)人覺得該教程講解深入淺出冈钦,比目前大...
    leonaxiong閱讀 2,834評(píng)論 1 18