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);
  });

  // 添加特点依赖项 componentDidUpdate
  useEffect(() => {
    console.log("couont 更新了");
  }, [count]);

  return (
    <div>
      App
      <div>{count}</div>
      <button
        onClick={() => {
          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 />}
      <button
        onClick={() => {
          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>
      <button
        onClick={() => {
          actions(saveCount());
        }}
      >
        -
      </button>
      <div>{count}</div>
      <button
        onClick={() => {
          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>
  );
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每天五分钟机器学习:神经网络模型参数的选择

本文重点 在深度学习和人工智能的浪潮中,神经网络作为其中的核心力量,发挥着举足轻重的作用。然而,神经网络的性能并非一蹴而就,而是需要经过精心的参数选择和调优。 神经网络由大量的神经元组成,每个神经元之间通过权重进行连接。这些权重,以及神经元的偏置、激活函数…

Adobe Acrobat PDF 2024

Adobe Acrobat PDF 2024正式发布&#xff01;支持Windows和macOS系统&#xff0c;新界面做了轻微调整。 下载地址 Windows客户端&#xff1a;https://www.123pan.com/s/f43eVv-GKZKd.html macOS客户端&#xff1a;https://www.123pan.com/s/f43eVv-PKZKd.html

idea在controller或者service使用ctrl+alt+b进入方法后,如何返回到 进入前的那一层

idea在controller或者service使用ctrlaltb进入方法后&#xff0c;如何返回到进入方法的最外层 解决方案使用 ctrlalt ← /→← /→ 键盘上的左右键盘

数据结构练习-算法与时间复杂度

----------------------------------------------------------------------------------------------------------------------------- 1. 设n是描述问题规模的非负整数&#xff0c;下列程序段的时间复杂度是( )。 x0;while(n>(x1)*(x1)xx1; A.O(logn) B.O(n^(1/2)) C.O(n)…

【周总结】总结下这周的工作、(hashmap)知识巩固等

总结 这周开发任务已经全部结束&#xff0c;主要是在修改一些 jira 问题 需要反思的是&#xff0c;中间改造接口时&#xff0c;数据库表需要新增一个字段&#xff0c;这个 sql 脚本忘记加到 basetable.sql 脚本里面了&#xff0c;这样如果是新建的项目&#xff0c;创建的时候不…

百万级别mysql性能耗时自测

注&#xff1a;实际情况会因建表语句和服务器的配置造成偏差 测试环境 &#xff1a;8核CPU 16G运行内存 建表语句&#xff1a; CREATE TABLE user (id bigint(11) NOT NULL AUTO_INCREMENT,username varchar(255) COLLATE utf8mb4_bin DEFAULT NULL,birthday varchar(255)…

AppWizard的软件开发GUI的使用记录

前言 这个软件是针对于EmWin6.0以上的这个软件在emWin的基础上又封装了一层,也只提供的API函数.基于消息事件为核心&#xff08;个人理解&#xff09;一些组件的之间的交互可以通过软件界面进行配置,比较方便本次是基于模拟器进行测试记录,观察api 按键和文本之间的关联 通过…

软考141-上午题-【软件工程】-杂题+小结

一、杂题 真题1&#xff1a; 真题2&#xff1a; 真题3&#xff1a; 真题4&#xff1a; 真题5&#xff1a; 真题6&#xff1a; 真题7&#xff1a; 真题8&#xff1a; 真题9&#xff1a; 真题10&#xff1a; 真题11&#xff1a; 真题12&#xff1a; 真题13&#xff1a; 真题14&a…

深入剖析Spring框架:循环依赖的解决机制

你好&#xff0c;我是柳岸花开。 什么是循环依赖&#xff1f; 很简单&#xff0c;就是A对象依赖了B对象&#xff0c;B对象依赖了A对象。 在Spring中&#xff0c;一个对象并不是简单new出来了&#xff0c;而是会经过一系列的Bean的生命周期&#xff0c;就是因为Bean的生命周期所…

05集合-CollectionListSet

Collection体系的特点、使用场景总结 如果希望元素可以重复&#xff0c;又有索引&#xff0c;索引查询要快? 用ArrayList集合, 基于数组的。(用的最多) 如果希望元素可以重复&#xff0c;又有索引&#xff0c;增删首尾操作快? 用LinkedList集合, 基于链表的。 如果希望增…

亚马逊测评自养号策略:手机与PC结合的重要性

亚马逊测评的核心关键技术在于精心培养买家账号&#xff0c;之所以称之为核心关键&#xff0c;原因在于测评下单的首要条件是拥有一个活跃的买家账号。买家账号并非一次性使用&#xff0c;因此&#xff0c;养号过程显得至关重要。然而&#xff0c;在养号的过程中&#xff0c;很…

Python基础03-深入探索Python字典操作

在Python中&#xff0c;字典是一种非常强大和灵活的数据结构&#xff0c;可以存储键值对&#xff0c;并提供了许多方法来操作这些键值对。本文将深入探讨Python字典的各种操作&#xff0c;包括如何创建、修改、合并和查找字典中的元素。 1. 创建字典 要创建一个字典&#xff…

【数字电路与系统】【北京航空航天大学】实验:时序逻辑设计——三色灯开关(三)、功能仿真测试

本次实验&#xff08;一&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天大学】实验&#xff1a;时序逻辑设计——三色灯开关&#xff08;一&#xff09;、实验指导书 本次实验&#xff08;二&#xff09;见博客&#xff1a;【数字电路与系统】【北京航空航天…

【gdb调试】在ubuntu环境使用gdb调试一棵四层二叉树的数据结构详解

目录 &#x1f31e;1. 整体思路 &#x1f31e;2. 准备内容 &#x1f33c;2.1 配置.c文件 &#x1f33c;2.2 准备测试程序 &#x1f33c;2.3 GDB调试基础 &#x1f31e;3. GDB调试四层二叉树 &#x1f33c;3.1 测试程序分析 &#x1f33c;3.2 gdb分析 &#x1f33b;1. …

到2031年,5G服务市场预计将超过9194亿美元

根据 Transparency Market Research 最近的一份报告&#xff0c;到 2031 年&#xff0c;全球 5G 服务市场预计将超过 9194 亿美元。 这相当于 30.8% 的复合年增长率 (CAGR)&#xff0c;预计 2022 年市场价值将达到 827 亿美元。 随着 5G 技术的吸引力日益增强&#xff0c;它正在…

真实世界的密码学(四)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十六章&#xff1a;加密何时何地失败 本章涵盖 使用加密时可能遇到的一般问题 遵循烘烤良好的加密的要点 加密从业者的危险和责任 问候…

UE5、CesiumForUnreal实现建筑白模生成及白模美化功能

1.实现目标 在专栏上篇文章基于GeoJson文件生成城市级白模(本文建筑白模数量12w+)的基础上修改,计算法线和纹理坐标,并基于特定材质进行美化,美化后的白模GIF动图如下所示: 文章目录 1.实现目标2.实现过程2.1 基于Cesium材质美化2.1.1实现原理2.1.2 C++代码2.1.3 蓝图应…

网络基础先导

前言&#xff1a;最好在牢固前面几大件&#xff08;编程语言、数据结构、操作系统&#xff09;&#xff0c;并且您有一个服务器的基础上&#xff08;我使用的是腾讯云中配置最低的服务器&#xff09;再来学习本系列的网络知识。 1.网络发展简要 下面就是简单提及一些概念而已&…

JDK17在Windows安装以及环境变量配置(超详细的教程)

目录 一、JDK17的安装包下载 二、安装JDK17 第一步&#xff1a;运行JDK的EXE文件 第二步&#xff1a;选择下一步 第三步&#xff1a;选择安装目录 第四步&#xff1a;安装完成 三、配置JDK17的环境变量 第一步&#xff1a;打开系统属性界面 第二步&#xff1a;打开高级…

深度学习系列64:数字人openHeygen详解

1. 主流程分析 从inference.py函数进入&#xff0c;主要流程包括&#xff1a; 1&#xff09; 使用cv2获取视频中所有帧的列表&#xff0c;如下&#xff1a; 2&#xff09;定义Croper。核心代码为69行&#xff1a;full_frames_RGB, crop, quad croper.crop(full_frames_RGB)。…