Day08React——第八天

2024-04-18 05:12
文章标签 第八天 day08react

本文主要是介绍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>);
}

这篇关于Day08React——第八天的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/913840

相关文章

代码随想录第八天|151.翻转字符串里的单词 卡码网:55.右旋转字符串 28. 实现 strStr() 459.重复的子字符串

反转字符串的单词 思路:刷过稍微忘记 class Solution {public://去除空格string remove(string s){//使用快慢指针int slow=0;int i=0;for(;i<s.size();i++){if(s[i]!=' '){if(slow!=0){s[slow++]=' ';}while(s[i]!=' '&&i<s.size()){s[slow+

【60天备战软考高级系统架构设计师——第八天:设计模式概述】

设计模式(Design Patterns) 设计模式是一套被反复使用的代码设计经验总结,可以帮助开发人员解决软件开发过程中遇到的常见问题。它们为软件设计提供了一些通用的解决方案,能够提高代码的可重用性、可维护性和可读性。设计模式主要分为三大类:创建型模式、结构型模式和行为型模式。 1. 创建型模式(Creational Patterns) 创建型模式主要关注对象的创建过程,目的是将对象的创建

Java Web —— 第八天(登录功能)

基础登录功能 LoginController 类 @RestController //用于处理 HTTP 请求@Slf4j //记录日志@RequestMapping("/login")public class LoginController {@Autowiredprivate EmpService empService;@PostMappingpublic Result login(

【代码随想录算法训练营第42期 第八天 | LeetCode344.反转字符串、541. 反转字符串II、卡码网:54.替换数字】

代码随想录算法训练营第42期 第八天 | LeetCode344.反转字符串、541. 反转字符串II、卡码网:54.替换数字 一、344.反转字符串 解题代码C: void reverseString(char* s, int sSize){int left = 0;int right = sSize - 1;while(left < right) {char temp = s[lef

代码随想录算法训练营第八天|344.反转字符串、541. 反转字符串II、卡码网:54.替换数字

Leetcode344.反转字符串 题目链接:344. 反转字符串 C++: class Solution {public:void reverseString(vector<char>& s) {for(int i=0, j=s.size()-1; i < s.size()/2; i++, j--)swap(s[i], s[j]);}}; Python: class Solutio

windows桌面运维---第八天

1、如何判断环路: 1、执行ping命令:网络测试时发现丢包严重,可能是环路引起的 2、监控MAC地址漂移:频繁的MAC漂移是环路的一个迹象。 3、通过display interface brief | include up命令,查看所有UP接口下的流量 2、如何释放和更新PC上的IP地址: 先释放现有IP,在CMD命令行输入“ipconfig/release”。 获取新IP,还是在

剑指offer66题(Python)——第八天

43、和为S的连续正数序列 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck! 【思路】

2024年全国青少信息素养大赛python编程复赛集训第八天编程题分享

整理资料解析答案非常不容易,感谢各位大佬给个点赞和分享吧,谢谢 今天题目较难:适合初中组 大家如果不想阅读前边的比赛内容介绍,可以直接跳过:拉到底部看集训题目 (一)比赛内容:  【小学组】  1.了解输入与输出的概念,掌握使用基本输入输出和简单运算 为主的标准函数; 2.掌握注释的方法; 3.掌握基本数据类型(字符串、数值、逻辑型)的概念以及表示 方法; 掌握数值

算法第八天:leetcode 35.搜索插入位置

一、搜索插入位置   该题的题目链接如下所示,看题解前先点击或复制下面链接进入力扣做题哦,做题后看会更好哦。       https://leetcode.cn/problems/search-insert-position/   给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n)

代码随想录算法训练营第八天| 344.反转字符串、541. 反转字符串II、 卡码网:54.替换数字、151.翻转字符串里的单词、卡码网:55.右旋转字符串

344.反转字符串 题目链接: 344.反转字符串 文档讲解:代码随想录 状态:so easy 题解: public void reverseString(char[] s) {int left = 0, right = s.length - 1;char temp = s[0];while (left <= right) {temp = s[left];s[left] =