react基础技术栈

news2025/6/1 12:39:16

react基础技术栈

      • react项目构建
      • react的事件绑定
      • React组件的响应式数据
      • 条件渲染和列表循环
      • 表单绑定
    • Props和组件间传值,插槽
      • react中的样式操作
    • 生命周期
    • ref 和 context
    • 函数组件和hook
    • 高阶组件
    • React性能问题
    • React-route的三个版本
      • react-router使用步骤
      • react-router提供的一些其他重要组件
      • react的全局插件使用方式
      • 动态路由和嵌套路由
      • 获取路由参数
      • js控制跳转路径
      • 异步路由
    • 状态管理

react项目构建

  • 使用官方的脚手架

    通过npx create-react-app 能创建一个最基本的react项目。但不同于vue的创建,只做了react基本的搭建和构建,没有配上任何路由和状态管理。项目使用webpack构建

  • 使用一些市场上的集成脚手架
    典型的比如umi。这一类脚手架创建出来的项目会集成好很多功能,比如路由,mock

两个核心库:
react:React核心库,提供react的个个功能
React-dom : 提供一些dom操作方法用于把react创建出来的react对象挂载到真正的htmldom中,或者从htmldom中卸载。核心作用类似于vue的mount。

react项目组件关系
在这里插入图片描述

组件化开发,定义一个基本组件得有两个东西,一个是组件html模版,一个是数据和方法。

区别于vue有专门的.vue写组件,react组件分为两类:一类是函数组件,一类是class组件,就跟vue3,vue2一样的版本。react老版本用的是class组件,新版本用的是函数组件。
在这里插入图片描述
可以在js中写html是因为jsx

jsx的特点:

  • 直接在js中混用
    React项目利用babel做了对js的编译,所以我们是可以直接在js里写jsx的。
  • 写法接近js
    jsx几乎和js一样,不同的是可以更方便的写html在js里,写在js里的html最后会被编译成一个js对象,我们也可以用react自带creatElement创建这个对象

jsx里面渲染不同内容的区别
在这里插入图片描述

react的事件绑定

规则模式
1.类似原生,on +方法名 (首字母大写)
2.一定要赋值给事件一个方法

在这里插入图片描述
react事件绑定的特别注意问题:

  1. 不做处理的情况下,this会指向Undefined
  2. 给到事件绑定的一定得是一个方法,不要直接调用方法,不然就是这个方法的返回值了,一定不能像vue里面直接调用这个方法,调用方法只会在页面初次渲染指向方法。
    在这里插入图片描述

事件绑定其他操作
1.传递参数
2.获取事件对象
3,阻止默认行为,冒泡等

传递参数:借助bind()方法
在这里插入图片描述
事件对象:当我们没有传任何参数时,事件对象就是第一个参数,如果传了参数,事件对象就是最后一个参数。
阻止默认行为,冒泡:跟原生的一样

React组件的响应式数据

类组件响应式数据的定义

响应式数据定义在类的state属性中。

react响应式体系的原理
1、react不能像vue一样直接修改 触发更新
2.react修改能改值,但无法触发更新,因为react没有像vue一样监听get和set,而是在调用setState的时候调用react的更新操作

setState工作流程图解
在这里插入图片描述
关键点:

  1. 通过浅合并来修改数据
  2. 调用setState方法会触发更新,修改state并不会触发更新

setState是一个异步操作,所以如果我们要获取修改后的值,需要在setState的第二个参数里获取(这是我们对数据修改完成之后的操作)
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
PureComponent下对于对象和数组的修改
因为PureComponent会根据state是否改变来决定是否更新,而我们对于对象数组这样的引用类型判断是否改变的原理是看内存地址,而不是内容。所以我们PureComonent下修改对象和数组,一定要赋予一个新对象,所以一般我们不直接操作原对象,而是先拷贝一份,再进行操作

条件渲染和列表循环

React没有vue一样的指令,一切操作本质上都是我们通过运算生成不同的内容,拿去渲染,得到不同的页面

条件渲染的本质
原则:
1.react渲染undefined,null,空字符串,false不会渲染成任何内容
2.如果渲染一个jsx编写的html元素,就会渲染成页面上的内容
在这里插入图片描述
在这里插入图片描述
列表循环的本质
原则:
1.渲染一个数组会把数组里的每一项单独取出渲染
2.那么我们编写一个里面存放的都是html结构的数组,就会渲染成列表
在这里插入图片描述
在这里插入图片描述
vue指令开发与react的jsx开发
vue:各种效果用指令编写,对于简单的控制非常容易
react:各种效果都通过逻辑运算产出对应的内容渲染,能够完整控制整个过程

react的思想
1.更少的封装,更高的自由度,能够让使用者更加高度的去自定义实现,不用像vue一样必须遵守规则,在这里只需要遵守js规则
2.纯粹的js,不用去背什么特殊指令

表单绑定

React中很多思路都是按原生的操作区做的,表单绑定也是如此
原生表单获取表单输入值,可以通过监听input,change等事件,然后获取e.target.value
如果要设置表单的值,通常设置value属性,如果是选择框则是checked属性
在这里插入图片描述
在这里插入图片描述
1.受控组件(添加value属性)

<input value={this.state.inputValue} onChange={...} />
  • React完全控制输入框的值
  • 输入框的值始终与state保持同步
  • 可以实现额外的值验证和处理
  • 更容易实现表单处理和数据同步
    2.非受控组件(不添加value属性)
  • 浏览器自己管理input的状态
  • React无法直接控制输入框的值
  • 可能导致状态不同步的问题

推荐使用受控组件

<input 
  value={this.state.inputValue} 
  onChange={(e) => {
    // 只允许数字输入
    const newValue = e.target.value.replace(/[^0-9]/g, '');
    this.setState({ inputValue: newValue });
  }} 
/>

如果不使用value属性,这样的控制就很难实现。因此,在React中推荐使用受控组件模式来处理表单输入。
在这里插入图片描述
普通输入框input的双向是设置这个value的值就好了,然后这个选项框,复选框或单选框它们的value是选项的值,所以是否勾选是用check表示的,它们的双向是怎么做的呢
在这里插入图片描述

Props和组件间传值,插槽

props是react中的核心
在react中,一切写着组件上的属性和子节点都被规划为了props。
所以props是react很多功能的根本。父子传值,插槽全都是基于props,不像vue有事件监听,emit,专门的插槽这一类东西。

props的类型验证和默认值
在这里插入图片描述
在这里插入图片描述
有一个封装的库可以省去编码校验 npm i proptypes
在这里插入图片描述
模拟vue中的插槽

插槽本质上讲就是子组件的html内容需要父组件传入,在jsx的加持下,可以把html像普通的字符串,数字一样传递,所以插槽只需要直接作为props传入就行。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
子往父传值
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

react中的样式操作

class类名设置
1.必须写为className
2.类名和样式写在css文件里
3.必须接收一个字符串

style内联
不能像原生一样写成字符串,必须写成对象
在这里插入图片描述
第一个{}代表里面的内容按照js去执行。第二个{}表明执行一个对象。

要css只在组件中生效,不在全局都生效。要创建 组件名-module.css 文件。
有一个第三方库 npm i classnames 可以避免麻烦的样式操作

在这里插入图片描述
在这里插入图片描述

生命周期

严格模式
严格模式只在开发模式下生效,生产上线时会去除,作用简要概括有两方面的作用
1.检测一些危险的操作(比如使用已经废弃api和不推荐的api)
2.会把一些生命周期执行两次,来检查额外副作用(比如render)

重点生命周期
render:通过render函数的执行来决定组件渲染什么内容,所以无论更新还是初次挂载都必须执行render
componentDidMount:组件挂载完成,一般用来做一些页面初始化操作,比如初始请求,echart绘制等,也就是vue的mounted里能做到事
shouldComponentUpdate:更新阶段调用,如果return false则不会执行render函数继续更新,从而达到阻止更新的效果,一般用来做性能优化。PureComponent不能喝shouldComponentUpdate一起用,要用Component,因为PureComponent效果是shouldComponentUpdate实现的。
**componentDidUpdate:**更新完成,等同于vue的updated

ref 和 context

ref用于获取真实dom,和vue中的ref一个道理
注意事项:
1.ref必须在挂载后才能获取,通常在componentDidMount
2.ref获取类组件,不能获取函数组件
在这里插入图片描述
content类似于vue的provider和injected,用于嵌套很深的爷孙组件之间传值。
注意事项:
子组件使用父组件创建的context对象,不能自己创建

函数组件和hook

1.函数组件没有生命周期
2.函数组件没有this
3.函数组件通过hook来完成各种操作
4.函数组件本身的函数体相当于render函数
5.props在函数的第一个参数接受

state的创建和更新
在这里插入图片描述
useEffect
定义副作用
不传第二个参数 = componentDidMount 和 componentDidUpdate
第二个参数传空数组 = componentDidMount
第二个参数数组里放摸=个数据 某= watch监听

useMemo
让一段计算在开始运行一次,后续只有依赖的数据发生变化时才重新运算
作用:
1.类似于vue的一个计算属性的效果
2.缓存一个数据,让其不会重新创建
在这里插入图片描述
useCallback
缓存一个方法,让方法不会每次更新都重新创建,和useMemo差不多。
当我们更新数据时,会重新执行APP(),很多方法虽然功能不变但重复执行了,优化性能
在这里插入图片描述
useRef - 函数组件中使用ref 。 还是为了获取真实dom
useContext - 更方便解析context的provider的数据

高阶组件

如果是ui内容和操作的复用我们会使用组件,但如果是单纯逻辑的复用,写为组件不免麻烦
在这里插入图片描述
什么时候用高阶组件
组件:组件是既包含了ui界面的复用,也包含了逻辑的复用
高阶组件:高阶组件只是复用操作逻辑,运算

React性能问题

React最大的一个性能问题就是 -React的某个组件的更新会连带着他的子组件一起更新。
所以我们需要解决这个问题:
1.react源码层面上尽量弥补这个问题
2.让子组件只做合理的更新

React的时间切片
Vue有依赖收集,做到了最小的更新范围,而React没有做这个事情,所以React要更新,就会有很大的diff算法对比和计算工作。这大的更新量,虚拟dom比对和计算会花很大时间,这样可能会阻塞住浏览器的工作,导致页面长时间白屏。React为了解决这个问题选择另一种策略-时间切片,也就是先计算一部分更新, 然后让渡给渲染进程渲染,然后再进行下一步更新。以此往复。这样我从使用者的角度,就不会出现长时间白屏了。
避免父组件数据更改导致子组件更新
父组件更改导致子组件更新是最大的问题

  • PureComponent 和 React.Memo

避免state同样的值产生更新

  • 避免state修改为同样的值,而产生无意义更新(PureComponent,函数组件本身就会判断)

props

如果组件使用了PureComponent或者React.Memo,虽然已经做到了如果父组件传的props没改变,就不会更新,但是我们 特别注意父组件传入的方法,对象,数组这样的引用类型

  • 用useCallback包裹传递给子组件的方法
  • 非state对象,数组数据,要用useMemo包裹起来

React-route的三个版本

1.React-router :服务端渲染使用
2.React-router-dom :浏览器端渲染使用
3.React-router-native :React-native混合开发使用

react-router使用步骤

1.通过BroserRouter 或者 HashRouter 包裹要使用路由的根组件
2.使用Routes组件,定义具体路由显示区域
3.使用Route组件,定义具体路由规则
4.使用NavLink 或者 Link组件,定义调整链接
在这里插入图片描述

react-router提供的一些其他重要组件

1.Navigate - 路由重定向
2.Outlet ,嵌套路由的子路由显示处

react的全局插件使用方式

React中没有vue那样的vue.use方法,react中使用一个插件,库,都是引入一个组件,然后把要使用该插件的部分包起来

动态路由和嵌套路由

  • 嵌套路由
    在这里插入图片描述
  • 动态路由
    在这里插入图片描述

获取路由参数

在这里插入图片描述

  • params参数

    在这里插入图片描述
    在这里插入图片描述
    - query参数
    在这里插入图片描述

    • location参数
      在这里插入图片描述
      在这里插入图片描述

js控制跳转路径

V6 - useNavigate       

在这里插入图片描述
在这里插入图片描述

异步路由

React做异步路由,要配合到react本身的一个方法-lazy和一个组件suspense
在这里插入图片描述

状态管理

  • React,没有专门的状态管理库,都是通用的js状态管理库,所以我们首先创建一个全局的数据储存和管理工具
  • 通过其他工具,数据的修改能触发react页面的更新

react状态管理相关库
在这里插入图片描述
redux创建仓库
在这里插入图片描述

// store.js
import { createStore } from 'redux'

function counterReducer(state = { value: 0 }, action) {
  switch (action.type) {
    case 'increment':
      return { value: state.value + 1 }
    default:
      return state
  }
}

const store = createStore(counterReducer)

// 组件中使用
import { useSelector, useDispatch } from 'react-redux'

function Counter() {
  const count = useSelector(state => state.value)
  const dispatch = useDispatch()

  return (
    <button onClick={() => dispatch({ type: 'increment' })}>
      {count}
    </button>
  )
}

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

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

相关文章

Three.js搭建小米SU7三维汽车实战(4)场景搭建

场地搭建 javascript // 导入threejs import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/addons/controls/OrbitControls.js"; // 1. 创建场景 const scene new THREE.Scene(); // 2. 创建相机 const camera ne…

Excel 统计某个字符串在指定区域出现的次数

【本文概要】 Excel 统计某个字符串在指定区域出现的次数&#xff1a; 1、Excel 统计一个单元格内的某字符串的出现次数 2、Excel 统计某一列所有单元格内的某字符串的出现次数 3、Excel 统计某一区域所有单元格内的某字符串的出现次数 1、Excel 统计一个单元格内的某字符串的出…

【Linux我做主】进度条小程序深度解析

Linux下C语言进度条程序深度解析 进度条小程序GitHub地址 前言前置知识回车换行&#xff08;CR/LF&#xff09;的深度解析历史渊源与技术规范在进度条/倒计时中的应用 缓冲区机制的全面剖析缓冲区引入缓冲类型对比进度条开发中的关键控制 进度条实现以小见大——倒计时倒计时最…

从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用

安装OpenSSL 在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew&#xff0c;这是一个 macOS 缺失的包管理器。 如果您还没有安装 Homebrew&#xff0c;请先安装它。安装 Homebrew 后&#xff0c;安装 OpenSSL 只需要一条命令。 步骤 1&#xff1a;安装 Home…

微信小程序一次性订阅封装

封装代码如下&#xff1a; export async function subscribeMessage(tmplIds: string[]): Promise<ISubscribeMessagePromise> {// 模板ID// 1、获取设置状态const settings (await wx.getSetting({ withSubscriptions: true })).subscriptionsSetting || {}console.log…

安全帽检测算法AI智能分析网关V4守护工地/矿山/工厂等多场景作业安全

一、方案概述​ 在工业生产与建筑施工场景中&#xff0c;安全帽是保障人员安全的重要装备。但传统人工巡检效率低、易疏漏&#xff0c;难以满足现代安全管理需求。AI智能分析网关V4安全帽检测方案&#xff0c;借助人工智能与计算机视觉技术&#xff0c;实现作业现场安全帽佩戴…

Python自动化之selenium语句——打开、关闭浏览器和网页

目录 一、打开谷歌浏览器 1.双击桌面的Pycharm工具 2.新建Python文件&#xff0c;输入文件名 3.新建的Python文件如下 4.安装selenium库 5.导入包 二、打开网页、关闭网页、关闭浏览器 1.导入增加一个时间包 2.使用函数打包之前写的浏览器的配置 3.调用 4.打开百度网…

【数据结构】--二叉树--堆(上)

一、树的概念和结构 概念&#xff1a; 树是一种非线性的数据结构&#xff0c;他是由n(n>0)个有限结点组成一个具有层次关系的集合。其叫做树&#xff0c;是因为他倒过来看就和一棵树差不多&#xff0c;其实际上是根在上&#xff0c;树枝在下的。 树的特点&#xff1a; 1…

多线程(5)——单例模式,阻塞队列

目录 单例模式饿汉模式懒汉模式—单线程版懒汉模式—多线程版&#xff08;经典面试题&#xff09;懒汉模式—多线程版&#xff08;改进&#xff09; 阻塞队列阻塞队列是什么生产者消费者模型标准库中的阻塞队列-BlockingQueue阻塞队列实现 单例模式 单例模式是一种设计模式&am…

视频监控汇聚平台EasyCVR工业与安全监控:防爆摄像机的安全应用与注意事项

石油、化工、煤矿等行业存在易燃易爆气体、粉尘&#xff0c;普通监控设备易因电火花、高温引发爆炸火灾。随着工业规模扩大&#xff0c;安全生产监控需求激增&#xff0c;防爆摄像机成为保障安全的关键。加之国家法规与行业标准对危险环境监控设备要求严格&#xff0c;规范其应…

基于 Redis 实现分布式锁:原理及注意事项

文章目录 基于 Redis 实现分布式锁&#xff1a;原理及注意事项基于 Redis 实现分布式锁的原理Redis 分布式锁的过期时间和锁续期机制如何防止锁被其他 goroutine 删除&#xff1f;Redis 分布式锁存在的单点故障问题&#xff1a;基于 RedLock 的解决方案高并发场景中 Redis 分布…

手机设备多?怎样设置IP保证不关联

在移动互联网时代&#xff0c;多设备运营&#xff08;如电商、游戏工作室、社交媒体矩阵&#xff09;常面临IP关联风险&#xff0c;轻则账号受限&#xff0c;重则封禁。以下提供6种高效设置独立IP的方法&#xff0c;结合技术原理与实操建议&#xff0c;助您打造稳定合规的运营环…

哈尔滨工业大学计算机系统大作业程序人生-Hello’s P2P

摘 要 文章以C语言程序设计经典案例hello.c为研究对象&#xff0c;系统解析程序在计算机系统中的完整生命周期。剖析源代码通过预处理、编译、汇编、链接四阶段演化为可执行目标程序的编译系统工作机制&#xff0c;继而从进程视角揭示程序运行时计算机体系结构的协同运作&…

Linux系统管理与编程24:基础条件准备-混搭“本地+阿里云”yum源

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 1.添加宿主机共享文件夹 Linux虚拟机可以和宿主机共享文件夹&#xff0c;这样有利于工具文件的共享。具体操作如下&#xff1a; 1&#xff09;vmware workstation共享文件夹 虚拟机…

如何在 Windows 10 PC 上获取 iPhone短信

您可以轻松地将媒体数据从 iPhone 传输到 Windows 计算机&#xff0c;并直接访问计算机上的数据。但是&#xff0c;您可以在 Windows 10 PC 上接收 iPhone 短信吗&#xff1f;有什么功能或工具支持它吗&#xff1f;如果您发现在 Windows 10 PC 上接收 iPhone 消息很困难&#x…

Linux 系统中的软链接与硬链接

目录 一、什么是软链接&#xff1f; 1. 创建软链接 2. 软链接的特性 3. 软链接的用途 二、什么是硬链接&#xff1f; 1. 创建硬链接 2. 硬链接的特性 3. 硬链接的用途 4. 目录硬链接的特殊性 ​编辑 三、软链接与硬链接的区别 1. inode 编号 2. 路径依赖 3. 删除行…

Python爬虫第22节- 结合Selenium识别滑动验证码实战

目录 一、引言 二、滑动验证码原理与反爬机制 2.1 验证码原理 2.2 反爬机制 三、工程实战&#xff1a;滑动验证码识别全流程 3.1 工程准备 3.1.1 环境依赖 3.1.2 目标网站与验证码识别案例 3.2 核心破解流程 3.2.1 自动化打开网页与登录 3.2.2 获取验证码图片&#…

Escrcpy(安卓手机投屏软件) v1.29.6 中文绿色版

在数字设备日益普及的今天&#xff0c;用户对于设备的控制和管理需求也在不断增加。对于Android设备用户来说&#xff0c;Escrcpy这款强大的工具无疑是一个福音。它不仅提供了直观的图形化界面&#xff0c;让用户能够轻松显示和控制自己的Android设备&#xff0c;还以完全免费开…

Linux:深入理解网络层

网络层在复杂的网络环境中确定一个合适的路径.传输到指定的网络中 一、网络层的理解 问题1&#xff1a;为什么要有网络层的概念呢&#xff1f;&#xff1f; ——>我们先来讲一个故事&#xff1a; 假设我在学校里被誉为数学大神&#xff0c;是因为我的数学有考满分的能力&…

Linux_编辑器Vim基本使用

✨✨ 欢迎大家来到小伞的大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;LInux_st 小伞的主页&#xff1a;xiaosan_blog 制作不易&#xff01;点个赞吧&#xff01;&#xff01;谢谢喵&#xff01;&a…