介绍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>)
}

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

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

相关文章

医学文献如何获取

获取医学文献的主要渠道包括以下几种&#xff1a; 1、医学数据库: 包括PubMed、MEDLINE等&#xff0c;这些是专门收录医学文献的数据库&#xff0c;涵盖广泛的医学研究内容。 2、医学期刊网站: 通过医学期刊的官方网站可以获取最新的医学研究成果&#xff0c;有些期刊提供免费…

记录一下PHP使用微信小程序支付

记录一下PHP使用微信小程序支付V3版本经历 官方文档&#xff1a;https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_0.shtml 请详细查看文档中小程序支付接入前准备&#xff08;https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter2_8_1.shtml&#xff…

仿element-ui 实现自己组件库 <3>

目录 input 组件封装 v-model用在组件上 显示和隐藏密码 封装switch组件 实现转换的功能 设置checkbox input 组件封装 首先input组件的基本框架和样式&#xff1a; <div class"miao-input"><input class"miao-input_inner" > </div…

网络编程(四)

一、使用wireshark抓包分析协议头 &#xff08;一&#xff09;wireshark常用的过滤语句 tcp.port <想要查看的端口号> ip.src <想要查看的源IP地址> ip.dest <想要查看的目的IP地址> ip.addr <想要查看的IP地址>&#xff08;二&#xff09;抓包分…

无回显XXE攻击:隐秘的数据泄露技术

引言 在网络安全领域&#xff0c;数据泄露是一个严重的问题&#xff0c;而XXE&#xff08;XML External Entity&#xff09;攻击提供了一种隐秘的数据泄露手段。即使在不允许直接输出文件内容的环境中&#xff0c;攻击者也可以通过无回显技术获取敏感信息。本文将探讨无回显XX…

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…

IP服务器代理如何设置使用?

IP服务器代理&#xff08;通常称为代理IP或代理服务器&#xff09;的设置和使用方法可以根据不同的需求和场景而有所不同。以下是一个清晰的步骤指南&#xff0c;帮助你设置和使用IP服务器代理&#xff1a; 1. 选择合适的代理IP类型 根据使用目的的不同&#xff0c;可以选择不…

如何将ai集成到项目中,方法二

上一篇文章&#xff1a;如何将ai集成到radsystems项目中&#xff0c;在项目中引入ai-CSDN博客 上一篇文章内容主要针对于未实现权限分离的项目&#xff0c;这篇文章主要来说一下权限分离的项目怎么做&#xff0c;以及注意的细节。 一、编写前端router.js 二、编写前端askai.vu…

Qt实现SwitchButton滑动开关按钮组件

概述 使用Qt如何制作一个滑动开关按钮&#xff0c;同类的文章和代码网上很多&#xff0c;但很多都是pyqt编写的&#xff0c;也有c编写的&#xff0c;大家可以参考. 我这里主要是实现了一个滑动按钮&#xff0c;富有滑动动画和文字&#xff0c;话不多说&#xff0c;上代码 自定义…

用python写一个企业知识库算法

企业知识库算法是一个用于管理和检索企业内部知识的系统。在这个例子中&#xff0c;我们将使用Python编写一个简单的企业知识库算法&#xff0c;该算法将实现以下功能&#xff1a; 1. 添加知识条目 2. 搜索知识条目 我们将使用一个字典来存储知识库中的知识条目。 每个知识条…

【实践】部署时GPU与CPU

部署一个深度学习服务时&#xff0c;申请GPU和CPU资源是为了充分利用它们各自的优点和功能。虽然GPU具有强大的并行计算能力和专用显存&#xff0c;但CPU在许多任务中仍然发挥着关键作用。以下是详细的解释&#xff1a; GPU的作用 并行计算: GPU擅长处理大量并行计算任务&…

基础-02-数据通信基础

文章目录 1.信道特征1.1 数据通信概念1.2 信道特性-信道带宽W1.3 信道特性-码元和码元速率1.4 信道特性-奈奎斯特定理1.5 信道特性-香农定理1.6 带宽/码元速率/数据速率关系梳理1.7 练习题 2.信道延迟2.1 信道延迟概念2.2 信道延迟计算2.3 练习题 3. 传输介质3.1 传输介质概念3…

Python脚手架系列-DrissionPage

记录DrissionPage模块使用中的一些常常复用的代码,持续更新… 接管谷歌浏览器 from DrissionPage import ChromiumPage, ChromiumOptionsco ChromiumOptions().set_local_port(4249) driver ChromiumPage(addr_or_optsco)创建driver&#xff0c;如果浏览器已开启优先接管&am…

深入了解各种取址方式:概念、原理及实例

引言 在计算机系统中&#xff0c;取址方式&#xff08;Addressing Mode&#xff09;是指计算机指令如何指定操作数的位置。不同的取址方式提供了灵活性和效率的平衡&#xff0c;是CPU设计的重要组成部分。本文将详细介绍几种常见的取址方式&#xff0c;包括它们的概念、工作原…

4/8路 HDD/SSD 1080 车载NVR,高清车载录像机(8路1080P硬盘机

4/8路 HDD/SSD 1080 车载NVR 产品主要特点&#xff1a; -支持4/8路实时高清数字 1080P录像 -硬盘记录数据&#xff08;最大支持2TB&#xff09; -支持GPS全球定位, 可选模块 -支持WIFI高速自动下载功能, 可选模块 -内置3/4G模块&#xff0c;实时预览和远程管理&#xff0c…

浏览器实时播放摄像头数据并通过 Yolo 进行图像识别

安装 Ultralytics 之后&#xff0c;可以直接通过本地获取摄像头数据流&#xff0c;并通过 Yolo 模型实时进行识别。大多情况下&#xff0c;安装本地程序成本比较高&#xff0c;需要编译打包等等操作&#xff0c;如果可以直接通过浏览器显示视频&#xff0c;并实时显示识别到的对…

使用 Selenium 保持登录会话信息

使用 Selenium 保持登录会话信息 在进行 Web 自动化测试时,保持登录会话信息是一个常见的需求。这不仅能节省每次测试时重复登录的时间,还能模拟实际用户行为,使测试更加真实可靠。在这篇博客中,我们将深入探讨如何使用 Selenium 在每次启动时保持原有的登录会话信息。 什…

汇编中标签的引用$符号

一个c/c开发人员&#xff0c;居然不会汇编&#xff0c;真是惭愧。趁着闲暇时间学习一下汇编&#xff0c;曲不离口&#xff0c;码不离手。看一个简单的例子&#xff1a; .section .datavalue:.quad 200.section .text .global main main:nopMOVL value, %eaxret 就这一条指令&…

计算机网络:网络层 - IPv4地址

计算机网络&#xff1a;网络层 - IPv4地址 分类编址划分子网子网掩码 无分类编址 CIDRCIDR 地址块构造超网 在酒店中&#xff0c;每个房间都有门牌号码&#xff0c;服务员送餐时&#xff0c;就可以根据门牌号码来判断一份餐要送到那个房间。 在网络中也是如此&#xff0c;一份…

vue实现页面打印的四种方法

vue实现页面打印的四种方法 一、原始window.print()二、指定区域的打印三、生成 iframe 然后打印(推荐)四、使用第三方库 print.js 一、原始window.print() 优点:便捷打印缺点:不可打印指定的区域 //打印按钮<el-button class"printBox" type"primary"…