react知识点汇总一

news2024/11/28 0:35:12

以下是一些React中经典的知识点:

什么是React?它有哪些特点和优势?

React是一个由Facebook开发的UI框架,用于构建单页面应用程序。它的特点和优势包括:

  • 组件化:React的应用程序主要由多个组件组成,每个组件都封装了自己的逻辑和状态,使得代码结构更加清晰。
  • 虚拟DOM:React使用虚拟DOM来提高渲染效率和性能,尽量减少真实DOM的更新次数,从而提升用户体验。
  • 数据驱动:React采用数据驱动的方式进行UI更新,当数据发生变化时,它会自动重新渲染组件,而无需手动操作。
  • 与其他框架搭配使用:React可以与其他框架(如Redux、Angular)进行搭配使用,且不影响原来的架构。

更多精彩内容,请微信搜索“前端爱好者戳我 查看 。‘

React中的三种组件类型分别是什么?

React中的三种组件类型分别是:

  • Function Component
  • Class Component
  • Pure Component

Function Component是一种纯函数组件,接收props并返回JSX元素。它的优点是简单易用、性能高效,适用于无状态数据(如展示类组件)。

Class Component是一种基于类的组件,通过继承React.Component类来创建。它可以包含状态、生命周期方法和事件处理器,适用于具有复杂逻辑和交互的组件。

Pure Component 是一种基于Class Component的优化版本,继承React.PureComponent类。它内部实现了shouldComponentUpdate方法,当组件的props和state没有发生变化时,不会重新渲染组件,从而提高性能。

什么是JSX?它与HTML的区别是什么?

JSX是一种JavaScript语法扩展,用于描述UI的结构和样式。它与HTML的区别在于:

  • 属性名称采用驼峰命名法,如className、htmlFor等。
  • JSX允许嵌套JavaScript表达式,以花括号{}包裹,而HTML则不支持。
  • JSX中的标签名可以是自定义组件的名称,而HTML只能使用原生标签。
  • JSX中需要使用自闭合标签,如<input />,而HTML中部分标签可以省略自闭合符号。

什么是Virtual DOM?它有什么作用?

Virtual DOM 是 React 的一个重要概念,它是一个 JavaScript 对象,它存储着对真实 DOM 树的一个虚拟表示。因为操作真实 DOM 树非常耗费性能,所以 React 将操作虚拟 DOM 树转化为正常的 JavaScript 操作,一旦完成所有操作后,再统一更新真实 DOM 树,从而提高了应用程序的性能。

Virtual DOM的作用在于:

  • 提高页面渲染速度:虚拟DOM可以减少页面的重绘和回流,从而提高渲染效率。
  • 简化代码结构:通过对DOM进行抽象描述,使得代码结构更加清晰、易于维护和扩展。
  • 实现跨平台:虚拟DOM是一个平台无关的API,可以在多种环境中使用,如浏览器、移动端、服务器等。

虚拟 DOM 的解析过程

首先对将要插入到文档中的 DOM 树结构进行分析,使用 js 对象将其表示出来,比如一个元素对象,包含 TagName、props 和 Children这些属性。然后将这个 js 对象树给保存下来,最后再将 DOM 片段插入到文档中。

当页面的状态发生改变,需要对页面的 DOM 的结构进行调整的时候,首先根据变更的状态,重新构建起一棵对象树,然后将这棵新的对象树和旧的对象树进行比较,记录下两棵树的的差异。

最后将记录的有差异的地方应用到真正的 DOM 树中去,这样视图就更新了。

DIFF 算法的原理

在新老虚拟DOM 对比时:
首先,对比节点本身,判断是否为同一节点

  • 如果不为相同节点,则删除该节点重新创建节点进行替换
  • 如果为相同节点,进行patchVnode,判断如何对该节点的子节点进行处理,先判断一方有子节点一方没有子节点的情况(如果新的
    children 没有子节点,将旧的子节点移除)

比较如果都有子节点,则进行updateChildren,判断如何对这些新老节点的子节点进行操作(diff 核心)。匹配时,找到相同的子节点,递归比较子节点

在 diff 中,只对同层的子节点进行比较,放弃跨级的节点比较,使得时间复杂从O(n3)降低值O(n),也就是说,只有当新旧children都为多个子节点时才需要用核心的Diff 算法进行同层级比较。

React中什么是props和state?它们之间有什么区别?

  • Props(属性)是从父组件传递到子组件的数据,用于控制组件的行为和显示。在组件内部,Props是只读的,不能直接修改。
  • State(状态)是组件的内部状态,用于存储组件数据和控制其渲染。它可以在组件内通过this.state访问,并且可以通过setState方法来更新。

区别

  • props是从上层组件传递下来的,而state是组件本身的状态;
  • props是只读的,不能在组件内部直接修改,而state可以通过setState方法进行修改。

什么是生命周期方法?有哪些生命周期方法?

生命周期方法是React中用于控制组件生命周期的方法,它共分为三个阶段:挂载阶段更新阶段卸载阶段

常见的生命周期方法有:

  • constructor:组件创建时调用,用于初始化组件状态并绑定事件处理器。
  • render:用于将组件渲染到页面上,必须返回JSX元素。
  • componentDidMount:组件挂载后调用,用于进行异步操作或操作DOM等。
  • shouldComponentUpdate:在组件更新前调用,用于判断是否需要重新渲染组件,返回值为布尔类型,若为false则停止组件更新。
  • componentDidUpdate:组件更新后调用,用于进行一些必要的DOM操作等。
  • componentWillUnmount:组件卸载前调用,用于清理组件相关的资源。

React中如何进行事件处理?

React中可以通过使用事件属性(如onClick、onMouseOver等)来绑定事件处理器,也可以在构造函数中手动绑定事件处理器。

此外,还可以通过箭头函数绑定this,避免this指向问题。

示例代码

class Example extends React.Component {
  handleClick = () => {
    // 处理事件
  }

  render() {
    return (
      <button onClick={this.handleClick}>点我</button>
    )
  }
}

React 的事件和普通的 HTML 事件有什么不同?

区别:

  • 对于事件名称命名方式,原生事件为全小写,react 事件采用小驼峰

  • 对于事件函数处理语法,原生事件为字符串,react 事件为函数;

react 事件不能采用 return false 的方式来阻止浏览器的默认行为,而必须要地明确地调用preventDefault()来阻止默认行为。

合成事件是 react 模拟原生 DOM 事件所有能力的一个事件对象,其优点如下:

  • 兼容所有浏览器,更好的跨平台;
  • 将事件统一存放在一个数组,避免频繁的新增与删除(垃圾回收)。
  • 方便 react 统一管理和事务机制。

事件的执行顺序为原生事件先执行,合成事件后执行,合成事件会冒泡绑定到 document 上,所以尽量避免原生事件与合成事件混用,如果原生事件阻止冒泡,可能会导致合成事件不执行,因为需要冒泡到document 上合成事件才会执行。

React 组件中怎么做事件代理?它的原理是什么?

React 基于 Virtual DOM 实现了一个 SyntheticEvent 层(合成事件层),定义的事件处理器会接收到一个合成事件对象的实例,它符合W3C 标准,且与原生的浏览器事件拥有同样的接口,支持冒泡机制,所有的事件都自动绑定在最外层上。

在 React 底层,主要对合成事件做了两件事:

事件委派:React 会把所有的事件绑定到结构的最外层,使用统一的事件监听器,这个事件监听器上维持了一个映射来保存所有组件内部事件监听和处理函数。
自动绑定:React 组件中,每个方法的上下文都会指向该组件的实例,即自动绑定this 为当前组件。

React中怎么做到组件复用?

React中可以通过组件复用来避免代码的重复编写。常用的方法有:

  • **Props传递:**通过将不同的数据传递给相同的组件,达到复用组件的目的。
  • 高阶组件:高阶组件可以接受一个组件作为参数,并返回一个新的组件,通过这种方式可以对组件进行增强或者实现某个特定功能,从而避免重复编写代码。
  • 继承:可以通过继承React.Component类来实现组件间的继承和复用。

React中如何实现表单控件?

React中可以通过使用内置的表单控件(如input、textarea等)来实现表单。在使用时,需要设置value属性和onChange事件处理器来实现数据的双向绑定。此外,也可以通过第三方库(如Formik)来简化表单的处理。

示例代码:

class Example extends React.Component {
  state = {
    text: ''
  }

  handleChange = (e) => {
    this.setState({
      text: e.target.value
    });
  }

  handleSubmit = (e) => {
    e.preventDefault();
    // 处理表单提交
  }

  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <input type="text" value={this.state.text} onChange={this.handleChange} />
        <button type="submit">提交</button>
      </form>
    )
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664803.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++语法堂】STL标准库学习_list容器

目录 STL标准库学习_list 【1】List的介绍及使用 【2】List常用的接口 【2.1】构造函数 【2.2】析构函数 【2.3】迭代器相关 【2.4】容量相关 【2.5】元素访问相关 【2.6】修改相关 【2.7】运行相关 【2.8】观察相关 【2.9】非成员函数重载 【3】list模拟实现 【…

io.netty学习(六)字节缓冲区 ByteBuf(上)

目录 前言 ByteBuf类 ByteBuffer 实现原理 ByteBuffer 写入模式 ByteBuffer 读取模式 ByteBuffer 写入模式切换为读取模式 clear() 与 compact() 方法 ByteBuffer 使用案例 总结 前言 网络数据传输的基本单位是字节&#xff0c;缓冲区就是存储字节的容器。在存取字节…

双目结构光 实现高度测量

这里使用了两个大恒金星相机&#xff0c;一个投影仪。 相机镜头以及投影仪的架设&#xff1a; 相机镜头以及投影仪的架设&#xff1a; 注意相对位置的摆放&#xff0c;投影仪的光源照亮范围要超过相机的视野。 相机与光源调整好位置后&#xff0c;调整成像效果。两个镜头的光…

传教士与野人过河问题(numpy、pandas)

努力是为了不平庸~ 学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。 目录 一、问题描述 二、问题解释 1.算法分析 2.程序执行流程 3.编写程序对问题进行求解 三、问题思路 1. 算法分析&#xff1a; 2. 实验执…

flink 实时数仓构建与开发[记录一些坑]

记-flink 实时数仓搭建、开发、维护笔记 业务场景描述数仓架构数仓分层odsdimdwddws 数仓建模注意项数仓建模开发规范命名规范 问题与原因分析1、debezium 采集pg 表&#xff0c;数据类型问题2、业务库出现大批量刷表数据&#xff0c;debezium采集connector 可能会挂3、业务库出…

MySQL面试题--索引概念以及底层

目录 概述 索引的底层数据结构 二叉树 B树 B树 B树与B树对比: 面试回答 大纲 回答 概述 索引&#xff08;index&#xff09;是帮助MySQL高效获取数据的数据结构(有序)。 在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff08;B树&#xff0…

chatgpt赋能python:Python扩展开发:从入门到精通

Python扩展开发&#xff1a;从入门到精通 Python是一门高效、可扩展、易学易用的编程语言。Python的优秀性能在科学计算、数据处理、web开发等领域表现突出。然而&#xff0c;Python在特定的应用场景中&#xff0c;如图像处理和机器学习等领域&#xff0c;需要更高效的代码执行…

8.4 IP地址与端口号

目录 IP地址 IP地址及编址方式 IP 地址及其表示方法 点分十进制记法举例 IP 地址采用 2 级结构 分类的 IP 地址 分类的 IP 地址 多归属主机 各类 IP 地址的指派范围 ​编辑 一般不使用的特殊的 IP 地址 ​编辑 分类的 IP 地址的优点和缺点 划分子网 无分类编址 CIDR 无…

【C/C++数据结构与算法】C语言万年历

目录 项目分析 项目效果 头文件及全局变量 获取天数 打印月份、年份日历 main函数 项目分析 实现查询某一个年份、月份&#xff0c;以日历的格式打印为了观赏性利用符号对打印的每一个日期进行分格特殊节日日期能够在日历中标注出来万年历的起始日期是公元1年&#xff0…

【随笔闲谈】软件工程导论

目录 一、软件工程概述 二、启动阶段 三、计划阶段 四、实施阶段 五、收尾阶段 一、软件工程概述 软件危机&#xff1a;在计算机软件的开发和维护过程中遇到的一系列严重问题。 软件危机的产生与自身的特点有关&#xff0c;还与软件开发、管理的方法不正确有关。 软件危…

chatgpt赋能python:Python打开目录:快速浏览目录中的所有文件

Python打开目录&#xff1a;快速浏览目录中的所有文件 Python是一种流行的编程语言&#xff0c;其可扩展性和易学性使其成为一种受欢迎的语言。Python的强大功能之一就是能够操作文件和目录。在本文中&#xff0c;我们将讨论如何使用Python在Windows、Mac和Linux上打开目录并列…

Opencv-C++笔记 (11) : opencv-图像二值化与LUB查找表

文章目录 一、概述二、THRESH_BINARY和THRESH_BINARY_INV三、THRESH_TRUNC四、THRESH_TOZERO和THRESH_TOZERO_INV五、THRESH_OTSU和THRESH_TRIANGLE六、LUT查找表 一、概述 我们在上一节程序中生成了一张只有黑色和白色的图像&#xff0c;这种“非黑即白”的图像像素的灰度值无…

MFC 非线程创建模态化窗口 实现工具栏拓展

1 实现基本工具栏 1.1 在Dlg.h文件中声明变量和定义资源ID #define ID_BUTTONS 501CToolBar m_toolbar; //工具栏 CImageList m_imageList; //工具栏图片 CImageList m_hotImageList; //工具栏热点图片 CReBar m_Rebar; //可以在位图上显示子窗口口 用来显示背景 CString…

【DeepLearning】Ubuntu中深度学习环境配置完整流程

Ubuntu中深度学习环境配置完整流程 1 显卡驱动2 cuda3 cuDNN4 torch5 torchvision 1 显卡驱动 支持 cuda 的所有显卡型号: Link 查询显卡型号 lspci -nn | grep VGA即 Vendor ID:Device ID 为 10de:21c4&#xff0c;在浏览器或者 Link 中搜索。 填写显卡信息: Link 选择要下载…

Jenkins-pipeline自动化构建Java应用

本实验操作需要&#xff1a;Jenkins&#xff0c;git代码仓库&#xff08;如gitlab&#xff0c;gitee等都可以&#xff09;&#xff0c;maven&#xff0c;docker&#xff0c;docker镜像仓库&#xff08;habor&#xff0c;nexus或者阿里云ACR等&#xff09;以及k8s环境。 前期准…

nginx特点以及安装

目录 1.特点 2.nginx和apache的区别 3.nginx应用场景 4.安装nginx 5. 更新nginx版本 6.总结 1.特点 高性能 轻量级web服务软件 稳定性高 系统自选消耗低 对http并发链接处理能力高 #处理并发连接能力 1.cup个数 2.本地服务器最大文件打开数 2.nginx和apache的区别 ng…

chatgpt赋能python:打包Python应用程序成deb包

打包Python应用程序成deb包 随着Python编程语言的不断发展&#xff0c;越来越多的开发者使用Python编写应用程序。然而&#xff0c;将Python程序打包并制作成deb包以进行安装可能仍然是一个难点。本文将介绍如何使用Debian打包工具&#xff0c;将Python应用程序制作成deb包。 …

chatgpt赋能python:Python扩展库介绍

Python扩展库介绍 Python是一种广泛使用的编程语言&#xff0c;它的易用性和可扩展性是许多开发者选择它的原因之一。这个语言有着丰富的扩展库&#xff0c;让开发者能够更加高效地编写代码。在这篇SEO文章中&#xff0c;我们将介绍几个与Python相关的扩展库。 NumPy NumPy是…

RPC远程调用

简介 PRC是一种调用方式而不是一种协议 在本地调用方式时由于方法在同一个内存空间&#xff0c;所以程序中可以直接调用该方法&#xff0c;但是浏览器端和服务端程序是不在一个内存空间的&#xff0c;需要使用网络来访问&#xff0c;就需要使用TCP或者UDP协议&#xff0c;由于…

使用frp工具实现内网穿透以及配置多个ssh和web服务

frp简介 FRP 项目地址 https://github.com/fatedier/frp/blob/master/README_zh.md frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。 环境准备 ssh连接 1. 需要一台可以直接访问…