Day10 React———— 第十天

ops/2024/10/22 13:38:34/

useReducer

useReducer 是 React Hooks 中的一个函数,用于管理组件的状态。它类似于 useState,但提供了更复杂的状态逻辑处理能力。 接受一个 reducer 函数和初始状态作为参数,并返回当前状态和 dispatch 函数。

使用 useReducer 的基本流程如下:

  1. 定义一个 reducer 函数,接受当前状态和 action 参数,并根据 action 的类型来更新状态。
  2. 在组件中使用 useReducer,传入 reducer 函数和初始状态,得到当前状态和 dispatch 函数。
  3. 在需要更新状态的地方,调用 dispatch 函数并传入对应的 action,从而触发 reducer 函数更新状态。
javascript">const reduce = (state, action) => {switch (action.type) {case "add":return state + 1;case "dsc":return state - 1;case "update":return action.payloaddefault:break;}
};export default function App() {const [state, dispatch] = useReducer(reduce,0)return (<div><buttononClick={() => {dispatch({ type: "add" });}}>+</button>{state}<buttononClick={() => {dispatch({ type: "dsc" });}}>-</button><buttononClick={() => {dispatch({ type: "update", payload:1000 });}}>update</button></div>);
}

useMemo

useMemo是React Hooks中的一个函数,用于优化性能。它接收一个函数和一个依赖数组作为参数,返回一个memoized(记忆化)的值。当依赖数组中的值发生变化时,useMemo会重新计算并返回新的值,否则会直接返回上一次计算的结果。

useMemo的作用是避免在每次渲染时都重新计算相同的值,尤其是在计算量较大的情况下,可以显著提高性能。常见的用法包括计算一些昂贵的值、避免不必要的重复渲染等。

javascript">// useMemo
// 缓存: 消耗非常大的计算import { useMemo, useState } from "react";// 计算斐波那契数列之和
function fib(n) {console.log("计算函数执行了");if (n < 3) return 1;return fib(n - 2) + fib(n - 1);
}function App() {const [count1, setCount1] = useState(0);const result = useMemo(() => {// 返回计算得到的结果return fib(count1);}, [count1]);// const result = fib(count1)const [count2, setCount2] = useState(0);console.log("组件重新渲染了");return (<div className="App">this is app<button onClick={() => setCount1(count1 + 1)}>change count1: {count1}</button><button onClick={() => setCount2(count2 + 1)}>change count2: {count2}</button>{result}</div>);
}export default App;

React memo的使用

作用:允许组件在 Props没有改变 的情况下跳过渲染
React组件默认的渲染机制:只要父组件重新渲染子组件就会重新渲染
基本语法:
javascript">import React from "react";
import { useState, memo } from "react";const MemoZi = memo(function Zi() {console.log("我是子组件");return <div>this is Zi commponent</div>;
});export default function App() {const [num, setNum] = useState(0);return (<div>App<MemoZi />{num}<buttononClick={() => {setNum(num + 1);}}>+1</button></div>);
}

useCallback

是 React Hooks 中的一个函数,用于优化性能和避免不必要的重新渲染。

当一个组件使用 useCallback 包裹一个函数时,它会返回一个记忆化的版本的函数。这意味着只有当依赖项发生变化时,才会返回新的函数。这可以避免在每次渲染时都创建新的函数实例,从而减少不必要的内存消耗和重新渲染。

useCallback 接受两个参数:第一个参数是一个函数,第二个参数是一个依赖项数组。当依赖项数组中的任何一个值发生变化时,useCallback 会返回一个新的函数。如果依赖项数组为空,useCallback 会在每次渲染时都返回同一个函数。

javascript">// useCallbackimport { memo, useCallback, useState } from "react";const Input = memo(function Input({ onChange }) {console.log("子组件重新渲染了");return <input type="text" onChange={(e) => onChange(e.target.value)} />;
});function App() {// 传给子组件的函数const changeHandler = useCallback((value) => console.log(value), []);// 触发父组件重新渲染的函数const [count, setCount] = useState(0);return (<div className="App">{/* 把函数作为prop传给子组件 */}<Input onChange={changeHandler} /><button onClick={() => setCount(count + 1)}>{count}</button></div>);
}export default App;

forwardRef 

forwardRef 是 React 中的一个高级函数,用于在函数组件中转发(forward)refs。在 React 中,refs 是用来引用 DOM 元素或类组件实例的对象,它们通常在类组件中使用。但是在函数组件中使用 refs 可能会有一些限制,特别是在组件包裹或嵌套的情况下。forwardRef 的目的就是解决这些问题。

当使用 forwardRef 包裹函数组件时,它可以将 ref 透传给函数组件内部的某个子组件,从而允许函数组件访问这个 ref。就可以在函数组件中使用 ref 来引用子组件或 DOM 元素。

以下是 forwardRef 的基本用法:

javascript">import React from "react";
import { useRef, forwardRef } from "react";const Zi = forwardRef((props,ref)=>{return (<input type="text" ref={ref} />)
})export default function App() {const r = useRef(null);const getR = () => {console.log(r);};return (<div><Zi ref={r} /><button onClick={getR}>click</button></div>);
}


http://www.ppmy.cn/ops/12482.html

相关文章

【案例】--自定义DSL查询

目录 一、前言二、如何设计规则1、<filedName>{关键词}2、<filedName>{规则}3、AND、OR、NOT4、<accure>表达式三、代码实现DSL1、示例说明2、核心代码实现一、前言 自定义ES的DSL查询(dynamic ES Query Language)【DEQL】是针对非结构化信息加工、提取需求…

Hdu1350 Taxi Cab Scheme 【最小路径覆盖】

Taxi Cab Scheme 题意 有一张边长不超过 200 200 200 的网格图&#xff0c;有若干个乘客&#xff0c; 乘客 i i i 的需求是&#xff1a; h h : m m , ( a , b ) , ( c , d ) hh:mm, (a,b) , (c, d) hh:mm,(a,b),(c,d)&#xff0c;意为他需要在 h h 时 m m 分 hh时mm分 hh时…

【WebLogic】Oracle发布2024年第二季度中间件安全公告

Oracle于美国时间2024年4月16日发布了 WebLogic 中间件2024年第二季度的安全公告&#xff0c;涉及漏洞共计 10 个&#xff0c;涉及示例程序的高危漏洞 1 个&#xff0c;中危漏洞中有3个涉及到核心组件&#xff08;Core&#xff09;。 此外&#xff0c;Oracle JDK1.8 的小版本号…

vue中 key 的原理

Vue中&#xff0c;key是用于帮助Vue识别VNode的一种特殊属性&#xff0c; 当Vue在更新DOM时&#xff0c;它会尽可能地复用已经存在的元素而不是重新创建&#xff0c; key的作用&#xff0c;就是&#xff0c;帮助Vue识别每个VNode的唯一性&#xff0c; 从而在进行DOM更新时&a…

通过Redis实现一个异步请求-响应程序

在分布式系统中,经常需要不同的服务或组件之间进行通信和协作。传统的同步请求-响应模式虽然简单直观,但可能会导致阻塞和性能问题。为了解决这个问题,我们开发了一个基于 Redis 的异步请求-响应程序,实现了请求和响应的解耦,提高了系统的并发性和响应能力。 程序概述 该程序…

SCA-CNN-LSTM多输入回归预测|正余弦优化算法-卷积-长短期神经网络|Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

通用型自定义拼接 SQL 脚本,摆脱重复工作量

通用型自定义拼接sql脚本,摆脱重复工作量 在开发 Restful 接口时&#xff0c;我们经常需要根据前端传递的参数动态拼接 SQL 查询语句&#xff0c;以满足不同的查询需求。本文将介绍一个通用的自定义拼接 SQL 脚本的方法&#xff0c;帮助开发人员减少重复工作量。 首先&#x…

Android SDK Manager安装Google Play Intel x86 Atom_64 System Image依赖问题

Package Google Play Intel x86 Atom_64 System Image,Android API R, revision 2 depends on SDK Platform Android R Preview, revision 2 问题 一开始以为网络还有依赖包没有勾选&#xff0c;尝试了很多次&#xff0c;勾选这边报错对应的license即可。此时点击一下其他licen…