React入门(一)

React


一. js复习

重新理解javascript(适合快速浏览复习闭包等基础的js知识)。快速复习js特性


二. JSX简介

一种 JavaScript 的语法扩展。 我们推荐在 React 中使用 JSX 来描述用户界面。JSX 乍看起来可能比较像是模版语言,但事实上它完全是在 JavaScript 内部实现的。

const element = (
  <h1>
    Hello, {formatName(user)}!
  </h1>
);
  • 推荐在 JSX 代码的外面扩上一个小括号
  • 在 JSX 当中的表达式要包含在大括号里
  • JSX属性
    • 使用引号来定义以字符串为值的属性:
    • 使用大括号来定义以 JavaScript 表达式为值的属性:
const element = <div tabIndex="0"></div>;
const element = <img src={user.avatarUrl}></img>;
  • JSX嵌套,JSX 标签是闭合式的,那么你需要在结尾处用 />,可以相互嵌套
  • 因为 JSX 的特性更接近 JavaScript 而不是 HTML , 所以 React DOM 使用 camelCase 小驼峰命名 来定义属性的名称,而不是使用 HTML 的属性名称。例如,class 变成了 className,而 tabindex 则对应着 [tabIndex]
  • JSX 防注入攻击,可以放心地在 JSX 当中使用用户输入:
    React DOM 在渲染之前默认会 过滤 所有传入的值。它可以确保你的应用不会被注入攻击。所有的内容在渲染之前都被转换成了字符串。这样可以有效地防止 XSS(跨站脚本) 攻击。
  • JSX 代表 Objects,Babel 转译器会把 JSX 转换成一个名为 React.createElement() 的方法
  • React 元素:它代表所有你在屏幕上看到的东西。React 通过读取这些对象来构建 DOM 并保持数据内容一致。
// 注意: 以下示例是简化过的
const element = {
  type: 'h1',
  props: {
    className: 'greeting',
    children: 'Hello, world'
  }
};

三. 元素渲染

1. react元素

元素是构成 React 应用的最小单位。
元素用来描述你在屏幕上看到的内容,事实上是普通的对象,React DOM 可以确保 浏览器 DOM 的数据内容与 React 元素保持一致。

2. 将元素渲染到 DOM 中

  • 用React 开发应用时一般只会定义一个根节点。但如果你是在一个已有的项目当中引入 React 的话,你可能会需要在不同的部分单独定义 React 根节点。
<div id="root"></div>
  • ReactDOM.render(), 要将React元素渲染到根DOM节点中,我们通过把它们都传递给此方法来将其渲染到页面上:
const element = <h1>Hello, world</h1>;
ReactDOM.render(
  element,
  document.getElementById('root')
);

3. 更新元素渲染

  • React 元素都是immutable 不可变的。当元素被创建之后,你是无法改变其内容或属性的。一个元素就好像是动画里的一帧,它代表应用界面在某一时间点的样子
  • 在实际生产开发中,大多数React应用只会调用一次 ReactDOM.render(), 有状态组件可以实现 DOM 更新方式
  • React 只会更新必要的部分

四. 组件 & Props

1. 函数定义/类定义组件

  • 接收一个单一的“props”对象并返回了一个React元素。我们之所以称这种类型的组件为函数定义组件,是因为从字面上来看,它就是一个JavaScript函数。
function Welcome(props) {
  return <h1>Hello, {props.name}</h1>;
}
  • 也可以使用 ES6 class 来定义一个组件:
class Welcome extends React.Component {
  render() {
    return <h1>Hello, {this.props.name}</h1>;
  }
}

2. 组件渲染

  • React元素除了DOM标签,也可以是用户自定义的组件:
const element = <div />;
const element = <Welcome name="Sara" />;
  • 组件名称必须以大写字母开头。
  • 组件的返回值只能有一个根元素。这也是我们要用一个<div>来包裹所有<Welcome />元素的原因。

3. Props的只读性

  • 所有的React组件必须像纯函数那样使用它们的props。
    上面的这种函数称为“纯函数”,它没有改变它自己的输入值,当传入的值相同时,总是会返回相同的结果。
function sum(a, b) {
  return a + b;
}

五. State & 生命周期

1.将函数转换为类

  • 定义为类的组件有一些特性。局部状态就是如此:一个功能只适用于类
  • 状态与属性十分相似,但是状态是私有的,完全受控于当前组件。
class Clock extends React.Component {
  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.props.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

2. 为一个类添加局部状态

  • 添加一个类构造函数来初始化状态 this.state, 将 date 从属性移动到状态中
class Clock extends React.Component {
  constructor(props) {
    super(props);        //传递 props 到基础构造函数的
    this.state = {date: new Date()};
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}
ReactDOM.render(
  <Clock />,
  document.getElementById('root')
);

3. 将生命周期方法添加到类中

  • 挂载: 每当Clock组件第一次加载到DOM中的时候,我们都想生成定时器,执行 componentDidMount() 钩子
  • 卸载: 每当Clock生成的这个DOM被移除的时候,我们也会想要清除定时器,在 componentWillUnmount()生命周期钩子中卸载
  • 可以在组件类上声明特殊的方法,当组件挂载或卸载时,来运行一些代码,这些方法被称作生命周期钩子。
class Clock extends React.Component {
  constructor(props) {
    super(props);
    this.state = {date: new Date()};
  }

  componentDidMount() {
    this.timerID = setInterval(
      () => this.tick(),        //在 this 中保存定时器ID,如果需要存储不用于视觉输出的东西,则可以手动向类中添加其他字段。
      1000
    );
  }

  componentWillUnmount() {
    clearInterval(this.timerID);  //如果你不在 render() 中使用某些东西,它就不应该在状态中,我们将在 componentWillUnmount()生命周期钩子中卸载计时器:
  }

  tick() {
    this.setState({
      date: new Date()     //实现了每秒钟执行的 tick() 方法,它将使用 this.setState() 来更新组件局部状态
    });
  }

  render() {
    return (
      <div>
        <h1>Hello, world!</h1>
        <h2>It is {this.state.date.toLocaleTimeString()}.</h2>
      </div>
    );
  }
}

ReactDOM.render(
  <Clock />,
  document.getElementById('root')
);
  • 快速回顾一下发生了什么以及调用方法的顺序:
    • 当 <Clock /> 被传递给 ReactDOM.render() 时,React 调用 Clock 组件的构造函数。 由于 Clock 需要显示当前时间,所以使用包含当前时间的对象来初始化 this.state 。 我们稍后会更新此状态。

    • React 然后调用 Clock 组件的 render() 方法。这是 React 了解屏幕上应该显示什么内容,然后 React 更新 DOM 以匹配 Clock 的渲染输出。

    • 当 Clock 的输出插入到 DOM 中时,React 调用 componentDidMount() 生命周期钩子。 在其中,Clock 组件要求浏览器设置一个定时器,每秒钟调用一次 tick()。

    • 浏览器每秒钟调用 tick() 方法。 在其中,Clock 组件通过使用包含当前时间的对象调用 setState() 来调度UI更新。 通过调用 setState() ,React 知道状态已经改变,并再次调用 render() 方法来确定屏幕上应当显示什么。 这一次,render() 方法中的 this.state.date 将不同,所以渲染输出将包含更新的时间,并相应地更新DOM。

    • 一旦Clock组件被从DOM中移除,React会调用componentWillUnmount()这个钩子函数,定时器也就会被清除。

4. 正确地使用状态

关于 setState() 这里有三件事情需要知道
  • 不要直接更新状态
    例如,此代码不会重新渲染组件,应当使用 setState()::
// Wrong
this.state.comment = 'Hello';
// Correct
this.setState({comment: 'Hello'});
  • 状态更新可能是异步的
    React 可以将多个setState() 调用合并成一个调用来提高性能。
    this.props 和 this.state 可能是异步更新的,不应该依靠它们的值来计算下一个状态。
    例如,此代码可能无法更新计数器:
// Wrong
this.setState({
  counter: this.state.counter + this.props.increment,
});

应使用第二种形式的 setState() 来接受一个函数而不是一个对象。 该函数将接收先前的状态作为第一个参数,将此次更新被应用时的props做为第二个参数

// Correct
this.setState((prevState, props) => ({
  counter: prevState.counter + props.increment
}));
// Correct
this.setState(function(prevState, props) {
  return {
    counter: prevState.counter + props.increment
  };
});
  • 状态更新合并
    调用 setState() 时,React 将你提供的对象合并到当前状态

5. 数据自顶向下流动

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

推荐阅读更多精彩内容

  • HTML模版 之后出现的React代码嵌套入模版中。 1. Hello world 这段代码将一个一级标题插入到指...
    ryanho84阅读 6,204评论 0 9
  • 本笔记基于React官方文档,当前React版本号为15.4.0。 1. 安装 1.1 尝试 开始之前可以先去co...
    Awey阅读 7,619评论 14 128
  • —— 基础知识、JSX介绍、React 元素、组件和属性、状态和生命周期 此文档来自 React 官方文档,在英文...
    thelastcookies阅读 468评论 0 1
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 2,805评论 1 18
  • Too cool to spend my time hangin' round the school You kn...
    小清新王子阅读 170评论 0 0