react组件02

setState
setState用法

可以传入一个对象,也可以传入一个函数,,
setState是异步的,会将对象加入一个队列,在一定的时间之后进行统一渲染,,,所以多次调用setState去累加某一个值,是会有问题的

如果想获取异步之后的值,有第二个参数,传入一个函数,获取渲染后的值

  this.setState({count:this.state.count+1},(res)=>{console.log(res,"res")})

当然也可以在生命周期函数 componentDidUpdate(prevProps,prevState,snapshot)

如果想获取每次setState设置的状态值,,可以传入一个函数,获取上一个状态的state和props:

    changeCount(){/*** setState 是异步的,, 如果想要获取上一次state的状态*  上一个state,,, 可以在,上一个state的状态修改,,*  返回一个对象,,和之前的state合并,, 合并使用 Object.assign*/this.setState((prevState,prevProps)=>{console.log(prevState.count)return {count:prevState.count+1}})this.setState((prevState,prevProps)=>{console.log(prevState.count)return {count:prevState.count+1}})}

在react18之后 setState是异步的,在react18之前,在react的事件中,setState是异步的,在原生DOM事件中,比如addEventListener或者setTimeout中是同步的

在react18之后,默认所有的操作都放到了批处理中,,, 异步批渲染
如果希望代码同步,,,可以使用 flushSync

import {flushSync} from "react-dom";
flushSync(()=>{// 同步代码this.setState({count:11})
})
console.log(this.state.count)

SCU

SCU: shouldComponentUpdate
默认继承react的Component类实现的组件,,在更新的时候,不管是否有改动,都会全部更新,,
shouldComponentUpdate 可以先浅层比较传入对象是否相同,相同就不去渲染,不相同再渲染。。。。
PureComponent是实现了这个SCU的组件,一般使用这个

react更新流程
  1. props/state改变
  2. render函数重新执行
  3. 产生新的dom树
  4. 进行diff算法
  5. 计算出差异,进行更新

这个diff算法最终被优化成了:

  • 同层节点之间相互比较,不回跨节点比较
  • 不同类型的节点,产生不同的树结构
  • 开发中,可以通过key,来指定哪些节点在不同的渲染下保持稳定
shouldComponentUpdate

生命周期钩子

sholdComponentUpdate((nextProps,nextState)=>{// 返回true, 调用render// 返回false   不调用
})

类组件继承PureComponent可以自己比较
函数组件需要使用一个高阶函数 memo 进行包裹,,
高阶函数就是,传入一个组件,返回一个新的组件,,,对原来组件的增强

memo(function (){ return "xx"
})
不可变数据的力量

react组件中,,state中的数据,是不可变的,,不要去随意改变state中的数据,,而是浅拷贝一个新的值,修改之后去赋值
如果你直接修改state中的某个对象,,但是PureComponent或者Memo的浅层比较是发现不了对象底层数据变化的,
只能通过赋值一个新的对象,进行改变

ref使用

this.refs.名字
class App extends PureComponent {componentDidMount() {this.refs.hehe.printHehe()}render() {return (<div><Hehe ref="hehe"/></div>);}
}
createRef 函数
import React, { createRef, PureComponent} from 'react';
import Hehe from "./Hehe";class App extends PureComponent {componentDidMount() {console.log(this.HeheRef)this.HeheRef.current.printHehe()}constructor() {super();this.HeheRef = createRef()}render() {return (<div><Hehe ref={this.HeheRef}/></div>);}
}export default App;
传入一个箭头函数,,函数的参数就是 当前ref本身,
import React, { createRef, PureComponent} from 'react';
import Hehe from "./Hehe";class App extends PureComponent {componentDidMount() {this.heheRef.printHehe()}constructor() {super();this.heheRef = null}render() {return (<div><Hehe ref={(result)=>this.heheRef = result}/></div>);}
}export default App;

函数式组件没有实例,无法通过ref获取他们的实例。但是某些时候,我们想获取函数式组件内的某个DOM,,
可以将ref传递进去

import {forwardRef} from "react";const HelloWorld = forwardRef(function(props,ref){return (<div><h2 ref={ref}>hello word</h2></div>)
})export default HelloWorld
import React, { createRef, PureComponent} from 'react';
import Hehe from "./Hehe";
import HelloWorld from "./HelloWorld";class App extends PureComponent {componentDidMount() {this.heheRef.printHehe()console.log(this.hellowordRef.current)}constructor() {super();this.heheRef = nullthis.hellowordRef = createRef()}render() {return (<div><Hehe ref={(result)=>this.heheRef = result}/><HelloWorld  ref={this.hellowordRef}/></div>);}
}export default App;

受控组件

受控组件: 受react控制的组件,,如果绑定了react的state,就被react控制了,需要通过onChange去改变这个input的值。。
react中,state属性,只能通过setState来更新
非受控组件: 没有被react控制的组件,,使用defaultValue设置默认值,,用原生的方式去获取数据

js表单控件改变会掺入一个event,, event.target就是这个控件,, 设置state的时候,可以写成:

// 通过 event.target.type 先判断一个是否是 checkbox  或者是 radio,,
// 因为这两个控件的值,,在event.target.checked 上
this.setState({[event.state.name]:event.state.value
})

checkbox的多选,和 select的多选

高阶组件

高阶函数
  • 接受一个或者多个函数作为输入
  • 或者 返回一个函数
    比如 : map ,filter,reduce
高阶组件 higher order components

高阶组件,本身不是一个组件,是一个函数,,并且这个函数的参数是另一个组件,,返回值也是一个组件

props增强
有时候多个组件会共用属性,,但是每一个去使用 <Context.Consumer> 代码会很冗余,,在高阶函数中处理这些共用的属性

import React from "react";const UserContext = React.createContext()export default UserContext
import UserContext from "../context/user-context";function enhancerProps(OriginComponent){// 内部是另一个组件 === props是父组件传过来的propsreturn (props)=>{return (<UserContext.Consumer>{ value => <OriginComponent {...props} {...value} />}</UserContext.Consumer>)}}export default enhancerProps
import React, { PureComponent} from 'react';
import HelloWorld from "./HelloWorld";
import UserContext from "./context/user-context";class App extends PureComponent {constructor() {super();this.state = {userInfo:{username:"cc",age:11}}}render() {return (<div><UserContext.Provider value={this.state.userInfo}><HelloWorld address="成都"/></UserContext.Provider></div>);}
}export default App;
import React, {PureComponent} from 'react';
import enhancerProps from "./hoc/enhancerProps";
import UserContext from "./context/user-context";class HelloWorld extends PureComponent {render() {return (<div>{/*<UserContext.Consumer>*/}{/*    { value=> <h3>{value.username}</h3>}*/}{/*</UserContext.Consumer>*/}{ this.props.username} - {this.props.age} --{this.props.address}</div>);}
}export default enhancerProps(HelloWorld);

判断是否登录,,或者判断数据是否为空,展示提示
写在高阶组件里面
这个状态改变之后,是根据localStorage中的判断的,没有设置setState,也就没有执行render,,
this.forceUpdate() 强制更新

生命周期劫持
比如判断某个组件的加载时间,在钩子函数 UNSAFE_componentWillMountcomponentDidMount 记录时间差
显示组件的加载时间

Hook可以替代HOC

portals使用

portals: 大门
react中会设置一个根组件,下面的子元素默认都是在这个根组件下面的,,, 在处理,对话框,提示框,固定定位元素的时候非常有用

import {createPortal} from "react-dom";
// 将第一个参数传入的节点,放入指定的DOM中
{createPortal(<div>hehe123</div>,document.querySelector("#other"))}
Fragment

类似于vue中的 template,。。。

 <Fragment></Fragment>
react中的严格模式
// 被strictMode 标签包裹就会使用严格模式<StrictMode><App/>
</StrictMode>

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

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

相关文章

js--高阶函数之参数归一化

一、前言 参数归一化&#xff1a;是我们软件开发里一个非常重要且实用的技巧&#xff0c;用的好极大简化代码同时提升代码的可阅读性和可维护性。以下我用日期格式化为例&#xff0c;演示一下参数归一化的技巧。 二、日期格式化实例 /*** 辅助格式化函数* param {string|functi…

均值、期望、方差、标准差与协方差:基础概念解析

均值、期望、方差、标准差与协方差&#xff1a;基础概念解析 在统计学和数据分析中&#xff0c;均值、期望、方差、标准差和协方差是描述数据分布和关系的基本工具。理解这些概念有助于我们更好地分析和处理数据。本文将详细讲解这些概念的定义、计算方法及其在实际应用中的意…

shell基础

一、理解bash基础 默认的Linux shell——Bash&#xff08;Bourne Again SHell&#xff09;可以通过命令控制系统&#xff0c;执行文件操作&#xff0c;或者启动应用程序。它可以在命令行上交互式使用&#xff0c;或者你可以创建一个包含多个shell命令的文件&#xff0c;并像启…

js树状结构,自叶到根统计各级数量

$($(".tree-item").get().reverse()).each(function () {let self $(this).find("span").text()let prev $(this).parent(".two").prevAll(".tree-item").find("span").text()self self ? self : 0prev prev ? prev :…

学习threejs,使用JSON格式保存和加载整个场景

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE toJSON()方法 二、&a…

论文1—《基于卷积神经网络的手术机器人控制系统设计》文献阅读分析报告

论文报告&#xff1a;基于卷积神经网络的手术机器人控制系统设计 摘要 本研究针对传统手术机器人控制系统精准度不足的问题&#xff0c;提出了一种基于卷积神经网络的手术机器人控制系统设计。研究设计了控制系统的总体结构&#xff0c;并选用PCI插槽上直接内插CAN适配卡作为上…

SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“

SLF4J常见问题 导入依赖&#xff1a; <dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version> </dependency> <dependency><groupId>org.slf4j</groupId><arti…

资产管理系统:SpringBoot技术驱动

4系统概要设计 4.1概述 系统设计原则 以技术先进、系统实用、结构合理、产品主流、低成本、低维护量作为基本建设原则&#xff0c;规划系统的整体构架. 先进性&#xff1a; 在产品设计上&#xff0c;整个系统软硬件设备的设计符合高新技术的潮流&#xff0c;媒体数字化、压缩、…

YOLO可视化界面,目标检测前端页面。

使用PySide6/QT实现YOLOv5/v8可视化GUI页面 在人工智能和计算机视觉领域&#xff0c;YOLO&#xff08;You Only Look Once&#xff09;是一种广泛使用的实时目标检测算法。为了直观地展示YOLO算法的检测效果&#xff0c;我们可以使用Python中的PySide6库来创建一个简单的GUI应…

使用vuex动态设置全局字号

1.安装vuex npm install vuexnext --save 2.编写字号设置样式 // 定义字号变量 :root {--font-size: 18px;--font-size-step1: 16px;--font-size-step2: 14px;--font-size-step3: 12px; } // 定义样式&#xff08;全局样式文件&#xff09; body, page {font-size: var(--fo…

编程爱好者的福音:实用技巧与教程

引言 你是否曾经因为代码无法正常运行而感到挫败&#xff1f;或者在面对一行行复杂的代码时&#xff0c;不知道从何下手&#xff1f;编程&#xff0c;这项充满挑战与创造力的技能&#xff0c;往往让人既爱又恨。无论你是刚刚入门的初学者&#xff0c;还是已经具备一定经验的开发…

了解bootstrap改造asp.net core MVC的样式模板

我们都知道&#xff0c;在使用默认的asp.net core MVC模板建立项目的时候&#xff0c;里面的样式是已经事先被写好了的。一般来说都在css目录下的site.css和bootstrap.css及下面的bootstrap.min.css中。我们打开bootstrap这些样式文件&#xff0c;里面有大量的样式类的定义&…

通过使用 FFmpeg 提取某站视频 MV 中的音频为 MP3

无论是为了个人收藏、制作播客还是作为背景音乐&#xff0c;将视频中的音频提取出来都是一个非常实用的技能。本教程中简鹿办公将介绍两种方法来实现这一目标&#xff1a;一种是通过命令行工具 FFmpeg&#xff0c;另一种是使用图形界面工具 - 简鹿音频格式转换器。 使用 FFmpeg…

探秘国际数字影像产业园:数字化转型之路

数字化园区的概念正日益受到全球瞩目&#xff0c;这不仅是科技进步的必然产物&#xff0c;更是现代经济发展的迫切需求。对于国际数字影像产业园而言&#xff0c;打造数字化园区意味着通过尖端科技手段&#xff0c;全面提升园区的管理效率、服务质量及入驻企业和居民的生活体验…

外包干了2年,快要废了。。

先说一下自己的情况&#xff0c;普通本科&#xff0c;在外包干了2年多的功能测试&#xff0c;这几年因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不能够在这样蹉跎下去了&#xff0c;长时间呆在一个舒适的环境真的会让一…

5G的发展演进

5G发展的驱动力 什么是5G [远程会议&#xff0c;2020年7月10日] 在来自世界各地的政府主管部门、电信制造及运营企业、研究机构约200多名会议代表和专家们的共同见证下&#xff0c;ITU-R WP 5D#35e远程会议宣布3GPP 5G技术&#xff08;含NB-IoT&#xff09;满足IMT-2020 5G技…

【C++打怪之路Lv14】- “多态“篇

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;重生之我在学Linux&#xff0c;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持…

Github 2024-11-05 Python开源项目日报Top10

根据Github Trendings的统计,今日(2024-11-05统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10HTML项目1TypeScript项目1系统设计指南 创建周期:2507 天开发语言:Python协议类型:OtherStar数量:241693 个Fork数量:42010 次…

如何从 Android 图库中恢复误删除的照片

如果您正在阅读这篇文章&#xff0c;那么您肯定意外地从 Android 设备中删除了照片。并且您正在寻找一种简单的方法来恢复 Android 图库中已删除的照片。 从图库恢复已删除的照片 随着技术的进步&#xff0c;现在使用单个设备&#xff08;即 Android 手机&#xff09;&#xf…

ESP-HaloPanel:用 ESP32-C2 打造超低成本智能家居面板

项目简介 在生活品质日益提升的今天&#xff0c;智能家居系统已经走进了千家万户&#xff0c;并逐渐成为现代生活的一部份。与此同时&#xff0c;一款设计精致、体积轻盈、操作简便的全屋智能家居控制面板&#xff0c;已经成为众多家庭的新宠。这种高效、直观的智能化的解决方…