React基础教程实例代码

一楼给敬佩的阮老师

React实例教程地址

引入原则:

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

body区域

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

实际上线用babel进行转换

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用于生成一个组件类

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

ReactDOM.render(
  <HelloMessage name='john' />,
  document.getElementById('example')
);
  • 组件的第一个字母必须大写
  • 组件只能包含一个顶层标签
  • class属性需要写成className

this.props.children

this.props.children 表示组件所有的子节点

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来遍历子节点,不用担心this.props.children的数据类型

PropTypes

验证实例的属性是否符合要求

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可以用来设置组件属性的默认值

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

获取真实的DOM节点

有时需要从组件中获取真实的DOM节点,需要用到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事件回调函数,确保DOM真实渲染后触发,除此还支持KeyDown等事件

this.state

组件视为状态机,用户互动,状态变化,重新渲染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表示随用户互动产生变化的特性。

表单

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: 已插入真实DOM
  • Updating: 正在被重新渲染
  • Unmounting:已移除真实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方法设置Ajax请求

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
);
    

把其他途径获取的对象传入组件

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>
            );
        }
    }
});
                    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 按照惯例,先给ReactJS背书 React是一个Facebook开发的UI库,于2013年5月开源,并迅速的从最...
    艾伦先生阅读 3,226评论 1 12
  • 本笔记基于React官方文档,当前React版本号为15.4.0。 1. 安装 1.1 尝试 开始之前可以先去co...
    Awey阅读 7,663评论 14 128
  • 作者:阮一峰原文地址:http://www.ruanyifeng.com/blog/2015/03/react.h...
    IT程序狮阅读 1,091评论 0 16
  • 现在最热门的前端框架,毫无疑问是React。在基于React的React Native发布一天之内,就获得了 50...
    Mycro阅读 1,009评论 3 6
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,813评论 1 18