Day08React——第八天

news/2024/5/19 5:53:06

useEffect

概念:useEffect 是一个 React Hook 函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送AJAx请求,更改daom等等

需求:在组件渲染完毕后,立刻从服务器获取频道列表数据并显示到页面

语法:useEffect( ()=>{},[] )

参数1是一个函数,可以把它叫做副作用函数,在函数内部可以放置要执行的操作

操作2是一个数组(可选参),在数组里放置依赖项,不同依赖项会影响第一个参数函数的执行,当是一个空数组的时候,副作用函数只会在组件渲染完毕之后执行一次

React 18 中的 useEffect hook 没有依赖项时,表示该 effect 不依赖于任何状态或 props 的变化,只在组件挂载和卸载时执行一次。这与 React 17 中的类式组件中 componentDidMount 和 componentWillUnmount 生命周期方法的功能类似。

当 useEffect hook 中传入一个空数组作为依赖项时,表示该 effect 只在组件挂载时执行一次,类似于 React 17 中的 componentDidMount 生命周期方法。

而当 useEffect hook 中传入特定的依赖项时,表示该 effect 会在这些依赖项发生变化时执行。这与 React 17 中类式组件中 componentDidUpdate 生命周期方法的功能类似,可以根据特定的依赖项来触发 effect 的执行。

export default function App() {const [count, updateCount] = useState(0);// 空数组依赖项 componentDidMount 只在初始化渲染一次useEffect(() => {async function getList() {const res = await fetch(URL);const jsonRes = await res.json();console.log(jsonRes);}getList();}, []);//没有依赖项 componentDidMount  初始渲染和组件更新时执行useEffect(() => {console.log(99999);});// 添加特点依赖项 componentDidUpdateuseEffect(() => {console.log("couont 更新了");}, [count]);return (<div>App<div>{count}</div><buttononClick={() => {updateCount(count + 1);}}>+1</button></div>);
}

清除副作用

在useEffect 中编写的由渲染本身引起的对接组件外部的操作,叫做副作用模式,比如在useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器卸载掉,这个过程就是清理副作用

//清除副作用
function Zi() {useEffect(() => {const timer = setInterval(() => {console.log("打印中......");}, 1000);return () => {clearInterval(timer);};}, []);return <div>this is Zi component</div>;
}export default function App() {const [show, ifShow] = useState(true);return (<div>App{show && <Zi />}<buttononClick={() => {ifShow(false);}}>卸载组件</button></div>);

自定义 hook

概念:自定义Hook 是use打头的函数,通过自定义hook函数实现逻辑的封装复用

封装自定义hook思路:

  1. 声明一个以use打头的函数
  2. 把函数体内可复用的逻辑(只要是可复用的逻辑)
  3. 把组件中用到的状态或方法回调return出去
  4. 组件调用结构赋值
function useShow() {const [show, updateShow] = useState(true);const ifShow = () => {updateShow(!show);};return {show,ifShow,};
}export default function App() {const { show, ifShow } = useShow();console.log(show);return (<div>{show && <div>this is app</div>}<button onClick={ifShow}>click</button></div>);
}

Redux

Redux 是React最常用的集中状态管理工具,类似于Vue中的Pinia(Vuex),可以独立于框架运行 作用:通过集中管理的方式管理应用的状态

基本使用

子模块

import {createSlice} from '@reduxjs/toolkit'const counterStore = createSlice({
// 模块名name: "counter",
// 初始数据initialState: {count: 0,},
// 修改数据的同步方法reducers: {addCount(state) {state.count++;},saveCount(state) {state.count--;},},
});//  结构出actionCreater
const { addCount, saveCount } = counterStore.actions//获取redcer 函数
const reducer = counterStore.reducer;
// 导出
export {addCount,saveCount}
export default reducer;

index.js 模块总入口

import { configureStore } from "@reduxjs/toolkit";import counterReducer from "./modules/counterStore";export default configureStore({reducer: {// 注册子模块counter: counterReducer,},
});

index.js 将store注入react中

import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import { Provider } from "react-redux";
import store from "./store";const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(// 使用中间件链接 将store注入 react中<Provider store={store}><App /></Provider>
);

app.js 页面组件使用

import React from 'react'
import { useSelector, useDispatch } from "react-redux";
import { addCount, saveCount } from "./store/modules/counterStore.js";export default function App() {// 通过useSelector获取 store上的数据const { count } = useSelector((state) => state.counter);//   提交action传参const actions = useDispatch();return (<div><buttononClick={() => {actions(saveCount());}}>-</button><div>{count}</div><buttononClick={() => {actions(addCount());}}>+</button></div>);
}

redux 同步方法参数

在reducers的同步修改方法中添加action对象参数,在调用actionCreater的时候传递参数,参数会被传递到action对象payload属性上

const counterStore = createSlice({// 模块名name: "counter",// 初始数据initialState: {count: 0,},// 修改数据的同步方法reducers: {addCount(state, options) {state.count += options.payload;},saveCount(state, options) {state.count -= options.payload;},},
});

异步方法

创建模块

import { createSlice } from "@reduxjs/toolkit";
import axios from "axios";const channeStore = createSlice({// 模块名name: "channe",// 初始数据initialState: {list: [],},reducers: {getList(state, options) {state.list = options.payload;},},
});//  结构出actionCreater
const { getList } = channeStore.actions;async function asyncGetList(actions) {const {data: {data: { channels },},} = await axios.get("http://geek.itheima.net/v1_0/channels");actions(getList(channels));
}//获取redcer 函数
const reducer = channeStore.reducer;
// 导出
export { asyncGetList };export default reducer;

app页面上使用

export default function App() {const actions = useDispatch();useEffect(() => {asyncGetList(actions);}, []);return (<div><ul>{list.map((i) => {return <div key={i.id}>{i.name}</div>;})}</ul></div></div>);
}


http://www.mrgr.cn/p/20806204

相关文章

软件行业中的蓝海领域有哪些?

一、什么是蓝海&#xff1f; 蓝海&#xff0c;指的是未知的市场空间。这个概念相对于“红海”而言&#xff0c;红海则是指已知的市场空间。 企业要启动和保持获利性增长&#xff0c;就必须超越产业竞争&#xff0c;开创全新市场&#xff0c;这其中包括两块&#xff1a;一块是…

裤裤带你一起学C语言内存函数啦!

目录 1.memcpy的使用和模拟实现 2.memmove使用和模拟实现 3.memset函数的使用 4.memcmp函数的使用 内存函数在<string.h>库中&#xff0c;我们使用内存函数必须先引入<string.h>头文件 1.memcpy的使用和模拟实现 memcpy的函数原型如下&#xff1a; void * m…

20231325 贾罗祁 实验三《Python程序设计》实验报告

20231325贾罗祁 2023-2024-2《Python程序设计》实验三报告 课程:《Python程序设计》 班级: 2313 姓名: 贾罗祁 学号: 20231325 实验教师:王志强 实验日期:2024年4月17日 必修/选修: 公选课 1.实验内容创建服务端和客户端,服务端在特定端口监听多个客户请求。 客户端和服…

2024中国内燃机展-北京汽车发动机零部件展

2024第二十三届中国国际内燃机与零部件展览会 由中国内燃机工业协会主办、中国机床专用技术设备有限公司、汽车工艺装备成套开发集团协办的2024中国国际内燃机及动力装备博览会&#xff08;简称“动博会”&#xff09;将于2024年10月11日-13日在亦创国际会展中心隆重举办。本届…

mORMot2 的 Logger日志

mORMot2 的 Logger日志 Logger 很多框架都有,简单的实现就是一个队列加一根线,有复杂的,QDAC里面涉及的就很巧妙,本来QDAC就是个线程框架,所以也有先天优势。 在mORMot 里面自然也有日志实现,它设计的比较麻烦。mORMot 的Logger 初始化beginTSynLog.Family.Level := LOG_…

Servlet 详解

1. Servlet 1.1 Servlet 是什么 Servlet 就是 Tomcat 这个 HTTP 服务器提供给 Java 的一组 API&#xff0c;根据 用户不同 /时间不同 /输入的参数不同,来构建动态页面。不必关注 Socket, HTTP协议格式, 多线程并发等技术细节, 降低了 web app 的开发门槛, 提高了开发效率。 …

C#下使用正则表达式

常用元字符字符 描述\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,n 匹配字符 "n"。\n 匹配一个换行符。序列 \\ 匹配 "\" 而 "\(" 则匹配 "("。^ 匹配输入字符串的开始位置。如果…

平衡二叉树(AVLTree)

AVLTree 1、树的分类2、平衡二叉树2.1、构建一个平衡二叉树2.2、删除节点2.3、搜索方式2.3.1、广度优先搜索&#xff08;BFS&#xff09;2.3.2、深度优先搜索&#xff08;DFS&#xff09; 1、树的分类 树形结构是编程当中特别常见的一种数据结构。比如电脑中的文件管理系统就大…

Linux加强篇-Vim编辑器

目录 ⛳️推荐 Vim文本编辑器 编写简单文档 配置主机名称 配置网卡信息 配置软件仓库 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 Vim文本编辑器 在Linux系统中一切都…

数据结构基础第5讲

数据结构基础第5讲 树和二叉树 本章内容:考点一:基本术语 1.数的引入2.树的定义 层次,分支,一对多。互不相交的含义:3.结点的分类结点的度:4.结点的关系树的深度:树中结点最大高度称为树的高度(或树的深度)行兄弟结点:在同一层但不是兄弟的结点路径长度:等于路径所通…

C语言(扫雷游戏)

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

R语言随机森林RandomForest、逻辑回归Logisitc预测心脏病数据和可视化分析|附代码数据

全文链接:http://tecdat.cn/?p=22596 最近我们被客户要求撰写关于预测心脏病的研究报告,包括一些图形和统计输出。 本报告是对心脏研究的机器学习/数据科学调查分析。更具体地说,我们的目标是在心脏研究的数据集上建立一些预测模型,并建立探索性和建模方法。但什么是心脏研…

数据结构基础第3讲

数据结构基础第3讲 栈及其应用 内容考点一:栈的概念 1.顺序栈的定义:出栈顺序情况计算 给定n个元素,出栈顺序的情形满足卡特兰数,计算公式: \[\frac{C_{2n}^{n}}{n+1} \]例题: 确定第一个出栈的谁。有两种可能: 找带头大哥。栈的顺序存储结构 顺序栈操作顺序栈4要素栈空条…

数据结构基础第4讲

数据结构基础第4讲 队列 内容考点一: 队列概念 代码不考 1.队列的定义考点二:顺序队列的定义考点三顺序队列的性质与操作 4要素:考点四:循环队列的定义 由于顺序队列会存在假溢出问题,引入循环队列。 假溢出:描述:考点五:循环队列的操作判断空满:性质: 考频75%元素个…

深入探索GDB:Linux下强大的调试神器

目录 一、GDB简介&#xff1a;源码级调试的基石 二、GDB基础操作&#xff1a;从入门到熟练 启动与基本命令 三、GDB进阶功能&#xff1a;解锁更深层次的调试能力 1. 回溯追踪&#xff1a;洞察调用栈 2. 动态内存检测&#xff1a;揪出内存问题 3. 条件断点与观察点&#…

【视频】N-Gram、逻辑回归反欺诈模型文本分析招聘网站欺诈可视化|附数据代码

原文链接:https://tecdat.cn/?p=36028 原文出处:拓端数据部落公众号 随着互联网的快速发展,招聘网站已成为求职者与雇主之间的重要桥梁。然而,随之而来的欺诈行为也日益猖獗,给求职者带来了极大的困扰和风险。因此,如何帮助客户有效地识别和防范招聘网站上的欺诈行为,已…

02 IO口的操作

目录前言一、IO的概念1.IO接口2.IO端口二、CPU和外设进行数据传输的方法1.程序控制方式1.1 无条件1.2 查询方式2.中断方式3.DMA方式一、方法介绍和代码编写1.前置知识2.程序方式1.1 无条件方式1.1.1 打开对应的GPIO口1.1.2 初始化对应的GPIO引脚1.1.2.1 推挽输出1.1.2.2 开漏输…

vmstat命令详解

一、参数信息 vmstat 命令是用于报告虚拟内存统计信息的工具&#xff0c;常用于 Unix/Linux 系统上。它可以提供关于系统资源使用情况的详细信息&#xff0c;包括 CPU、内存、虚拟内存、磁盘、系统调用等方面的统计数据。以下是常见的 vmstat 命令参数的详解&#xff1a; vms…

题解 UOJ577【[ULR #1] 打击复读】

别学基本子串结构(这篇没写完)题解 UOJ577【[ULR #1] 打击复读 reference https://www.cnblogs.com/crashed/p/17382894.html https://www.cnblogs.com/sizeof127/articles/17579027.html 字符串——黄建恒,广东实验中学 题目描述 为了提升搜索引擎的关键词匹配度以加大访问…

VUE识别图片文字OCR(tesseract.js)

效果:1&#xff1a; 效果图2&#xff1a; 一、安装tesseract.js npm i tesseract.js 二、静态页面实现 <template><div><div style"marginTop:100px"><input change"handleChage" type"file" id"image-input"…