react常用api

news/2024/11/17 1:31:30/

1.useReducer---状态管理(类似useState)

一般用于比较复杂的状态管理

import { Button } from "antd";const { useReducer } = require("react");// 1. 定义reducer函数 根据不同的action 返回不同的状态
function reducer(state, action) {switch (action.type) {case "INC":return state + 1;case "DEC":return state - 1;case "SET":return action.payload;default:return state;}
}function App() {// 2. 组件中调用useReducer(reducer,0) => [state,dispatch]// reducer--reducer函数  0--状态初始值const [state, dispatch] = useReducer(reducer, 0);return (<div className="App"><Button type="primary" onClick={() => dispatch({ type: "DEC"})}>-</Button>{state}{/* 3. 调用dispatch({type:'INC}) => 通知reducer产生一个新的状态 使用这个新状态更新UI */}<Button type="primary" onClick={() => dispatch({ type: "INC" })}>+</Button><Button type="primary" onClick={() => dispatch({ type: "SET", payload: 100 })}>update</Button></div>);
}export default App;

2.useMemo

在组件每次重新渲染的时候缓存计算的结果

import { Button } from "antd";
import { useMemo, useState } from "react";// 计算斐波那契数列之和
function fib(n) {if (n < 3) return 1;return fib(n - 2) + fib(n - 1);
}function App() {const [count1, setCount1] = useState(0)useMemo(() => {return fib(count1)})const [count2, setCount2] = useState(0)return (<div className="App">{result}<Button type="primary" onClick={() => setCount1(count1 + 1)}>测试{count1}</Button><Button type="primary" onClick={() => setCount2(count2 + 1)}>测试{count2}</Button></div>);
}export default App;

3.React.memo

允许组件在Props没有改变的情况下跳过渲染-----解决父组件发生变化,子组件在没有的时候,不再重新渲染子组件

React组件的默认渲染机制:只要父组件重新渲染子组件就会重新渲染

import { useMemo, useState } from "react";// 在使用memo缓存组件之后,React会对每一个 prop 使用 Objectis 比较新值和老值,返回true,表示没有变化const MemoSon = memo(function Son({count}) {console.log('子组件发生变化');return <div>son{count}</div>;
})function App() {// 1.简单类型const [count, setCount] = useState(0);// 2.引用类型  比较的是新值和旧值得应用  当父组件函数重新执行时,实际上形成的是新的数组引用// const list = [1, 2, 3]// 3.保证引用稳定useMemo(() => {return [1, 2, 3]}, [])return (<div className="App"><MemoSon count={list} /><button onClick={() => setCount(count + 1)}>+</button></div>);
}export default App;

4.useCallback

在组件多次重新渲染的时候缓存函数

import { 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 [count, setCount] = useState(0);// 穿给子组件的函数const changeHandler = useCallback((value) => console.log(value), []);return (<div className="App"><Input onChange={changeHandler} /><button onClick={() => setCount(count + 1)}>+</button></div>);
}export default App;

5.React.forwardRef

使ref暴露DOM节点给父组件

import { forwardRef, useRef } from "react";const Input = forwardRef((props, ref) => {return <input type="text" ref={ref} />
})function App() {const inputRef = useRef(null)const showRef = () => {console.log(inputRef);inputRef .current.focus();};return (<div className="App"><Input ref={inputRef} /><button onClick={showRef}>focus</button></div>);
}export default App;

6.useInperativeHandle

使ref暴露DOM节点给父组件

import { forwardRef, useRef, useInperativeHandle } from "react";const Input = forwardRef((props, ref) => {const inputRef = useRef(null)// 实现聚焦函数const focusHandler = () => {inputRef.current.focus()}// 暴露函数给父组件使用useInperativeHandle(ref, () => {return {focusHandler}})return <input type="text" ref={inputRef} />
})function App() {const inputRef = useRef(null)const focusHandler = () => {inputRef.current.focusHandler();};return (<div className="App"><Input ref={inputRef} /><button onClick={focusHandler}>focus</button></div>);
}export default App;

http://www.ppmy.cn/news/1201870.html

相关文章

Pandas Excel数据处理指南

在数据处理和分析的过程中&#xff0c;Excel是一个非常常见的工具。然而&#xff0c;当数据量变大&#xff0c;操作复杂度增加时&#xff0c;Excel的效率和功能可能无法满足需求。Pandas是一个强大的Python数据处理库&#xff0c;可以轻松地读取、处理和分析Excel文件中的数据。…

QT blockingFilter blockingMap blockingMapped

blockingFilter 主要作用是筛选出符合条件的项值结果集,并与之替换原有序列列表 blockingMap 可以直接修改容器的每一项 blockingMapped 不直接修改容器的每一项,而是将处理后的结果返回一个新的容器 blockingMappedReduced ResultType QtConcurrent::blockingMappedRed…

VHDL基础知识笔记(1)

1.实体&#xff1a;其电路意义相当于器件&#xff0c;它相当于电路原理图上的元器件符号。它给出了器件的输入输出引脚。实体又被称为模块。 2.结构体&#xff1a;这个部分会给出实体&#xff08;或者说模块&#xff09;的具体实现&#xff0c;指定输入和输出的行为。结构体的…

微带线的ABCD矩阵的推导、转换与级联-Matlab计算实例

微带线的ABCD矩阵的推导、转换与级联-Matlab计算实例 散射参数矩阵有实际的物理意义&#xff0c;但是其无法级联计算&#xff0c;但是ABCD参数和传输散射矩阵可以级联计算&#xff0c;在此先简单介绍ABCD参数矩阵的基本用法。 1、微带线的ABCD矩阵的推导 其他的一些常用的二端…

蓝桥杯-成绩统计[Java]

目录: 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 题目&#xff1a; 题目描述: 输入描述: 输出描述: 输入输出样例: 示例 1: 运行限制: 题解: 思路: 学习目标&#xff1a; 刷蓝桥杯题库日记 学习内容&#xff1a; 编号502题目成绩统计难度…

数据时代的新引擎:数据治理与开发,揭秘数据领域的黄金机遇!

文章目录 一、数据时代的需求二、数据治理与开发三、案例分析四、黄金机遇《数据要素安全流通》《Python数据挖掘&#xff1a;入门、进阶与实用案例分析》《数据保护&#xff1a;工作负载的可恢复性 》《Data Mesh权威指南》《分布式统一大数据虚拟文件系统 Alluxio原理、技术与…

C++成长之路

看好的发展方向&#xff1a; 证券行业软件开发、AI自动化开发、桌面端工具类开发&#xff0c;云桌面技术 产品框架搭建 MFCDuilbLibcef Qt 技术深入 熟知编译器原理 C11/14等新知识的学习 泛型编程 / 模板编程 设计模式 多线程并发 多进程通讯 各种锁及其优缺点 必看书…

常用设计模式-详解

设计模式六大原则 开闭原则&#xff1a;对扩展开放&#xff0c;对修改关闭 单一职责原则&#xff1a;一个类只负责一个功能领域中的相应职责 里氏替换原则&#xff1a;所有引用基类的地方必须能透明地使用其子类的对象 依赖倒置原则&#xff1a;依赖于抽象&#xff0c;不能依赖…