当前位置: 首页 > news >正文

介绍react

什么是React

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

传统构建页面的方式

<script>document.getElementById('app').addEventListener('click', () => {console.log('')});const div = docuemnt.createElement('div')// ...
</script>

早期,用JavaScript搭配HTML操作DOM来构建页面。

React构建页面的方式

import React from 'react';  // React组件是一个函数,它接收props作为参数,并返回React元素  
function MyComponent() {  // 事件处理函数  const handleClick = () => {  console.log('App was clicked!');  };  // 使用React.createElement创建React元素  // 注意:React.createElement的第一个参数是元素的类型(字符串或React组件),  // 第二个参数是props对象(可选),第三个参数是子元素(可以是字符串、数组或React元素)  const appDiv = React.createElement('div', {  id: 'app',  onClick: handleClick,  }, 'Click me!');  // 另一个React.createElement的例子来创建另一个div  const dynamicDiv = React.createElement('div', null, 'Hello from React div!');  // 返回所有React元素作为组件的JSX结构  // 在JSX中,你可以直接嵌套React元素,而不需要显式调用React.createElement  return React.createElement('div', null, appDiv, dynamicDiv);  
}  // 导出组件以便在其他地方使用  
export default MyComponent;

React.createElement和docuemnt.createElement不同,React.createElement用于创建React元素(虚拟DOM元素),这些元素不是真正的DOM节点,而是JavaScript对象。React元素是React库用于计算最小DOM变更所需的数据结构。

import React from 'react';  function MyComponent() {  const handleClick = () => {  console.log('App was clicked!');  };  return (  <div>  <div id="app" onClick={handleClick}>  Click me!  </div>  <div>Hello from React div!</div>  </div>  );  
}  export default MyComponent;

一般来说,我们会使用JSX语法构建虚拟DOM树。

React工作原理

JSX编译

构建或编译过程中,JSX通过Babel等工具被转换成React.createElement函数调用。

虚拟DOM(VDOM)的创建

React.createElement根据JSX转换的结果创建虚拟DOM对象。虚拟DOM是一个轻量级的JavaScript对象,表示UI的结构和内容。

Fiber架构与双缓存机制

React引入了Fiber架构,将组件树转换为Fiber树,每个Fiber节点代表一个工作单元。Fiber架构还引入了双缓存机制,即当前屏幕上的UI树(current tree)和正在计算的新的UI树(work-in-progress tree)。

Reconciler(协调器)与Diffing算法

当状态或props变化时,React会触发重新渲染。Reconciler通过Diffing算法比较新旧两棵Fiber树,找出差异,生成差异列表,即需要更新、删除或添加的DOM操作。

提交阶段

根据Reconciler生成的差异列表,React进入提交阶段。在这个阶段,React会将变化应用到实际的DOM上,包括插入、更新或删除DOM节点。

生命周期方法、hooks和状态管理

在组件的挂载、更新和卸载过程中,会触发相应的生命周期方法,如componentDidMountcomponentDidUpdate等。在16.8后的React中,推荐使用Hooks(如useEffectuseState等)来处理组件的生命周期和状态。这其中还包含了状态管理,React提供了Context API用于在组件树中共享数据,而无需手动逐层传递props。对于复杂的状态管理,React社区还提供了如Redux、MobX等状态管理库。

错误处理与边界

React提供了错误边界(Error Boundaries)的概念,用于捕获并打印发生在子组件树任何位置的JavaScript错误,并且,它会阻止这些错误冒泡至更高的树级,导致整个React组件树崩溃。

服务端渲染(SSR)与静态网站生成

React支持服务端渲染,允许在服务器上预先渲染组件并发送到客户端,提高首屏加载速度。还可以与Next.js等工具结合,生成静态网站,提升性能和安全性。

异步渲染与并发模式

React18引入了并发模式,这一机制的核心在于让React能够根据任务的优先级进行调度,确保关键操作(如键盘输入、点击响应等)能够快速完成,同时将非关键任务(如数据加载、图片懒加载等)延后处理。

创建React工程

npx create-react-app demo-app
npx create-react-app demo-app-ts --template typescript

React的基本能力

父子组件

import React, { Component } from 'react'export default class ClassComponent extends Component {render() {return (<div />)}}
import React from 'react'export default function FuncComponent() {return (<div />)
}
import './App.css'
import ClassComponent from './basic/ClassComponent'
import FuncComponent from './basic/FuncComponent'function App() {return (<div id='app'><ClassComponent /><FuncComponent /></div>)}export default App

State和Props

Props定义:Props(Properties的缩写)是React组件的输入参数,它们是从父组件传递到子组件的。

特点:

1、Props是只读的,不应该在子组件内部被修改。

2、它们允许父组件向子组件传递数据或配置。

3、通过Props,父组件可以控制子组件的行为和显示内容。

function Welcome(props) {  return <h1>Hello, {props.name}</h1>;  
}  // 使用Welcome组件并传递name属性  
<Welcome name="React" />

State定义:State是React组件内部的私有数据,用于记录组件自身的状态。当状态发生变化时,组件会重新渲染。

特点:

1、State是组件私有的,只能通过组件内部的方法(如setState)来更新。

2、State的更新可能会导致组件的重新渲染。

3、通常用于处理用户交互、动画等需要动态变化的情况。

class Counter extends React.Component {  constructor(props) {  super(props);  this.state = { count: 0 }; // 初始化state  }  render() {  return (  <div>  <p>Clicked {this.state.count} times</p>  <button onClick={() => this.setState({ count: this.state.count + 1 })}>  Click me  </button>  </div>  );  }  
}

生命周期

类组件
初始化阶段
constructor 执行

初始化 state, 初始化一些其他的数据

constructor(props) {super(props);this.state = {number: 0,msg: 'hello world'}
}
getDerivedStsteFromProps(props, state)

本质是一个静态函数,传入 props 和 state, 返回值会和当前的 state 合并。

componentWillMount()(React 16.3废弃)

如果我类中,已经有了 getDerivedStsteFromProps 这个生命周期,则不会执行。

render()

这是类组件中必须实现的方法。它返回代表组件UI的React元素。此方法不应包含任何副作用,并应始终保持纯净。

componentDidMount()

在组件挂载到DOM后立即调用。这是执行需要DOM节点的操作(如AJAX请求或订阅事件)的好地方。

更新阶段

getDerivedStateFromProps(props, state)

如前所述,在更新阶段也会调用此方法,允许基于新的props来更新状态。

shouldComponentUpdate(nextProps, nextState)

此方法允许组件根据新的props或state来决定是否需要重新渲染。如果它返回false,则不会触发后续的render和componentDidUpdate方法。

componentDidMount()(React 16.3废弃)
render()

与挂载阶段相同,此方法用于返回代表组件UI的React元素。

getSnapshotBeforeUpdate(prevProps, prevState)

在DOM更新之前被调用,允许捕获一些DOM信息(如滚动位置)。它的返回值将作为componentDidUpdate的第三个参数。

componentDidUpdate(prevProps, prevState, snapshot)

在更新后立即调用。这是执行依赖于DOM的操作或根据prevProps和prevState进行状态更新的好地方。

卸载阶段
componentWillUnmount()

在组件从DOM中卸载并销毁之前调用。这是执行任何必要的清理操作(如取消网络请求或清除定时器)的好地方。

函数组件
useEffect

有点像vue的watch

useEffect(() => destory, deps)

1、Callback: () => destory ,第一个参数,是一个函数。

2、destroy: 作为 callback的返回值,在下一次 callback 执行之前调用,用于清楚上一次 callback的副作用。

3、deps:依赖数组,如果数组中数据的值改变,执行上一次 callback 返回的 destory,再执行callback 函数

4、Effect是如何模仿生命周期的

import React, { useEffect, useState } from 'react'export default function FuncLifeCycle(props) {const [state, setState] = useState(() => {console.log('getDerivedStateFromProps')return true;})useEffect(() => {// TODO: 请求请求数求数据数据console.log('componentDidMount');return () => {// TODO: 解除一些事件监听console.log('componentWillUnmount')}}, []);useEffect(() => {console.log("componentWillReceiveProps")}, [props])useEffect(() => {console.log("componentDidUpdate")})return (<div><h2>模仿生命周期</h2></div>)
}

相关文章:

介绍react

什么是React React是一个用于构建用户界面的JavaScript库。 传统构建页面的方式 <script>document.getElementById(app).addEventListener(click, () > {console.log()});const div docuemnt.createElement(div)// ... </script> 早期&#xff0c;用JavaSc…...

网络爬虫概述

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 网络爬虫&#xff08;又被称为网络蜘蛛、网络机器人&#xff0c;在某社区中经常被称为网页追逐者&#xff09;&#xff0c;可以按照指定的规则&#…...

取证工作: SysTools SQL Log Analyzer, 完整的 SQL Server 日志取证分析

天津鸿萌科贸发展有限公司是 Systools 系列软件的授权代理商。 SysTools SQL Log Analyzer 是 Systools 取证工具系列之一&#xff0c;用于调查 SQL Server 事务日志&#xff0c;以对数据库篡改进行取证分析。 什么是 SQL Server 事务日志&#xff1f; 在深入研究 SQL 事务日…...

蓝牙耳机怎么连接电脑?轻松实现无线连接

蓝牙耳机已经成为许多人生活中不可或缺的一部分&#xff0c;不仅可以方便地连接手机&#xff0c;还能轻松连接电脑&#xff0c;让我们在工作和娱乐时享受无线的自由。然而&#xff0c;对于一些用户来说&#xff0c;将蓝牙耳机与电脑连接可能会遇到一些问题。本文将介绍蓝牙耳机…...

4.音视频 AAC SSAASS

目录 AAC 1.什么是ADIF和ADTS&#xff1f; 2.ADTS的数据结构是怎样的&#xff1f; SSA/ASS 1.SSA/ASS的基本结构 AAC AAC(Advanced Audio Coding&#xff0c;高级音频编码)是一种声音数据的文件压缩格式。AAC分为ADIF和ADTS两种文件格式。 1.什么是ADIF和ADTS&#xff…...

每日5题Day24 - LeetCode 116 - 120

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; /* // Definition for a Node. class Node {public int val;public Node left;…...

在笔记本电脑上使用 LLMs 的 5 种方法

在网上使用 ChatGPT 很简单&#xff0c;只需有网络连接和好的浏览器即可。但这样做可能会泄露您的隐私和数据。OpenAI 存储了您的提示和其他元数据以重新训练模型。对于一些人来说可能不成问题&#xff0c;但注重隐私的人可能更愿意在本地使用这些模型&#xff0c;不受外部跟踪…...

Linux内存从0到1学习笔记(8.15 MMU/IOMMU/SMMU概览)

一, 什么是MMU? MMU(Memory Management Unit 内存管理单元),即内存管理单元,是计算机硬件中的一个重要组件,主要负责处理中央处理器(CPU)的内存访问请求。 其工作原理如下: 当程序发出内存访问请求,包括读取或写入操作以及逻辑地址(虚拟地址)。然后,MMU根据页表…...

Intellij IDEA中怎么配置Maven?

在IntelliJ IDEA中配置Maven非常简单&#xff0c;以下是详细步骤&#xff1a; 步骤1&#xff1a;安装Maven 首先确保你的计算机上已经安装了Maven。如果没有安装&#xff0c;你可以从Apache Maven官网下载并安装&#xff1a;https://maven.apache.org/download.cgi 步骤2&am…...

操作系统-内存管理

虚拟内存 操作系统会提供⼀种机制&#xff0c;将不同进程的虚拟地址和不同内存的物理地址映射起来。 两个概念&#xff1a; 程序所使⽤的内存地址叫做虚拟内存地址&#xff08;Virtual Memory Address&#xff09;实际存在硬件⾥⾯的空间地址叫物理内存地址&#xff08;Physi…...

C++中的解释器模式

目录 解释器模式&#xff08;Interpreter Pattern&#xff09; 实际应用 算术表达式解释器 布尔表达式解释器 总结 解释器模式&#xff08;Interpreter Pattern&#xff09; 解释器模式是一种行为设计模式&#xff0c;它定义了一种语言的文法表示&#xff0c;并使用解释器…...

用 C 语言实现求补码的运算

缘起 前两天程序中需要求一堆参数的补码&#xff0c;一时犯懒&#xff0c;想从CSDN上搜一个勉强能用的代码借鉴一下&#xff0c;结果几乎没有搜到一个靠谱的&#xff01;这种求补码的操作&#xff0c;用脚趾头想想也应该知道要用C或者C的位运算来实现呀。结果搜到的一些实现方…...

python下载文件

import urllib.request url "http://****/storage/x4MigEhU6BGAuTqjrRfIBky0S2aMmkyGl4UzTqUb.png"#下载地址 path "ddad.png"#保存路径&#xff0c;保存项目路径 urllib.request.urlretrieve(url, path)...

JMU 数科 数据库与数据仓库期末总结(1)

本章根据老师给出的知识点作进一步相对生动一点的解释。 不保证完全正确。 先给出总的知识点&#xff0c;再给出生动解释。 知识点 数据模型通常由三部分组成&#xff1a;数据结构、数据操作和完整性约束。关系模式中主码的取值必须唯一且非空&#xff0c;这是实体完整性的…...

前端问题整理

Vue vue mvvm&#xff08;Model-View-ViewModel&#xff09;架构模式原理 Model 是数据层&#xff0c;即 vue 实例中的数据View 是视图层&#xff0c; 即 domViewModel&#xff0c;即连接Model和Vue的中间层&#xff0c;Vue实例就是ViewModelViewModel 负责将 Model 的变化反映…...

【实践功能记录6】表格列悬浮展示tooltip信息

需求描述&#xff1a; 鼠标悬浮在表格的IP字段上时&#xff0c;使用tooltip展示IP信息&#xff0c;如图&#xff1a; 1.封装根据IP展示信息的组件 请求接口获取IP信息&#xff0c;注意请求接口时防抖 <!-- 根据IP展示资产信息 --> <template><div><el-…...

AI论文速读 | 2024[SIGIR]基于大语言模型的下一个兴趣点推荐

论文标题&#xff1a;Large Language Models for Next Point-of-Interest Recommendation 作者&#xff1a;Peibo Li ; Maarten de Rijke ; Hao Xue &#xff08;薛昊&#xff09;; Shuang Ao ; Yang Song ; Flora D. Salim 机构&#xff1a;新南威尔士大学(UNSW)&#xff0c…...

Rust 实战丨通过实现 json! 掌握声明宏

在 Rust 编程语言中&#xff0c;宏是一种强大的工具&#xff0c;可以用于在编译时生成代码。json! 是一个在 Rust 中广泛使用的宏&#xff0c;它允许我们在 Rust 代码中方便地创建 JSON 数据。 声明宏&#xff08;declarative macros&#xff09;是 Rust 中的一种宏&#xff0…...

vue+elementUI实现在表格中添加输入框并校验的功能

背景&#xff1a; vue2elmui 需求&#xff1a; 需要在一个table中添加若干个输入框&#xff0c;并且在提交时需要添加校验 思路&#xff1a; 当需要校验的时候可以考虑添加form表单来触发校验&#xff0c;因此需要在table外面套一层form表单&#xff0c;表单的属性就是ref…...

为国产加油:“缺芯少屏”暂缓,另一领域,也要加把劲

说起咱中国之前的“缺芯少屏”&#xff0c;真的是让人挺闹心的。 不过呢&#xff0c;为了改变这个状况&#xff0c;咱们的工程师们可是费了不少劲儿&#xff0c;辛辛苦苦努力了数十年。现在好了&#xff0c;咱们也迎来了柔性屏的时代。 柔性屏 说起来&#xff0c;在触摸屏或者…...

Fiji在macOS系统的兼容性解决方案:从启动故障到配置优化的完整指南

Fiji在macOS系统的兼容性解决方案&#xff1a;从启动故障到配置优化的完整指南 【免费下载链接】fiji A "batteries-included" distribution of ImageJ :battery: 项目地址: https://gitcode.com/gh_mirrors/fi/fiji Fiji作为科学图像处理领域广泛使用的"…...

2026金三银四变天了:企业要的是能用的人,不是“有潜力的人“

2026金三银四变天了&#xff1a;企业要的是"能用的人"&#xff0c;不是"有潜力的人" 3月了&#xff0c;又到了传说中的"金三银四"。 往年这个时候&#xff0c;朋友圈里都是"拿到offer了""跳槽涨薪30%"的好消息。但今年&…...

微信聊天记录的数字档案馆:WeChatMsg实现数据永久保存与深度分析

微信聊天记录的数字档案馆&#xff1a;WeChatMsg实现数据永久保存与深度分析 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trendin…...

HC-SR501人体红外传感器:从参数解析到树莓派实战应用

1. HC-SR501人体红外传感器核心参数解析 第一次接触HC-SR501时&#xff0c;我被它简单的三针脚设计迷惑了——这么小的模块真能检测人体移动&#xff1f;实测后发现这简直是智能家居项目的"火眼金睛"。让我们拆解它的关键参数&#xff0c;你会发现每个调节旋钮背后都…...

程序员副业变现全攻略

CSDN程序员副业图谱技术文章大纲副业方向分类技术变现类&#xff1a;外包开发、技术咨询、代码审核内容创作类&#xff1a;技术博客、视频教程、电子书编写产品开发类&#xff1a;独立应用、开源项目、插件工具教育培训类&#xff1a;在线课程、一对一辅导、技术直播技术栈与工…...

RKE2集群里crictl拉镜像总报‘device busy’?别急着重启,先排查这个安全软件

RKE2集群crictl拉镜像报"device busy"的深度排查指南 当你正在RKE2集群中执行关键部署&#xff0c;突然遇到crictl pull命令报出"failed to extract layer"和"device or resource busy"错误时&#xff0c;那种感觉就像在高速公路上突然爆胎。大多…...

adb工具箱下载,免费的ADB工具箱,手机投屏工具等推荐

Android Debug Bridge&#xff08;ADB&#xff0c;安卓调试桥&#xff09;是 Google 推出的跨平台命令行工具&#xff0c;属 Android SDK 平台工具核心组件&#xff0c;用于电脑与安卓设备&#xff08;手机、平板、模拟器&#xff09;通信Android Developers。 它采用客户端 -…...

美国智能手机搜查法律现状:不确定性与风险并存

生物识别解锁&#xff1a;法律模糊地带的高风险在美国&#xff0c;配置生物识别解锁功能的设备一直面临易受攻击的问题。目前&#xff0c;关于手机搜查的合法权益并不明确。一方面&#xff0c;若手机设置密码锁&#xff0c;被拘留或逮捕时说出密码可能被视为自证其罪&#xff0…...

Phi-4-mini-reasoning真实案例:教育机构自动批题与答案生成应用

Phi-4-mini-reasoning真实案例&#xff1a;教育机构自动批题与答案生成应用 1. 教育场景中的智能批改需求 在教育培训行业&#xff0c;教师每天需要花费大量时间批改作业和试卷。传统的人工批改方式存在几个明显痛点&#xff1a; 时间成本高&#xff1a;一位数学老师批改50份…...

通义千问1.5-1.8B-Chat-GPTQ-Int4实战:微信小程序集成AI对话功能开发指南

通义千问1.5-1.8B-Chat-GPTQ-Int4实战&#xff1a;微信小程序集成AI对话功能开发指南 最近在做一个宠物社区的小程序&#xff0c;想加个智能客服功能&#xff0c;让用户能随时问问养宠问题。一开始觉得这事儿挺复杂&#xff0c;得自己搞个大模型服务器&#xff0c;成本高不说&…...