我从哪里来,要到那里去:一个React组件的前世今生

1、什么是React?

React 是一个用于构建用户界面的 JAVASCRIPT 库。

React主要用于构建UI,很多人认为 React 是 MVC 中的 V(视图)。

React 起源于 Facebook 的内部项目,用来架设 Instagram 的网站,并于 2013 年 5 月开源。

React 拥有较高的性能,代码逻辑非常简单,越来越多的人已开始关注和使用它。

2、React有哪些关键知识点?

网上有不少好教材,这里就不在做原理性的讲解,重点讲一下任何动手,“知道”没有意义,“做到”才有产生价值。

2.1、熟悉JSX语法

http://www.runoob.com/react/react-jsx.html

2.2、了解React组件的生命周期

http://www.runoob.com/react/react-component-life-cycle.html

2.3、了解React的数据组织方式

http://www.runoob.com/react/react-state.html

http://www.runoob.com/react/react-props.html

2、学习React的最好方法

动手

3、动手的最快方式

直接使用antd pro,环境搭建参考文章:https://www.jianshu.com/p/9a9acc4411ba?from=groupmessage&isappinstalled=0

4、教学示例

4.1、创建一个React组件ShopMgr

在src/pages目录下面新建文件ShopMgr.js,内容如下

import React, { PureComponent } from 'react';
export default class ShopMgr extends PureComponent {
  render() {
    return (
      <div>你好,我是一个React组件</div>
    );
  }
}

4.2、将ShopMgr挂载到页面上

修改config/router.config.js,查找/dashboard/analysis,找到下面的代码段

{
  path: '/dashboard/analysis',
  name: 'analysis',
  component: './Dashboard/Analysis',
}

将其修改为:

{
  path: '/dashboard/analysis',
  name: 'analysis',
  component: './ShopMgr',
}

4.2、启动项目

$ npm start

在浏览器上输入http://127.0.0.1:8000/dashboard/analysis,你将会看到下面的页面:

React组件

4.3、练习对内部数据state的操作

  • 初始化容器:

    state = { count: 0 };
    
  • 获取中的数据:

    let { count } = this.state;
    
  • 修改容器中的数据:

    this.setState({ count });
    

我们做一个计数器,作为练习工具:修改ShopMgr,为其增加一个显示器,两个按钮,分别进行加一减一操作

React组件2
import React, { Component } from 'react';
import { Alert, Button, Divider } from 'antd';

export default class ShopMgr extends Component {
  /**
   *  初始化内部数据容器,里面放上一个计数器count,初始值为0
   * @type {{count: number}}
   */
  state = { count: 0 };

  /**
   * 对计数器进行加一
   */
  add = () => {
    // 从内部容器中,获取计数器的值,count
    let { count } = this.state;
    // 计数器加一后,再将其放回容器,此时React会检测到容器中数据的变化,会自动刷新界面
    count += 1;
    this.setState({ count });
  };

  /**
   * 对计数器进行减一
   */
  sub = () => {
    // 从内部容器中,获取计数器的值,count
    let { count } = this.state;
    // 计数器减一后,再将其放回容器,此时React会检测到容器中数据的变化,会自动刷新界面
    count -= 1;
    this.setState({ count });
  };

  render() {
    // 从内部容器中,获取计数器的值,count
    const { count } = this.state;
    return (
      <div>
        {/* 显示计数器的值 */}
        <Alert message={count} type="success" style={{ marginBottom: 20 }}/>
        {/* 将上面定义的add和sub函数,设置到相关的按钮点击事件上 */}
        <div>
          <Button type="primary" onClick={this.add}>+1</Button>
          <Divider type="vertical"/>
          <Button type="primary" onClick={this.sub}>-1</Button>
        </div>
      </div>
    );
  }
}

4.4、练习对外部数据的操作

我们修改上面的例子,增加一个奇数判断器,作为计数器的子组件,计数器的内部count作为奇数判断器的外部数据。

  • 获取外部数据

    const { count } = this.props;
    
React组件3
import React, { Component } from 'react';
import { Alert, Button, Divider } from 'antd';

class IsOddNum extends Component {
  render() {
    const { count } = this.props;
    let tips = `${count}是奇数`;
    if (count % 2 === 0) {
      tips = `${count}是偶数`;
    }
    return (
      <Alert message={tips} type="info" style={{ marginBottom: 20 }}/>
    );
  }
}

export default class ShopMgr extends PureComponent {
  /**
   *  初始化内部数据容器,里面放上一个计数器count,初始值为0
   * @type {{count: number}}
   */
  state = { count: 0 };

  /**
   * 对计数器进行加一
   */
  add = () => {
    // 从内部容器中,获取计数器的值,count
    let { count } = this.state;
    // 计数器加一后,再将其放回容器,此时React会检测到容器中数据的变化,会自动刷新界面
    count += 1;
    this.setState({ count });
  };

  /**
   * 对计数器进行减一
   */
  sub = () => {
    // 从内部容器中,获取计数器的值,count
    let { count } = this.state;
    // 计数器减一后,再将其放回容器,此时React会检测到容器中数据的变化,会自动刷新界面
    count -= 1;
    this.setState({ count });
  };

  render() {
    // 从内部容器中,获取计数器的值,count
    const { count } = this.state;
    return (
      <div>
        {/* 显示计数器的值 */}
        <Alert message={count} type="success" style={{ marginBottom: 20 }}/>
        {/* 将上面定义的add和sub函数,设置到相关的按钮点击事件上 */}
        <div style={{ marginBottom: 20 }}>
          <Button type="primary" onClick={this.add}>+1</Button>
          <Divider type="vertical"/>
          <Button type="primary" onClick={this.sub}>-1</Button>
        </div>

        {/* 挂载子组件,将count传入其中 */}
        <IsOddNum count={count}/>
      </div>
    );
  }
}

4.4、跟踪组件的生命周期

观察IsOddNum的打印即可

import React, { Component } from 'react';
import { Alert, Button, Divider } from 'antd';

class IsOddNum extends Component {
  componentWillMount() {
    console.log('IsOddNum::componentWillMount');
  }

  componentDidMount() {
    console.log('componentDidMount ');
  }

  componentWillReceiveProps(nextPropx) {
    console.log('IsOddNum::componentWillReceiveProps ');
  }

  shouldComponentUpdate() {
    console.log('IsOddNum::shouldComponentUpdate');
    return true;
  }

  componentDidUpdate() {
    console.log('IsOddNum::componentDidUpdate');
  }

  componentWillUnmount() {
    console.log('IsOddNum::componentWillUnmount');
  }

  render() {
    const { count } = this.props;
    let tips = `${count}是奇数`;
    if (count % 2 === 0) {
      tips = `${count}是偶数`;
    }
    return (
      <Alert message={tips} type="info" style={{ marginBottom: 20 }}/>
    );
  }
}

export default class ShopMgr extends Component {
  /**
   *  初始化内部数据容器,里面放上一个计数器count,初始值为0
   * @type {{count: number}}
   */
  state = { count: 0 };

  /**
   * 对计数器进行加一
   */
  add = () => {
    // 从内部容器中,获取计数器的值,count
    let { count } = this.state;
    // 计数器加一后,再将其放回容器,此时React会检测到容器中数据的变化,会自动刷新界面
    count += 1;
    this.setState({ count });
  };

  /**
   * 对计数器进行减一
   */
  sub = () => {
    // 从内部容器中,获取计数器的值,count
    let { count } = this.state;
    // 计数器减一后,再将其放回容器,此时React会检测到容器中数据的变化,会自动刷新界面
    count -= 1;
    this.setState({ count });
  };

  render() {
    // 从内部容器中,获取计数器的值,count
    const { count } = this.state;
    return (
      <div>
        {/* 显示计数器的值 */}
        <Alert message={count} type="success" style={{ marginBottom: 20 }}/>
        {/* 将上面定义的add和sub函数,设置到相关的按钮点击事件上 */}
        <div style={{ marginBottom: 20 }}>
          <Button type="primary" onClick={this.add}>+1</Button>
          <Divider type="vertical"/>
          <Button type="primary" onClick={this.sub}>-1</Button>
        </div>

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

推荐阅读更多精彩内容

  • 作为一个合格的开发者,不要只满足于编写了可以运行的代码。而要了解代码背后的工作原理;不要只满足于自己的程序...
    六个周阅读 8,433评论 1 33
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,907评论 25 707
  • iOS在开发中,系统的UIDatePickerView没有提供只可以选择年、月的类型,需要使用UIPickerVi...
    ONE2阅读 533评论 0 0
  • 今天和妈妈一起把我们之前走过的淮海路又走了一遍。 我和你去淮海路散步的时候,还没有出冬季。那天晚上,还有点冷。我清...
    顾墨璃阅读 287评论 0 0
  • 从觉察到觉醒 1、观照你的身体 觉察的第一步就是观照你的身体。慢慢地,你能够对自己的每一个姿势、动作有所警觉,随着...
    阿宝阳光阅读 476评论 0 1