Day08React——第八天

news2024/11/29 6:38:43

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

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

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

相关文章

什么是Rust语言?探索安全系统编程的未来

&#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来 文章目录 &#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来摘要引言正文&#x1f4d8; Rust语言简介&#x1f31f; 发展历程&#x1f3af; Rust的技术意义和优势&#x1f4e6; Rust解决的问题…

HarmonyOS开发实例:【分布式新闻客户端】

介绍 本篇Codelab基于栅格布局、设备管理和多端协同&#xff0c;实现一次开发&#xff0c;多端部署的分布式新闻客户端页面。主要包含以下功能&#xff1a; 展示新闻列表以及左右滑动切换新闻Tab。点击新闻展示新闻详情页。点击新闻详情页底部的分享按钮&#xff0c;发现周边…

Go 之 sync.Mutex 加锁失效现象

我先声明一下&#xff0c;并不是真的加锁失效&#xff0c;而是我之前的理解有误&#xff0c;导致看起来像是加锁失效一样。于是乎记录一下&#xff0c;加深一下印象。 我之前有个理解误区&#xff08;不知道大家有没有&#xff0c;有的话赶紧纠正一下——其实也是因为我这块的…

项目7-音乐播放器5+注册账号

1.前端代码 MAPPER Insert("insert into user(username,password) values (#{username},#{password}) ")Integer insertUserInfo(String username,String password); Service public Result insertUserInfo(String username, String oldpassword,String newpasswo…

算法学习——LeetCode力扣补充篇11(64. 最小路径和、48. 旋转图像 、169. 多数元素、394. 字符串解码、240. 搜索二维矩阵 II )

算法学习——LeetCode力扣补充篇11 64. 最小路径和 64. 最小路径和 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只…

测绘管理与法律法规 | 测绘资质管理办法 | 学习笔记

目录 一、测绘资质概述 二、测绘资质分类与等级 三、审批与管理 四、申请条件 五、审批程序 六、测绘资质证书 七、监督管理 八、违规处理 九、特殊规定 十、审批受理时间要点补充 1. 审批机关决定是否受理的时间 2. 审批机关作出批准与否的决定时间 3. 颁发测绘资…

在报表控件 FastReport .NET 中使用 PageCreate 事件

FastReport Business Graphics .NET&#xff0c;是一款基于fastreport报表开发控件的商业图形库&#xff0c;借助 FastReport 商业图形库&#xff0c;您可以可视化不同的分层数据&#xff0c;构建业务图表以进行进一步分析和决策。利用数据呈现领域专家针对 .NET 7、.NET Core、…

论文阅读-Federated-Unlearning-With-Momentum-Degradation

论文阅读-Federated Unlearning With Momentum Degradation 联邦忘却与动量退化 Yian Zhao IEEE Internet of Things Journal 2023 年 10 月 2 日 CCF-C momentum degradation-MoDe 动量退化 memory guidance-记忆引导 knowledge erasure-知识擦除 Deep-learning neural n…

【记录】Python|Selenium 下载 PDF 不预览不弹窗(2024年)

版本&#xff1a; Chrome 124Python 12Selenium 4.19.0 版本与我有差异不要紧&#xff0c;只要别差异太大比如 Chrome 用 57 之前的版本了&#xff0c;就可以看本文。 如果你从前完全没使用过、没安装过Selenium&#xff0c;可以参考这篇博客《【记录】Python3&#xff5c;Sele…

搭建Zookeeper完全分布式集群(CentOS 9 )

ZooKeeper是一个开源的分布式协调服务&#xff0c;它为分布式应用提供了高效且可靠的分布式协调服务&#xff0c;并且是分布式应用保证数据一致性的解决方案。该项目由雅虎公司创建&#xff0c;是Google Chubby的开源实现。 分布式应用可以基于ZooKeeper实现诸如数据发布/订阅…

UE5 C++ 射线检测

一.声明四个变量 FVector StartLocation;FVector ForwardVector;FVector EndLocation;FHitResult HitResult;二.起点从摄像机&#xff0c;重点为摄像机前9999m。射线检测 使用LineTraceSingleByChannel 射线直线通道检测&#xff0c;所以 void AMyCharacter::Tick(float Delt…

c++ qt6.5 打包sqlite组件无法使用,尽然 也需要dll支持!这和开发php 有什么区别!

运行 程序会默认使用当前所在文件夹中的 dll 文件&#xff0c;若文件不存在&#xff0c;会使用系统环境变量路径中的文件&#xff1b;又或者是需要在程序源代码中明确指定使用的 dll 的路径。由于我安装 Qt 时将相关 dll 文件路径都添加到了系统环境变量中&#xff0c;所以即使…

Hbase的shell命令(详细)

一、help 1.help 显示命名的分组情况 2.help 命令名称 查看命令的具体使用&#xff0c;包括命令的作用和用法。 举例&#xff1a;help list 二、general 组&#xff08;普通命令组&#xff09; 命令 描述 …

设计循环队列(队列oj)

1.设计循环队列 设计你的循环队列实现。 循环队列是一种线性数据结构&#xff0c;其操作表现基于 FIFO&#xff08;先进先出&#xff09;原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。…

高版本Android studio 使用Markdown无法预览(已解决)

目录 概述 解决方法 概述 本人升级Android studio 当前版本为Android Studio Jellyfish | 2023.3.1 RC 2导致Markdown无法预览。 我尝试了很多网上的方法都无法Markdown解决预览问题&#xff0c;包括升级插件、安装各种和Markdown相关的插件及使用“Choose Boot Java Runtim…

CentOS系统上部署Docker,mysql,nginx

CentOS7系统上部署Docker&#xff0c;mysql&#xff0c;nginx 未完&#xff0c;持续更新中 更新软件包索引&#xff1a; 首先&#xff0c;确保你的CentOS系统是最新的。你可以通过运行以下命令来更新你的系统&#xff1a; yum update安装Docker&#xff1a; CentOS的软件仓…

十大开源机器人 智能体

1- Poppy 网址 https://www.poppy-project.org/en/ 2- Nao 网址:https://www.aldebaran.com/en/nao 3- iCub 网址: https://icub.iit.it/

蓝桥杯2024年第十五届省赛真题-R 格式

找到规律后如下&#xff0c;只需要用高精度加法和四舍五入&#xff08;本质也是高精度加法就能做&#xff09;&#xff0c;如果没有找到规律&#xff0c;就得自己写高精度乘法和加法&#xff0c;不熟练很容易错。 //#include<bits/stdc.h> #include<iostream> #i…

【UE5.1】使用MySQL and MariaDB Integration插件——(3)表格形式显示数据

在上一篇&#xff08;【UE5.1】使用MySQL and MariaDB Integration插件——&#xff08;2&#xff09;查询&#xff09;基础上继续实现以表格形式显示查询到的数据的功能 效果 步骤 1. 在“WBP_Query”中将多行文本框替换未网格面板控件&#xff0c;该控件可以用表格形式布局…

论文笔记:Are Human-generated Demonstrations Necessary for In-context Learning?

iclr 2024 reviewer 评分 6668 1 intro 大型语言模型&#xff08;LLMs&#xff09;已显示出在上下文中学习的能力 给定几个带注释的示例作为演示&#xff0c;LLMs 能够为新的测试输入生成输出然而&#xff0c;现行的上下文学习&#xff08;ICL&#xff09;范式仍存在以下明显…