Day08React——第八天

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.mzph.cn/bicheng/1389.shtml

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

相关文章

iOS RACScheduler 使用详解

RACScheduler 是 ReactiveCocoa 框架中的一个关键组件&#xff0c;用于在 iOS 开发中管理任务的并发执行。以下是如何详细使用 RACScheduler 的指南&#xff0c;以 Markdown 格式展示。 主要调度器 主线程调度器 用于在主线程上执行任务&#xff0c;通常用于 UI 更新操作。 …

Java:二叉树(1)

从现在开始&#xff0c;我们进入二叉树的学习&#xff0c;二叉树是数据结构的重点部分&#xff0c;在了解这个结构之前&#xff0c;我们先来了解一下什么是树型结构吧&#xff01; 一、树型结构 1、树型结构简介 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>…

通用类的中文实体命名识别

中文命名实体识别&#xff08;Chinese NER&#xff09;调研&#xff1a;https://github.com/taishan1994/awesome-chinese-ner 论文&#xff1a;Unified Structure Generation for Universal Information Extraction &#xff08;一统实体识别、关系抽取、事件抽取、情感分析&a…

TCP协议学习记录

TCP协议学习记录 简述 对TCP有诸多疑惑的地方&#xff1a; 1、TCP和socket的关系 2、TCP客户端和服务端如何区分 3、TCP连接的两端&#xff0c;端口号需要一致吗 什么是socket 一种编程抽象 编写程序时&#xff0c;利用socket可以使用TCP&#xff1b;假设现在已经将TCP协议…

Matlab无基础快速上手1(遗传算法框架)

本文用经典遗传算法框架模板&#xff0c;对matlab新手友好&#xff0c;快速上手看懂matlab代码&#xff0c;快速应用实践&#xff0c;源代码在文末给出。 基本原理&#xff1a; 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;是一种受生物学启发的优化算法…

在Gtiee搭建仓库传代码/多人开发/个人代码备份---git同步---TortoiseGit+TortoiseSVN

文章目录 前言1.安装必要软件2. Gitee建立新仓库git同步2.1 Gitee建立新仓库2.2 Gitee仓库基本配置2.3 Git方式进行同步 3. TortoiseGitTortoiseSVN常用开发方式3.1 秘钥相关3.2 TortoiseGit拉取代码TortoiseGit提交代码 4. 其他功能探索总结 前言 正常企业的大型项目都会使用…

TR5 - Transformer的位置编码

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目录 前言什么是位置编码1. 定义2. 三角函数3. 位置编码公式4. 位置编码示例 可视化理解位置编码1. 代码实现2. 观察不同位置对应的曲线3. 整句话的位置编码可…

排序 “贰” 之选择排序

目录 ​编辑 1. 选择排序基本思想 2. 直接选择排序 2.1 实现步骤 2.2 代码示例 2.3 直接选择排序的特性总结 3. 堆排序 3.1 实现步骤 3.2 代码示例 3.3 堆排序的特性总结 1. 选择排序基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个…

Guitar Pro简谱输入方法 Guitar Pro简谱音高怎么调整,Guitar Pro功能介绍

一、新版本特性概览 Guitar Pro v8.1.1 Build 17在保留了前版本强大功能的基础上&#xff0c;进一步优化了用户体验和功能性能。新版本主要更新包括以下几个方面&#xff1a; 界面优化&#xff1a;新版界面更加简洁美观&#xff0c;操作更加便捷&#xff0c;即使是初学者也能快…

aixcoder介绍

最近了解了一下国内开源的aixcoder&#xff0c;代码自动补全的工具&#xff0c;可以理解为国内版开源的的copilot。 一开始公司给提供了一个代码自动补全的插件&#xff0c;这几天发现原来用的就是aixcoder&#xff0c;所以专门了解了一下。。 介绍 aiXcoder 是一款基于深度…

在线拍卖系统,基于SpringBoot+Vue+MySql开发的在线拍卖系统设计和实现

目录 一. 系统介绍 二. 功能模块 2.1. 管理员功能模块 2.2. 用户功能模块 2.3. 前台首页功能模块 2.4. 部分代码实现 一. 系统介绍 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系…

Docker - 简介

原文地址&#xff0c;使用效果更佳&#xff01; Docker - 简介 | CoderMast编程桅杆https://www.codermast.com/dev-tools/docker/docker-introduce.html Docker是什么&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;基于 Go 语言 并遵从 Apache2.0 协议开源。 D…

vulfocus靶场couchdb 权限绕过 (CVE-2017-12635)

Apache CouchDB是一个开源数据库&#xff0c;专注于易用性和成为"完全拥抱web的数据库"。它是一个使用JSON作为存储格式&#xff0c;JavaScript作为查询语言&#xff0c;MapReduce和HTTP作为API的NoSQL数据库。应用广泛&#xff0c;如BBC用在其动态内容展示平台&…

串口RS485

1.原理 全双工&#xff1a;在同一时刻可以同时进行数据的接收和数据的发送&#xff0c;两者互不影响 半双工&#xff1a;在同一时刻只能进行数据的接收或者数据的发送&#xff0c;两者不能同时进行 差分信号幅值相同&#xff0c;相位相反&#xff0c;有更强的抗干扰能力。 干…

vlan的学习笔记1

vlan&#xff1a; 1.一般情况下:以下概念意思等同: 一个vlan一个广播域 一个网段 一个子网 2.一般情况下: &#xff08;1&#xff09;相同vlan之间可以直接通信&#xff0c;不同vlan之间不能直接通信! &#xff08;2&#xff09;vlan技术属于二层技术&…

C语言中, 文件包含处理,#include< > 与 #include ““的区别

文件包含处理 指一个源文件可以将另外一个文件的全部内容包含进来 &#xff23;语言提供了#include命令用来实现文件包含的操作 #include< > 与 #include ""的区别 <> 表示系统直接按系统指定的目录检索 "" 表示系统先在 "" 指定…

Rust序列化和反序列化

Rust 编写python 模块 必备库 docker 启动 nginx 服务 NGINX 反向代理配置

MySQL下载与安装

文章目录 1&#xff1a;MySQL下载与安装2&#xff1a;配置环境变量3&#xff1a;验证是否安装成功 1&#xff1a;MySQL下载与安装 打开MySQL官网&#xff0c;MySQL 下载链接选择合适的版本和操作系统&#xff0c;页面跳转之后选择No thanks, just start my download.等待下载即…

linux中/etc/hosts文件的内容和功能

更准确的说是主机和ip地址映射绑定配置文件 用于主机名解析成ip地址的 转换配置 效果&#xff1a; 这个东西是局域网下面的解析&#xff0c;老师说是本地局域网解析 windows对应的就是

笔试狂刷--Day2(模拟高精度算法)

大家好,我是LvZi,今天带来笔试狂刷--Day2(模拟高精度算法) 一.二进制求和 题目链接:二进制求和 分析: 代码实现: class Solution {public String addBinary(String a, String b) {int c1 a.length() - 1, c2 b.length() - 1, t 0;StringBuffer ret new StringBuffer()…