百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

React各组件用法(react组件定义)

zzlvtu 2024-09-04 23:01 9 浏览

1、React简介

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

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

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

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

2、React的写法

简单示例

  1. render方法注意点
    - 多次渲染, 后渲染会覆盖先渲染
    - render方法一次只能渲染一个元素/组件
  2. createElement方法注意点
    - 可以添加3个以上参数, 后续参数都会作为当前创建元素内容处理
  3. 如何给元素添加监听?
    - 给元素添加监听的本质就是给元素添加属性
    所以可以在createElement()的第二个参数中添加
    - <button
    onclick="btnClick">按钮</button>
    - React.createElement(‘button’, {onClick: btnClick}, ‘按钮’);
    注意事项:
    如果想给元素绑定事件, 那么事件名称必须是驼峰命名
<body>
    <div id="app"></div>
</body>
<script>
    let name = '老王';
    let oDiv = React.createElement('div', null, name)
    let oBtn = React.createElement('button', null, '点击')
        //点击事件2个元素都会触发
    let root = React.createElement('div', {
        onClick: fn
    }, oDiv, oBtn)
    ReactDOM.render(root, document.querySelector('#app'), () => {
        console.log('全部渲染');
    })
    function fn() {
        console.log('打印了');
    }
</script>

3、JSX写法

3.1、通过createElement创建元素存在的问题?

- 如果结构比较简单还好, 但是如果结构比较复杂, 就比较难以下手

所以大牛们就发明了JSX, 专门用来编写React中的页面结构体

3.2、什么是JSX?

- JSX === JavaScript + X === (XML) === (eXtension)

- JSX 是一个看起来很像 XML 的 JavaScript 语法扩展

3.3、为什么要使用JSX?

- 使用JSX使得我们在React中编写页面结构更为简单、灵活

- JSX 是类型安全的,在编译过程中就能发现错误

- JSX 执行更快,因为它在编译为 JavaScript 代码后进行了优化

- 防止XSS注入攻击

3.4、JSX本质?

- 浏览器只认识JS不认识JSX, 所以我们编写的JSX代码是无法在浏览器中执行的

- 为了解决这个问题, 我们需要借助babel将JSX转换成JS, 也就是转换成React.createElement();

3.5、如何在项目中将JSX转换成JS?

- 导入babel.js

- 在script标签上添加type=”text/babel”

<script src="./react17/react.development.v17.js"></script>
 <script src="./react17/react-dom.development.v17.js"></script>
 <script src="./react17/babel.min.js"></script>
<body>
    <div id="app"></div>
</body>
<script type="text/babel">
    let name = "老王";
    let myRoot = (
      <div>
        <div>{name}</div>
        <button onClick={fn}>点击</button>
      </div>
    );
    ReactDOM.render(myRoot, document.querySelector("#app"), () => {
      console.log("创建成功");
    });
    function fn() {
      console.log("输出");
    }
  </script>

4、函数组件

4.1、在React中如何定义组件?

  • 在React中创建组件有两种方式
  • 第一种: 通过ES6之前的构造函数来定义(无状态组件)
  • 第二种: 通过ES6开始的class来定义(有状态组件)

4.2、如何通过ES5的构造函数来定义组件

- 在构造函数中返回组件的结构即可

<script type="text/babel">
    let name = "老王";
    function Wang() {//通过构造函数来创建组件
      return (
        <div>
          <div>{name}</div>
          <button onClick={fn}>点击</button>
        </div>
      );
    }
    ReactDOM.render(<Wang />, document.querySelector("#app"), () => {
      console.log("创建成功");
    });
    function fn() {
      console.log("按钮");
    }
  </script>

5、类组件

如何通过ES6的class来定义组件

- 定义一个类, 在这个类中实现render方法, 在render方法中返回组件的结构即可

<script type="text/babel">
    let name = "老王";
    class Wang extends React.Component {//通过class来创建组件
      render() {
        return (
          <div>
            <div>{name}</div>
            <button onClick={fn}>点击</button>
          </div>
        );
      }
    }
    ReactDOM.render(<Wang />, document.querySelector("#app"), () => {
      console.log("创建成功");
    });
    function fn() {
      console.log("点击了");
    }
  </script>

6、有状态组件和无状态组件的区别

6.1、有状态组件和无状态组件?

- 首先需要明确的是, 组件中的状态(state)指的其实就是数据

+ 有状态组件指的就是有自己数据的组件(逻辑组件)

+ 无状态组件指的就是没有自己数据的组件(展示组件)

6.2、如何定义自己的状态?

- 凡是继承于React.Component的组件, 默认都会从父类继承过来一个state属性

这个state属性就是专门用来保存当前数据的

- 所以但凡是继承于React.Component的组件, 都是有状态组件

- 所以但凡不是继承于React.Component的组件, 都是无状态组件

- 所以类组件就是有状态组件

- 所以函数组件就是无状态组件

<script type="text/babel">
    let name = "老王";
    // function WANG(){
    //     return(
    //         <div>
    //         <div>{state + name}</div>
    //         {
    //             //会返回state is not defined
    //         }
    //         <button onClick={fn}>点击</button>
    //       </div>
    //     )
    // }
    // ReactDOM.render(<WANG />, document.querySelector("#app"), () => {
    //   console.log("创建成功");
    // });
    class Wang extends React.Component {
      render() {
        return (
          <div>
            <div>{this.state + name}</div>
            {
                //视图会显示出null老王,代表确实有state,但是现在值为null
            }
            <button onClick={fn}>点击</button>
          </div>
        );
      }
    }
    ReactDOM.render(<Wang />, document.querySelector("#app"), () => {
      console.log("创建成功");
    });
    function fn() {
      console.log("点击了");
    }
  </script>

7、setState的用法

state属性注意点

- 永远不要直接修改state

- 直接修改state并不会触发界面更新

- 只有使用setState方法修改state才会触发界面更新

 <script type="text/babel">
    class Wang extends React.Component {
      constructor() {
        super();
        this.state = {
          name: "老王",
          age: 18, //类似于vue中data,用于存放静态数据的
        };
      }
      render() {
        return (
          <div>
            <div>姓名{this.state.name}</div>
            <div>年龄{this.state.age}</div>
            <button onClick={()=>this.fn(this.state.age)}>点击</button>
          </div>
        );
      }
      fn = (val) => {
        // this.state.age=20
        console.log('原生的值',val);
        // console.log('修改的值',this.state.age);//state中值确实被修改,但是视图不会被改变
        this.setState({
            age:21
        })
        setTimeout(()=>{//需要通过异步的方式才能获取到新值,因为setState常规情况是异步的
            console.log(this.state.age);
        },200)
    };
    }
    ReactDOM.render(<Wang />, document.querySelector("#app"), () => {
      console.log("创建成功");
    });
  </script>

8、this指向

8.1、this指向问题

- 在ES6之前, 方法中的this谁调用就是谁,

并且还可以通过call/apply/bind方法修改this

- 从ES6开始, 新增了箭头函数, 箭头函数没有自己的this,

箭头函数中的this是函数外最近的那个this

并且由于箭头函数没有自己的this, 所以不能通过call/apply/bind方法修改this

8.2、监听事件中的this

- React内部在调用监听方法的时候, 默认会通过apply方法将监听方法的this修改为了undefined

所以在监听方法中无法通过this拿到当前组件的state. (undefined.state)

- 如果想在监听方法中拿到当前组件的state, 那么就必须保证监听方法中的this就是当前实例

所以我们可以借助箭头函数的特性, 让React无法修改监听方法中的this, 让监听方法中的this就是当前实例

<script type="text/babel">
    class Wang extends React.Component {
      constructor() {
        super();
        this.state = {
          name: "老王",
          age: 18, //类似于vue中data,用于存放静态数据的
        };
      }
      render() {
        return (
          <div>
            <div>{this.state.name}</div>
            <button onClick={()=>{this.fn(this.state.age)}}>点击</button>
          </div>
        );
      }
      fn = (val) => {
        //相当于用变量接收一个匿名的箭头函数
        console.log("点击了",val);
      };
    }
    ReactDOM.render(<Wang />, document.querySelector("#app"), () => {
      console.log("创建成功");
    });
  </script>

8.3、测试:

import React from 'react';
const STR = '被调用,this指向:';
class App extends React.Component{
  constructor(){
    super()
  }
  //测试函数
  handler() {
    console.log(`handler ${STR}`,this);
  }
  render(){
    console.log(`render ${STR}`,this);
    return(
      <div>
        <h1>hello World</h1>
        <label htmlFor = 'btn'>单击打印函数handler中this的指向</label>
        <input id = "btn" type="button" value = '单击' onClick = {this.handler}/>
      </div>    
    )
  }
}
export default App

相关推荐

什么是DPDK?DPDK的原理及学习学习路线总结

一、什么是DPDK  对于用户来说,它可能是一个性能出色的包数据处理加速软件库;对于开发者来说,它可能是一个实践包处理新想法的创新工场;对于性能调优者来说,它可能又是一个绝佳的成果分享平台。 ...

每天进步一点:两分钟解决kvm下windows虚拟机鼠标不跟随

跟随昨天文章做测试的朋友们应该和我一样遇到了vnc连接windows鼠标不跟随的问题,经过一番查找有两种解决办法:1.编辑配置文件命令virshedittest或者直接vi/etc/libvir...

PC虚拟化主流:KVM、XEN、OpenVZ详解

目前,PC的虚拟化逐渐成为互联网发展的大趋势,我们知道,KVM、XEN、OpenVZ是虚拟化的三种方式,今天我们就来探讨这三种虚拟化的优势和劣势。1、pc虚拟化——KVMKVM是完整的硬件虚拟化,可在...

Windows上使用QEMU创建aarch64(ARM64)虚拟机

前言随着国产化的推进,现在采用ARM、MIPS的机器越来越多,作为开发、运维人员要调测软件总不能每种架构的机器都去买一台吧?主要像博主这样的穷B,实在也是承受不起。。需要的工具...

高度致敬Windows!开源优麒麟20.04 LTS发布:支持5年

优麒麟团队宣布,优麒麟(UbuntuKylin)开源操作系统20.04LTS正式版已经发布,代号FocalFossa,全球同步发布的还有Ubuntu20.04、Lubuntu20.04、Xub...

极空间虚拟机上线了,一学就会!小白保姆级使用教程

友情提示本文涉及内容较多,篇幅在4500字左右,为了对小白用户更加友好,图片示例多达60张。整个文章部分为三个阶段,准备-初探-实战。其中实战部分包含Windows系统,ikuai软路由系统,iSto...

Windows Subsystem for Linux现以应用形式上架Microsoft Store

微软今天宣布WindowsSubsystemforLinux(WSL)作为一款应用上架Windows11端的MicrosoftStore。也就是说,现在WSL以应用的方式通过...

Windows Server 2019 Core 虚拟机系统镜像制作

WindowsServer2019Core简介WindowsServer2019是微软于2018年11月13日发布的新一代WindowsServer服务器操作系统,基于Win10180...

微软商店中的WSL预览版现已可用!Windows 11用户狂喜

...

在NAS上安装Win10,24小时待命的云电脑达成√

#头条创作挑战赛#引子...

免费开源虚拟机VirtualBox 7.0.12发布:修复TPM和黑屏问题

IT之家10月18日消息,甲骨文近日发布了VirtualBox7.0.12维护版本更新,重点修复此前版本中用户反馈和官方发现的BUG,改善了对LinuxKernel6.4/6.5...

KVM Cloud 虚拟机管理系统安装部署

KVMCloud介绍KVMCloud是一款基于KVM实现的适用于小微企业的虚拟机管理系统,支持如下功能:基于KVM的VM基础功能(创建、启动、停止、重装、webVNC等功能)使用NFS作为磁盘...

个人KVM 虚拟化学习笔记(kvm虚拟化管理平台)

一、KVM原理二、KVM基础功能2.1CPU2.2内存2.3存储2.4网络三、KVM高级功能...

kvm虚拟化之ESXi到KVM之v2v迁移(esxi虚拟机迁移到另一个esxi)

1.ESXi到KVM之v2v情况说明(1).配置任务列表:1)VMwareESXi虚拟平台下linux系统迁移到KVM虚拟平台。2)VMwareESXi虚拟平台下windows系统迁移到KVM虚拟平台...

unraid下虚拟机安装Windows(vmware安装unraid)

unraid下虚拟机安装Windows使用unraid也有一段时间了,主要是做数据备份,以及docker容器的安装测试,今天有空测试一下VMS虚拟机的使用,用在unraid上安装windows7操作系...