美文网首页
React基础篇(四)之创建组件方式分析

React基础篇(四)之创建组件方式分析

作者: 早起的年轻人 | 来源:发表于2020-02-12 20:25 被阅读0次

    本小将讲述在 React 中,
    1、通过函数 function 方式创建组件并分离成单独的组件实现,然后传递参数给组件使用
    2、通过 关键字 class 来创建组件,并分离成单独的组件实现,然后传递参数给组件使用以及创建私有属性使用

    1 React中创建组件方式一 function

    1.1 创建组件并在浏览器中渲染效果
    //第一步 导入依赖
    //这两个导入进,接收的成员变量名称必须这样写
    
    //用来创建组件、虚拟DOM元素 生命周期
    import React from 'react';
    //所创建好的组件和虚拟DOM放到页面上展示
    import ReactDOM from 'react-dom';
    
    
    //创建组合的第一种方式
    function HelloWorld() {
      //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
      return null;
    }
    
    const rootDiv = <div>
      这里是创建组件的第一种方式
      <hr/>
      <HelloWorld/>
    
    </div>;
    
    //第三步 使用ReactDOM 把虚拟DOM 渲染到页面上
    // 参数一 要渲染的虚拟DOM元素
    // 参数二 指定页面上的容器
    ReactDOM.render(rootDiv, document.getElementById('app'));
    
    

    运行在浏览器中


    在这里插入图片描述

    在这里我们创建了一个 HelloWorld 组件,在组件中返回了null ,所以在浏览器中什么这个组件什么也没有渲染。

    //创建组合的第一种方式
    function HelloWorld() {
      //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
      // return null;
      //在这里必须返回一个合法的 JSX 虚拟 DOM 元素
      return <div>这里是 HelloWorld 组件 </div>
    }
    
    

    然后运行在浏览器中的效果


    在这里插入图片描述
    1.2 为组件传递数据
    //第一步 导入依赖
    //这两个导入进,接收的成员变量名称必须这样写
    
    //用来创建组件、虚拟DOM元素 生命周期
    import React from 'react';
    //所创建好的组件和虚拟DOM放到页面上展示
    import ReactDOM from 'react-dom';
    
    
    //创建组合的第一种方式
    //传入参数
    function HelloWorld(props) {
      //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
      // return null;
      //在这里必须返回一个合法的 JSX 虚拟 DOM 元素
      //在这里需要注意的是 形参 props 的值永远是只读的,不可以重新被赋值
      return <div>这里是 HelloWorld 组件 传入参数 name : {props.name} age :{props.age}</div>;
    }
    
    const people = {
      name: '张三',
      age: 29
    };
    const rootDiv = <div>
      这里是创建组件的第一种方式
      <hr/>
      {/*使用组件并传入参数*/}
      <HelloWorld name={people.name} age={people.age}/>
    
    </div>;
    
    //第三步 使用ReactDOM 把虚拟DOM 渲染到页面上
    // 参数一 要渲染的虚拟DOM元素
    // 参数二 指定页面上的容器
    ReactDOM.render(rootDiv, document.getElementById('app'));
    
    
    在这里插入图片描述

    在传递参数的时候,我们可以注意一下

    const rootDiv = <div>
      这里是创建组件的第一种方式
      <hr/>
      {/*使用组件并传入参数 这里是将所有的属性分别写出来*/}
      <HelloWorld name={people.name} age={people.age}/>
      <hr/>
      {/*使用组件并传入参数 如果属性比较多,不逐一写出来时,可以这样传参数*/}
      {/* ... 个点代表展开 es6语法*/}
      <HelloWorld {...people}/>
    
    </div>;
    
    1.3 将编写的 HelloWorld 组件抽离

    在src目录下创建components 文件夹,创建 HelloWorld.jsx文件

    
    
    
    //创建组合的第一种方式
    //传入参数
    import React from 'react';
    
    function HelloWorld(props) {
      //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
      // return null;
      //在这里必须返回一个合法的 JSX 虚拟 DOM 元素
      //在这里需要注意的是 形参 props 的值永远是只读的,不可以重新被赋值
      return <div>这里是 HelloWorld 组件 传入参数 name : {props.name} age :{props.age}</div>;
    }
    
    
    
    
    //把组件暴露出去
    export default HelloWorld
    

    或者写成

    //创建组合的第一种方式
    //传入参数
    import React from 'react';
    
    export function HelloWorld(props) {
      //在组件中 return 一个null 则表示此组件是空的 什么都不会渲染
      // return null;
      //在这里必须返回一个合法的 JSX 虚拟 DOM 元素
      //在这里需要注意的是 形参 props 的值永远是只读的,不可以重新被赋值
      return <div>这里是 HelloWorld 组件 传入参数 name : {props.name} age :{props.age}</div>;
    }
    
    

    然后在 index.js 中使用的时候导入

    //导入HelloWorld组件
    //默认,如果不做单独配置的话,不能省略 .jsx 后缀名
    import HelloWorld from './components/HelloWorld.jsx'
    

    如果要省略后缀名,需要在webpack.config.js 配置文件中


    在这里插入图片描述

    配置好后重新运行项目,在导入组件时就可以写成

    //导入HelloWorld组件
    //默认,如果不做单独配置的话,不能省略 .jsx 后缀名
    //配置好resolve 后,可以不写.jsx后缀名,程序自动补全
    import HelloWorld from './components/HelloWorld'
    

    然后在这里我们可以使用别名来表示路径

    //导入HelloWorld组件
    //默认,如果不做单独配置的话,不能省略 .jsx 后缀名
    // 这里使用到的@ 表示项目根目录中的 src 这一层
    import HelloWorld from '@/components/HelloWorld.jsx'
    

    这里使用到了 @ 符号,那么在 webpack.config.js 中进行配置


    在这里插入图片描述

    2 React中使用class创建组件方式

    ES6 中 class 关键字是实现面向对象的

    //创建组合的第二种方式
    //传入参数
    import React from 'react';
    
    export default class ClassHelloWorld extends React.Component {
      //在组件中必须有 render函数 用来渲染 DOM结构
      render() {
        return (
            <div>
              这里是使用class关键字创建的组件
            </div>
        );
      }
    }
    
    
    在这里插入图片描述

    然后在index.js中使用时,先导入

    //第一步 导入依赖
    //这两个导入进,接收的成员变量名称必须这样写
    
    //用来创建组件、虚拟DOM元素 生命周期
    import React from 'react';
    //所创建好的组件和虚拟DOM放到页面上展示
    import ReactDOM from 'react-dom';
    //导入HelloWorld组件
    //默认,如果不做单独配置的话,不能省略 .jsx 后缀名
    // 这里使用到的@ 表示项目根目录中的 src 这一层
    import HelloWorld from '@/components/HelloWorld';
    //这里是使用 class 创建的组件
    import ClassHelloWorld from '@/components/ClassHelloWorld';
    //这里j 模拟数据
    const people = {
      name: '张三',
      age: 29
    };
    const rootDiv = <div>
      这里是创建组件的第一种方式
      <hr/>
      {/*使用组件并传入参数 这里是将所有的属性分别写出来*/}
      <HelloWorld name={people.name} age={people.age}/>
      <hr/>
      {/*使用组件并传入参数 如果属性比较多,不逐一写出来时,可以这样传参数*/}
      {/* ... 个点代表展开 es6语法*/}
      <HelloWorld {...people}/>
      <hr/>
      这里是创建组件的第二种方式
      <hr/>
      {/*使用组件*/}
      <ClassHelloWorld/>
    
    
    </div>;
    
    //第三步 使用ReactDOM 把虚拟DOM 渲染到页面上
    // 参数一 要渲染的虚拟DOM元素
    // 参数二 指定页面上的容器
    ReactDOM.render(rootDiv, document.getElementById('app'));
    
    2.2 向 class 方式创建的组件中传入参数
      <ClassHelloWorld {...people}/>
    

    在 ClassHelloWorld 组件中通过 props 关键字使用传入的参数

    //创建组合的第二种方式
    //传入参数
    import React from 'react';
    
    export default class ClassHelloWorld extends React.Component {
      //在组件中必须有 render函数 用来渲染 DOM结构
      render() {
        return (
            <div>
              这里是使用class关键字创建的组件
              <p> 传递的参数 name:{this.props.name} age:{this.props.age}</p>
            </div>
        );
      }
    }
    
    

    浏览器中效果


    在这里插入图片描述

    在 class 组件中,可通过 this.state 来定义使用组件私有属性数据

    //创建组合的第二种方式
    //传入参数
    import React from 'react';
    
    export default class ClassHelloWorld extends React.Component {
    
      //在构建函数中
      //初始化私有数据 
      constructor(){
        super()
        this.state={
          city:"中国山西太原"
        }
      }
      //在组件中必须有 render函数 用来渲染 DOM结构
      render() {
        return (
            <div>
              这里是使用class关键字创建的组件
              {/*这里通过 this.props 来调用外部传递过来的参数*/}
              <p> 传递的参数 name:{this.props.name} age:{this.props.age}</p>
              {/*然后在这里通过 this.state 来调用私有数据*/}
              <p> 这里是组件内的私有属性{this.state.city}</p>
            </div>
        );
      }
    }
    

    3 React中function 与class 两种创建方式的对比

    • 使用class 关键字创建的组件,有自己的私有数据和生命周期,使用function 创建的组件,只有props,没有自己私有数据和生命周期
    • 用 function 创建出来的组件中做 无状态组件,用class关键字创建出来的组件 叫做有状态组件

    4 组件中 props 与state/data 的区别

    4.1 区别一
    • props 中的数据都是外界传递过来的
    • state / data 中的数据 都是组件私有的
    4.2 区别二
    • props 中的数据都是只读的,不能重新赋值
    • state/data 中的数据是可读可写的

    5 列表实例

    //第一步 导入依赖
    //这两个导入进,接收的成员变量名称必须这样写
    
    //用来创建组件、虚拟DOM元素 生命周期
    import React from 'react';
    //所创建好的组件和虚拟DOM放到页面上展示
    import ReactDOM from 'react-dom';
    
    
    //父组件
    class CourseList extends React.Component {
    
      constructor(props) {
        super(props);
        this.state = {
          courseList: [
            {id: 1, userNmae: '张三', courseName: '语文'},
            {id: 2, userNmae: '张三2', courseName: '语文2'},
            {id: 3, userNmae: '张三3', courseName: '语文3'}
          ]
        };
      }
    
      render() {
        return (
            <div>
    
              <h1>课程统计列表</h1>
              {/*这里通过map 来构建*/}
              {this.state.courseList.map(item => <CourseItem {...item}/>)}
    
            </div>
        );
      }
    }
    
    //列表中条目的组件
    
    class CourseItem extends React.Component {
      render() {
        return (
            <div key={this.props.id}>
              <h2>姓名:{this.props.userNmae}</h2>
              <p>课程内容: {this.props.courseName}</p>
            </div>
        );
      }
    }
    
    //第三步 使用ReactDOM 把虚拟DOM 渲染到页面上
    // 参数一 要渲染的虚拟DOM元素
    // 参数二 指定页面上的容器
    ReactDOM.render(<CourseList/>, document.getElementById('app'));
    
    
    在这里插入图片描述

    完毕

    相关文章

      网友评论

          本文标题:React基础篇(四)之创建组件方式分析

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