[react] - 初识react

react官网:
https://facebook.github.io/react/
内容来源:
http://www.ruanyifeng.com/blog/2015/03/react.html

  • React 可以在浏览器运行,也可以在服务器运行

一、react网页源码(html模板)

<! DOCTYPE html>
<html>
  <head>
    <script src="../build/react.js"></script>
    //React核心库
    <script src="../build/react-dom.js"></script>
    //提供与 DOM 相关的功能
    <script src="../build/browser.min.js"></script>
    //将 JSX 语法转为 JavaScript 语法
     //以上3个必须首先加载
  </head>
  <body>
    <div id="example"></div>
    //type属性为text/babel,因为react有自己的JSX语法,与javascript不兼容。凡使用JSX的地方,都要用 type="text/babel"
    <script type="text/babel">
      // ** 代码开始地方 **
    </script>
  </body>
</html>

二、模板转html语言

ReactDOM.render用于将模板转为 HTML ,并插入d到指定 DOM 节点中。

ReactDOM.render(
        <h1>Hello, react</h1>,
        document.getElementById('example')
      );
有2个参数:
ReactDOM.render(
       模板,
       插入位置
      );

三、JSX语法

  • 1、JSX语法规则:遇到html标签(以<开头)用html语法解析,遇到代码块(以{开头)用js解析
var itnames = ['react','html','css'];
      ReactDOM.render(
       <div>
         {
           itnames.map(function (name) {
             return <p>hello, {name}</p>
           })
         }
       </div>,
       document.getElementById('example')
      );
Paste_Image.png
  • 2、JSX允许直接在模板插入js变量,若变量是一个数组,则会展开显示数组所有元素
var arr = [
        <h1>Hello world!</h1>,
        <h2>React is awesome</h2>,
      ];
      ReactDOM.render(
        <div>{arr}</div>,
        document.getElementById('example')
      );
Paste_Image.png

四、组件

React.createClass()方法:生成一个组件

var HelloMessage = React.createClass({
    render: function () {
       return <h1>hello {this.props.name} {this.props.className}</h1>;
    }
});
ReactDOM.render(
   <HelloMessage name="wy" className="ceshjo"/>,
   document.getElementById('example')
);

注意:

  • 组件类的第一个字母必须大写
  • 组件类只能包含一个顶层标签
  • 组件的属性可以在组件类的 this.props 对象上获取
  • class 属性需写成 className ,for 属性需写成 htmlFor ,因为 class 和 for 是 JavaScript 的保留字。

五、this.props.children

表示组件的所有子节点
返回的值有3种:(注意处理)

  • undefined 组件没有子节点
  • object 组件只有一个子节点
  • array 组件有多个子节点
    React.Children.map 来遍历子节点,就无需考虑上述问题
var NotesList = React.createClass({
        render: function() {
          return (
            <ol>
              {
              /// this.props.children.map(function (child) {
                React.Children.map(this.props.children, function (child) { 
                  return <li>{child}</li>;
                })
              }
            </ol>
          );
        }
      });
      ReactDOM.render(
        <NotesList>
          <span>hello</span>//组件的子节点
          <span>world</span>
        </NotesList>,
        document.getElementById('example')
      );
Paste_Image.png

六、PropTypes

用来验证组件实例的属性是否符合要求

var data = 123;
      var MyTitle = React.createClass({
        propTypes: {
         //title属性是必须的,且它的值必须是字符串
          title: React.PropTypes.string.isRequired,
        },
        render: function() {
          return <h1> {this.props.title} </h1>;
        }
      });
      ReactDOM.render(
        <MyTitle title={data} />,
        document.getElementById('example')
      );

上述代码就会打印出警告

Paste_Image.png

getDefaultProps用来设置组件属性的默认值

var MyTitle = React.createClass({
  getDefaultProps : function () {
    return {
      title : 'Hello World'
    };
  },
  render: function() {
     return <h1> {this.props.title} </h1>;
   }
});
ReactDOM.render(
  <MyTitle />,
  document.body
);

七、获取真实的DOM节点

组件不是真实的DOM节点,而是存在于内存中的一种数据结构,即虚拟DOM。
只有将其插入文档之后,才会成为真实的DOM。
react中,所有DOM的变动都先在虚拟DOM上发生,然后再将实际发生变动的部分反映在真实DOM上。(提高性能)


ref属性:

var MyComponent = React.createClass({
  handleClick: function() {
    //this.refs.[refName]  获取真实的DOM节点
    this.refs.myTextInput.focus();
  },
  render: function() {
    return (
      <div>
        <input type="text" ref="myTextInput" />
        <input type="button" value="输入框获得焦点" onClick={this.handleClick} />
      </div>
    );
  }
});
ReactDOM.render(
  <MyComponent />,
  document.getElementById('example')
);

注意:

  • 必须等到虚拟 DOM 插入文档以后,才能使用这个this.refs.[refName]属性

八、this.state

将组件看成一个状态机,一开始有一个初始状态,然后用户互动导致状态变化,从而触发重新渲染UI

      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}.
              </p>
            );
          }
        });
        ReactDOM.render(
          <LikeButton />,
          document.getElementById('example')
        );
  • getInitialState:定义初始化状态,是一个对象,可以通过this.state读取
  • this.setState:修改状态值,自动调用render再次渲染组件

九、表单

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.getElementById('example'));

定义一个 onChange 事件的回调函数,通过
event.target.value 读取用户输入的值,textarea 元素、select元素、radio元素都属于这种情况

十、组件的生命周期

3个状态

  • 1、Mounting:已插入真实 DOM
  • 2、Updating:正在被重新渲染
  • 3、Unmounting:已移出真实 DOM

每个状态有两种处理函数

  • will 函数在进入状态之前调用
  • did 函数在进入状态之后调用
componentWillMount()
componentDidMount()
componentWillUpdate(object nextProps, object nextState)
componentDidUpdate(object prevProps, object prevState)
componentWillUnmount()
componentWillReceiveProps(object nextProps)
//已加载组件收到新的参数时调用
shouldComponentUpdate(object nextProps, object nextState)
//组件判断是否重新渲染时调用

示例:

var Hello = React.createClass({
        getInitialState: function () {
          return {
            opacity: 1.0
          };
        },
        componentDidMount: 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 (
           // 第一个{}表示这是javascript,第二个{}表示样式对象
            <div style={{opacity: this.state.opacity}}>
              Hello {this.props.name}
            </div>
          );
        }
      });
      ReactDOM.render(
        <Hello name="world"/>,
        document.getElementById('example')
      );

十一、ajax

组件的数据来源,通常是通过 Ajax 请求从服务器获取;
用 componentDidMount 方法设置 Ajax 请求;
等到请求成功,再用 this.setState 方法重新渲染 UI

var UserGist = React.createClass({
  getInitialState: function() {
    return {
      username: '',
      lastGistUrl: ''
    };
  },

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

推荐阅读更多精彩内容

  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,770评论 1 18
  • 现在最热门的前端框架,毫无疑问是 React 。上周,基于 React 的 React Native 发布,结果一...
    sakura_L阅读 397评论 0 0
  • 目前,react组件有三种写法,分别是es5的createClass写法,es6的class写法,以及statel...
    ZoomFunc阅读 1,562评论 0 1
  • React Native是基于React的,在开发React Native过程中少不了的需要用到React方面的知...
    亓凡阅读 1,386评论 1 4
  • 晚饭后,通常爸爸洗碗,妈妈和宝宝会看一会儿电视,如果妈妈做饭时宝宝看了动画片,那么晚饭后的电视时间是妈妈的,妈妈可...
    零途阅读 688评论 0 2