React 全栈体系(十五)

news2024/11/27 1:31:39

第八章 React 扩展

一、setState

1. 代码

/* index.jsx */
import React, { Component } from 'react'

export default class Demo extends Component {

	state = {count:0}

	add = ()=>{
		//对象式的setState
		/* //1.获取原来的count值
		const {count} = this.state
		//2.更新状态
		this.setState({count:count+1},()=>{
			console.log(this.state.count);
		})
		//console.log('12行的输出',this.state.count); //0 */

		//函数式的setState
		this.setState( state => ({count:state.count+1}))
	}

	render() {
		return (
			<div>
				<h1>当前求和为:{this.state.count}</h1>
				<button onClick={this.add}>点我+1</button>
			</div>
		)
	}
}

2. 总结

  • setState 更新状态的 2 种写法
(1). setState(stateChange, [callback])------对象式的setState
     1.stateChange为状态改变对象(该对象可以体现出状态的更改)
     2.callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用

(2). setState(updater, [callback])------函数式的setState
     1.updater为返回stateChange对象的函数。
     2.updater可以接收到state和props。
     4.callback是可选的回调函数, 它在状态更新、界面也更新后(render调用后)才被调用。
总结:
	1.对象式的setState是函数式的setState的简写方式(语法糖)
	2.使用原则:
	(1).如果新状态不依赖于原状态 ===> 使用对象方式
	(2).如果新状态依赖于原状态 ===> 使用函数方式
	(3).如果需要在setState()执行后获取最新的状态数据,
	要在第二个callback函数中读取

二、lazyLoad

1. 代码

/* index.jsx */
import React, { Component,lazy,Suspense} from 'react'
import {NavLink,Route} from 'react-router-dom'

// import Home from './Home'
// import About from './About'

import Loading from './Loading'
const Home = lazy(()=> import('./Home') )
const About = lazy(()=> import('./About'))

export default class Demo extends Component {
	render() {
		return (
			<div>
				<div className="row">
					<div className="col-xs-offset-2 col-xs-8">
						<div className="page-header"><h2>React Router Demo</h2></div>
					</div>
				</div>
				<div className="row">
					<div className="col-xs-2 col-xs-offset-2">
						<div className="list-group">
							{/* 在React中靠路由链接实现切换组件--编写路由链接 */}
							<NavLink className="list-group-item" to="/about">About</NavLink>
							<NavLink className="list-group-item" to="/home">Home</NavLink>
						</div>
					</div>
					<div className="col-xs-6">
						<div className="panel">
							<div className="panel-body">
								<Suspense fallback={<Loading/>}>
									{/* 注册路由 */}
									<Route path="/about" component={About}/>
									<Route path="/home" component={Home}/>
								</Suspense>
							</div>
						</div>
					</div>
				</div>
			</div>
		)
	}
}

2. 总结

/* Loading/index.jsx */
import React, { Component } from 'react'

export default class Loading extends Component {
	render() {
		return (
			<div>
				<h1 style={{backgroundColor:'gray',color:'orange'}}>Loading....</h1>
			</div>
		)
	}
}
//1.通过React的lazy函数配合import()函数动态加载路由组件 ===> 路由组件代码会被分开打包
const Login = lazy(()=>import('@/pages/Login'))

//2.通过<Suspense>指定在加载得到路由打包文件前显示一个自定义loading界面
<Suspense fallback={<h1>loading.....</h1>}>
    <Switch>
        <Route path="/xxx" component={Xxxx}/>
        <Redirect to="/login"/>
    </Switch>
</Suspense>

三、Hooks

1. React Hook/Hooks 是什么?

  • Hook 是 React 16.8.0 版本增加的新特性/新语法
  • 可以让你在函数组件中使用 state 以及其他的 React 特性

2. 三个常用的 Hook

  • State Hook: React.useState()
  • Effect Hook: React.useEffect()
  • Ref Hook: React.useRef()

3. stateHook

请添加图片描述
请添加图片描述

3.1 代码
/* src/App.jsx */
import React from "react";

function Demo() {

  const [count, setCount] = React.useState(0);
  const [name, setName] = React.useState("tom");

  //加的回调
  function add() {
    //setCount(count+1) //第一种写法
    setCount((count) => count + 1);
  }

  function changeName() {
    setName("jack");
  }

  return (
    <div>
      <h2>当前求和为:{count}</h2>
      <h2>我的名字是:{name}</h2>
      <button onClick={add}>点我+1</button>
      <button onClick={changeName}>点我改名</button>
    </div>
  );
}

export default Demo;
3.2 总结
(1). State Hook让函数组件也可以有state状态, 并进行状态数据的读写操作
(2). 语法: const [xxx, setXxx] = React.useState(initValue)
(3). useState()说明:
      参数: 第一次初始化指定的值在内部作缓存
      返回值: 包含2个元素的数组, 第1个为内部当前状态值, 第2个为更新状态值的函数
(4). setXxx()2种写法:
      setXxx(newValue): 参数为非函数值, 直接指定新的状态值, 内部用其覆盖原来的状态值
      setXxx(value => newValue): 参数为函数, 接收原本的状态值, 返回新的状态值, 内部用其覆盖原来的状态值

4. EffectHook

4.1 代码
/* src/App.jsx */
import React from "react";
import ReactDOM from "react-dom";

function Demo() {

  const [count, setCount] = React.useState(0);

  React.useEffect(() => {
    let timer = setInterval(() => {
      setCount((count) => count + 1);
    }, 1000);
    return () => {
      clearInterval(timer);
    };
  });

  //加的回调
  function add() {
    //setCount(count+1) //第一种写法
    setCount((count) => count + 1);
  }

  //卸载组件的回调
  function unmount() {
    ReactDOM.unmountComponentAtNode(document.getElementById("root"));
  }

  return (
    <div>
      <h2>当前求和为:{count}</h2>
      <button onClick={add}>点我+1</button>
      <button onClick={unmount}>卸载组件</button>
    </div>
  );
}

export default Demo;
4.2 总结
(1). Effect Hook 可以让你在函数组件中执行副作用操作(用于模拟类组件中的生命周期钩子)
(2). React中的副作用操作:
        发ajax请求数据获取
        设置订阅 / 启动定时器
        手动更改真实DOM
(3). 语法和说明:
        useEffect(() => {
          // 在此可以执行任何带副作用操作
          return () => { // 在组件卸载前执行
            // 在此做一些收尾工作, 比如清除定时器/取消订阅等
          }
        }, [stateValue]) // 如果指定的是[], 回调函数只会在第一次render()后执行

(4). 可以把 useEffect Hook 看做如下三个函数的组合
        componentDidMount()
        componentDidUpdate()
    	componentWillUnmount()

5. RefHook

请添加图片描述

5.1 代码
/* src/App.jsx */
import React from "react";
import ReactDOM from "react-dom";

//类式组件
/* class Demo extends React.Component {

	state = {count:0}

	myRef = React.createRef()

	add = ()=>{
		this.setState(state => ({count:state.count+1}))
	}

	unmount = ()=>{
		ReactDOM.unmountComponentAtNode(document.getElementById('root'))
	}

	show = ()=>{
		alert(this.myRef.current.value)
	}

	componentDidMount(){
		this.timer = setInterval(()=>{
			this.setState( state => ({count:state.count+1}))
		},1000)
	}

	componentWillUnmount(){
		clearInterval(this.timer)
	}

	render() {
		return (
			<div>
				<input type="text" ref={this.myRef}/>
				<h2>当前求和为{this.state.count}</h2>
				<button onClick={this.add}>点我+1</button>
				<button onClick={this.unmount}>卸载组件</button>
				<button onClick={this.show}>点击提示数据</button>
			</div>
		)
	}
} */

function Demo() {
  //console.log('Demo');

  const [count, setCount] = React.useState(0);
  const myRef = React.useRef();

  React.useEffect(() => {
    let timer = setInterval(() => {
      setCount((count) => count + 1);
    }, 1000);
    return () => {
      clearInterval(timer);
    };
  }, []);

  //加的回调
  function add() {
    //setCount(count+1) //第一种写法
    setCount((count) => count + 1);
  }

  //提示输入的回调
  function show() {
    alert(myRef.current.value);
  }

  //卸载组件的回调
  function unmount() {
    ReactDOM.unmountComponentAtNode(document.getElementById("root"));
  }

  return (
    <div>
      <input type="text" ref={myRef} />
      <h2>当前求和为:{count}</h2>
      <button onClick={add}>点我+1</button>
      <button onClick={unmount}>卸载组件</button>
      <button onClick={show}>点我提示数据</button>
    </div>
  );
}

export default Demo;
5.2 总结
(1). Ref Hook可以在函数组件中存储/查找组件内的标签或任意其它数据
(2). 语法: const refContainer = useRef()
(3). 作用:保存标签对象,功能与React.createRef()一样

四、Fragment

1. 使用

<Fragment><Fragment>
<></>

2. 作用

可以不用必须有一个真实的 DOM 根标签了

3. 代码

/* index.jsx */
import React, { Component,Fragment } from 'react'

export default class Demo extends Component {
	render() {
		return (
			<Fragment key={1}>
				<input type="text"/>
				<input type="text"/>
			</Fragment>
		)
	}
}

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

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

相关文章

在Linux中通过docker安装宝塔面板

先在Linux中手动安装docker&#xff0c;然后在docker中安装宝塔面板&#xff0c;并进行docker网络端口映射。 手动安装docker 第一步&#xff0c;卸载旧版本docker。 若系统中已安装旧版本docker&#xff0c;则需要卸载旧版本docker以及与旧版本docker相关的依赖项。 命令&…

深入理解 Spring MVC 的工作原理

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

185_技巧_Power Query(M)语言快捷输入之搜狗输入法设置自定义短语

185_技巧_Power Query(M)语言快捷输入之搜狗输入法设置自定义短语 此前&#xff0c;我们发布过如何通过 QQ拼音输入法 来实现快速的输入Power Query(M) 语言。参考&#xff1a;https://jiaopengzi.com/730.html 今天我们来更新 Power Query(M) 语言在 搜狗输入法 中设置自定义…

iPhone 15首批体验出炉,掉漆、烫手、进灰,口碑严重崩塌

眼看 iPhone 15 系列已经上架&#xff0c;不知道大伙儿剁手了没有&#xff1f; 哦&#xff0c;原来你们也在等首批用户体验反馈啊&#xff01; 随着 22 号正式开售&#xff0c;到目前不少人陆续上手 iPhone 15 系。 咱们也是翻阅了大量贴吧用户反馈、电商平台评论等&#xff…

2023-09-26 LeetCode每日一题(递枕头)

2023-09-26每日一题 一、题目编号 2582. 递枕头二、题目链接 点击跳转到题目位置 三、题目描述 n 个人站成一排&#xff0c;按从 1 到 n 编号。 最初&#xff0c;排在队首的第一个人拿着一个枕头。每秒钟&#xff0c;拿着枕头的人会将枕头传递给队伍中的下一个人。一旦枕…

Python读取Excel每一行为列表—大PK(openpyxl\pandas\xlwings\xlrd)看谁用时少?

目录 背景使用—openpyxl&#xff08;耗时89秒输出&#xff09;使用—pandas&#xff08;耗时44秒输出&#xff09;使用—xlwings&#xff08;耗时15秒输出&#xff09;使用—xlrd&#xff08;耗时47秒输出&#xff09;总结 背景 我们在平常办公的时候&#xff0c;尤其是财务人…

流媒体播放器EasyPlayer.js无法播放H.265的情况是什么原因?该如何解决?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…

C语言 —— 分支语句和循环语句

目录 1. 什么是语句? 2. 分支语句 (选择结构) 2.1 if语句 2.1.1 悬空else 2.1.2 if书写形式的对比 2.1.3 练习 2.2 switch语句 2.2.1 switch的使用 2.2.2 default字句 2.2.3 练习 3. 循环语句 3.1 while循环 3.1.1 while语句中的break和continue break介绍 continue介绍 3.2 f…

Linux配置命令

一&#xff1a;HCSA-VM-Linux安装虚拟机后的基础命令 1.代码命令 1.查看本机IP地址&#xff1a; ip addr 或者 ip a [foxbogon ~]$ ip addre [foxbogon ~]$ ip a 1&#xff1a;<Loopback,U,LOWER-UP> 为环回2网卡 2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP&g…

经典文献阅读之--EGO-Planner(无ESDF的四旋翼局部规划器)

0. 简介 作为局部规划器而言&#xff0c;当机器人或无人机想要避开动态障碍物时。局部规划器就显得尤为重要了。其中基于梯度的规划器被广泛用于四旋翼无人机的局部规划&#xff0c;其中欧几里得符号距离场&#xff08;ESDF&#xff09;对于评估梯度幅度和方向至关重要。然而&…

【数值计算方法】非线性方程(组)和最优化问题的计算方法:非线性方程式求根的二分法、迭代法、Newton 迭代法及其Python实现

目录 一、非线性方程式求根 1、二分法&#xff08;Bisection Method、对分法&#xff09; a. 理论简介 b. python实现 2、迭代法&#xff08;Iterative Method&#xff09; a. 理论简介 b. python实现 3、Newton 迭代法&#xff08;Newtons Method&#xff09; a. 理论…

制作搞笑聊天视频的新神器,全自动搞笑聊天对话视频生成器!

大家都知道&#xff0c;想要在社交媒体上出人头地&#xff0c;搞笑聊天视频是一个绝佳的选择。而如何制作一个搞笑的聊天视频呢&#xff1f;不要担心&#xff0c;今天我要向大家推荐的是一款神奇的搞笑聊天视频生成器&#xff0c;它可以让你轻松一键制作出搞笑对话视频。 搞笑对…

9.2.4 【MySQL】段的结构

段不对应表空间中某一个连续的物理区域&#xff0c;而是一个逻辑上的概念&#xff0c;由若干个零散的页面以及一些完整的区组成。像每个区都有对应的XDES Entry来记录这个区中的属性一样&#xff0c;定义了一个INODE Entry结构来记录段中的属性。 它的各个部分释义如下&#xf…

向AI提问,我是怎么做的?

OpenAI 是一个人工智能研究实验室和技术公司&#xff0c;而 ChatGPT&#xff08;Chatbot GPT&#xff09;是 OpenAI 开发的一种基于自然语言处理技术的聊天机器人模型。它能够理解用户的输入并生成相应的回复&#xff0c;通过模仿人类对话的方式进行交流。但是AI对话与人完全不…

IT数据预警设备监控

信息技术已经成为企业经营的重要支撑。恶意程序、黑客攻击、数据泄露等问题频繁发生&#xff0c;对公司经营影响很大。因此&#xff0c;IT预警监控已经成为公司维护数据安全的主要防御。  IT预警监控是一种基于实时监控公司IT系统&#xff0c;及时发现和处理隐性安全威胁管理…

MySQL强制使用索引的两种方式及优化索引,使用MySQL存储过程创建测试数据。

一、MySQL强制使用索引的两种方式 1、使用 FORCE INDEX 语句&#xff1a; explainselect*fromtbl_test force index (index_item_code)where(item_code between 1 and 1000) and (random between 50000 and 1000000)order byrandomlimit 1; 使用 FORCE INDEX&#xff08;索引…

「华为P60 Pro」只要599元,老牌国产再现骚操作

国内智能手机经过这么些年的洗牌&#xff0c;真正活下来且过得滋润其实也就那屈指可数的几家。 刚开始大家还能拼创意、拼设计&#xff0c;最后发现拼来拼去&#xff0c;还是逃不开同质化命运。 到了现在&#xff0c;也不比啥创意了&#xff0c;干脆堆配置、卷规格一条路走到…

14.TIM输出比较示例程序(PWM驱动LED呼吸灯PWM驱动舵机PWM驱动直流电机)

目录 输出比较相关库函数 PWM驱动LED呼吸灯 PWM驱动舵机 PWM驱动直流电机 输出比较相关库函数 1.OC初始化&#xff08;掌握&#xff09; // 配置输出比较模块&#xff0c;输出比较单元有四个&#xff0c;对应也有四个函数 // 第二个参数是结构体&#xff0c;就是输出比较…

Docker的相关知识介绍以及mac环境的安装

一、什么是Docker 大型项目组件较多&#xff0c;运行环境也较为复杂&#xff0c;部署时会碰到一些问题&#xff1a; 依赖关系复杂&#xff0c;容易出现兼容性问题开发、测试、生产环境有差异 Docker就是来解决这些问题的。Docker是一个快速交付应用、运行应用的技术&#x…

互联网医院牌照|互联网医院牌照审批流程和材料

随着科技的不断进步和社会的发展&#xff0c;互联网医院已经成为了当前的热点。而互联网医院的准入门槛自然也就越来越高。如果您计划成立一个互联网医院&#xff0c;您需要了解申请互联网医院牌照所需要注意的方面以及申请的流程。 一、资质申请前的准备 1、立项阶段准备 在立…