Day10 React———— 第十天

embedded/2024/9/22 20:00:52/

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/embedded/13202.html

相关文章

【AI写作】未来科技趋势:揭秘DreamFusion的革新力量

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

Redis 数据类型

文章目录 Reidis 命名规范String类型Hash 类型List 类型Set 类型Zset 类型补充 概览&#xff1a; 数据结构 &#xff1a; key value 中value的类型 内部编码&#xff1a; 实际在底层用来存储value的结构 设计优点&#xff1a; ① 解耦&#xff0c;用户可根据需求再开发内部编…

Pinia 深度剖析:Vue.js 应用状态管理的全面指南

一、pinia简介 Pinia 是一个专门为 Vue.js 应用程序设计的状态管理库。它的设计理念是简化状态管理过程&#xff0c;提供一种清晰、可维护的方式来管理应用程序中的数据。 二、安装与创建 1.你可以通过 npm 或者 yarn 来安装 Pinia&#xff1a; npm install pinia # 或者 y…

MySQL—一条查询SQL语句的完整执行流程

MySQL—一条查询SQL语句的完整执行流程 表结构和数据如下&#xff1a; 我们分析的sql语句如下&#xff1a; select tb_id,tb_name,tb_address from tb_user where tb_id 66;大体来说&#xff0c;MySQL可以分为Server层和存储引擎层两部分: Server层 包括:连接器、查询缓存、…

#langchain | RAG |富文本一致性解析 | NLP # langchain支持的9种PDF内容提取方式

# 读取markdown内容 from langchain_community.document_loaders import UnstructuredPDFLoader from langchain import document_loaders# 用到的所有方法 # load_pdf_file_langchain_unstructed # x按照行&#xff0c;无结构化 # load_pdf_file_pypdf # x按照页码&#xff0c…

探索Go语言中最强的ORM框架

GORM 是用于Golang的出色ORM&#xff08;对象关系映射&#xff09;库&#xff0c;它以开发人员友好而闻名。它的主要目标是提供一个全功能的ORM工具&#xff0c;帮助开发者更加高效地处理关系型数据库。GORM是在Go语言的database/sql包的基础上发展起来的。下面我们详细介绍GOR…

软考-系统集成项目管理中级--合同管理

本章历年考题分值统计(16年11月及以后按新教材考的&#xff09; 本章重点常考知识点汇总清单(学握部分可直接理解记忆) 8、合同签订管理(掌握)10下53&#xff0c;14上53&#xff0c;15上53 考题 签订合同的前期调查&#xff0c;每一项合同在签订之前&#xff0c;应当做好以下几…

码头船只出行及配套货柜码放管理系统-毕设

毕业设计说明书 码头船只出行及配套货柜码放 管理系统 码头船只出行及配套货柜码放管理系统 摘要 伴随着全球化的发展&#xff0c;码头的物流和客运增多&#xff0c;码头业务迎来新的高峰。然而码头业务的增加&#xff0c;导致了人员成本和工作量的增多。为了解决这一基本问题&…