美文网首页程序员
我从哪里来,要到那里去:一个React组件的前世今生

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

作者: 一码一故事 | 来源:发表于2018-10-12 23:13 被阅读0次

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

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/qeenaftx.html