React基础(一)

NO.1 ReactDom.render

ReactDom.render是React最基本的用法,用于将模板转化为HTML语言,并插入指定的DOM节点。

ReactDom.render(
  <Name />,
  document.getElementById('app')
  );

上面代码的含义是将Name这个组件插入ID为app的元素中。

NO.2 JSX语法

将HTML语言直接写入带JS语言之中,这就是JSX语法

var names = ['Alice', 'Emily', 'Kate'];
ReactDOM.render(
  <div>
  {
    names.map(function (name) {
      return <div>Hello, {name}!</div>
    })
  }
  </div>,
  document.getElementById('example')
);

JSX的语法规则是如果遇到HTML的标签,就用HTML的规则解析,如果遇到代码块,就用JS的规则解析。

JSX允许直接在模板中插入JS变量,如果变量是一个数组,则会展开这个数组的所有成员查看

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

NO.3 组件(component)

新建一个name.js,把他封装成为一个组件,内容如下:

'use strict';
import React from "react";
class Name extends React.Component {
render () {
  return (
    <div>
      hello~
    </div>
    );
  }
}
export { Name as default };

Name就是一个组件类,模板插入<Name />,会自动生成Name的一个实例,有三点必须注意:
1.所有组件中必须有自己的render方法,用于输出组件;
2.组件类的第一个字母必须大写,否则会报错;
3.组件只能包含一个顶层标签,否则会报错;例如,如果将return里面的内容改成:

  return (
    <div>
      hello~
    </div>
    <div>
      youngi~
    </div>
    );

然后webpack会返回报错信息:
Adjacent JSX elements must be wrapped in an enclosing tag (11:4)

组件的用法和原生的HTML的用法一致,可以加入任意属性,比如<Name name="youngi"/>,有一点值得注意的是,class和for这两个属性应该写为className和htmlFor

ReactDom.render(
  <Name name="youngi" />,
  document.getElementById('app')
  );

那么在组件中,想要获取这个属性就可以用this.props.name读取:

class Name extends React.Component {
render () {
  return (
    <div>
      hello~<div>{this.props.name}</div>
    </div>
    );
  }
}

NO.4 this.props.children

这个是个特例,这个代表的意思不是去找this.props的children属性,而是去找这个组件的所有子节点

这里需要注意, this.props.children 的值有三种可能:如果当前组件没有子节点,它就是 undefined ;如果有一个子节点,数据类型是 object ;如果有多个子节点,数据类型就是 array 。所以,处理 this.props.children 的时候要小心。

React 提供一个工具方法 React.Children 来处理 this.props.children 。我们可以用 React.Children.map 来遍历子节点,而不用担心 this.props.children 的数据类型是 undefined 还是 object。

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

NO.5 PropTypes

这个属性是组件类的属性,而不是组件的属性,这个PropTypes可以用来验证从组件传来的属性是否合法。例如:

import React from 'react';
import ReactDom from 'react-dom';
import Name from './name';

var name = 123

ReactDom.render(
  <Name name= {name} />,
  document.getElementById('app')
  );

如上代码显示,Name组件的name属性的类型为number类型,而不是字符串,那么在组件类中,对这个属性进行验证:

class Name extends React.Component {
render () {
  return (
    <div>
      hello~<div>{this.props.name}</div>
    </div>
    );
  }
}
Name.propTypes = { name: React.PropTypes.string.isRequired };

进行验证后,验证不通过的话,会在控制台上报错

Invalid prop `name` of type `number` supplied to `Name`, expected `string`.

NO.6 defaultProps 设置组件的默认值

class Name extends React.Component {
render () {
  return (
    <div>
      hello~<div>{this.props.name}</div>
    </div>
    );
  }
}

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

推荐阅读更多精彩内容

  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 8,061评论 2 35
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,833评论 1 18
  • 以下内容是我在学习和研究React时,对React的特性、重点和注意事项的提取、精练和总结,可以做为React特性...
    科研者阅读 8,232评论 2 21
  • GUIDS 第一章 为什么使用React? React 一个提供了用户接口的JavaScript库。 诞生于Fac...
    jplyue阅读 3,532评论 1 11
  • It's a common pattern in React to wrap a component in an ...
    jplyue阅读 3,264评论 0 2