首页 > 其他分享 >React的7个常用Hooks及使用场景(含示例)

React的7个常用Hooks及使用场景(含示例)

时间:2024-03-05 17:45:15浏览次数:27  
标签:function count return 函数 示例 Hooks React 组件

React是一款非常流行的JavaScript库,它提供了许多Hooks,用于管理函数组件的状态和生命周期。下面是React的每个Hooks的使用场景和示例:

No1、useState

useState用于在函数组件中管理状态。
它返回一个包含当前状态和一个更新状态的函数的数组。更新状态的函数可以接受一个新的值,并更新状态。

import React, { useState } from 'react';

function Counter() {
const [count, setCount] = useState(0);

function handleClick() {
setCount(count + 1);
}

return <button onClick={handleClick}>Count: {count}</button>;
}

No2、useEffect

useEffect用于在函数组件中处理副作用。
它接受两个参数:一个副作用函数和一个依赖数组。当依赖数组中的任何一个值发生变化时,副作用函数将被调用。

import React, { useState, useEffect } from 'react';

function Timer() {
const [time, setTime] = useState(0);

useEffect(() => {
const interval = setInterval(() => {
setTime(time + 1);
}, 1000);

<span class="token keyword">return</span> <span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">=&gt;</span> <span class="token function">clearInterval</span><span class="token punctuation">(</span>interval<span class="token punctuation">)</span><span class="token punctuation">;</span>

}, [time]);

return <div>Time: {time}</div>;
}

No3、useContext

useContext用于在函数组件中使用上下文。
它接受一个上下文对象并返回上下文的当前值。当上下文的值发生变化时,函数组件将重新渲染。

import React, { createContext, useContext } from 'react';

const ThemeContext = createContext('light');

function Header() {
const theme = useContext(ThemeContext);

return (
<header style={{ background: theme }}>
<h1>My App</h1>
</header>
);
}

function App() {
return (
<ThemeContext.Provider value="dark">
<Header />
</ThemeContext.Provider>
);
}

No4、useReducer

useReducer用于在函数组件中管理复杂的状态。
它接受一个reducer函数和一个初始状态,并返回一个包含当前状态和一个派发操作的数组。派发操作将一个操作对象发送到reducer函数中,并返回一个新的状态。

import React, { useReducer } from 'react';

const initialState = { count: 0 };

function reducer(state, action) {
switch (action.type) {
case 'increment':
return { count: state.count + 1 };
case 'decrement':
return { count: state.count - 1 };
default:
throw new Error();
}
}

function Counter() {
const [state, dispatch] = useReducer(reducer, initialState);

function handleIncrement() {
dispatch({ type: 'increment' });
}

function handleDecrement() {
dispatch({ type: 'decrement' });
}

return (
<>
<button onClick={handleIncrement}>+</button>
<span>{state.count}</span>
<button onClick={handleDecrement}>-</button>
</>
);
}

No5、useCallback

useCallback用于在函数组件中缓存回调函数。
它接受一个回调函数和一个依赖数组,并返回一个缓存的回调函数。当依赖数组中的任何一个值发生变化时,缓存的回调函数将被更新。

import React, { useState, useCallback } from 'react';

function Parent() {
const [count, setCount] = useState(0);

const handleClick = useCallback(() => {
setCount(count + 1);
}, [count]);

return (
<>
<Child onClick={handleClick} />
<span>Count: {count}</span>
</>
);
}

function Child({ onClick }) {
return <button onClick={onClick}>Click me</button>;
}

No6、useMemo

useMemo用于在函数组件中缓存计算结果。
它接受一个计算函数和一个依赖数组,并返回一个缓存的计算结果。当依赖数组中的任何一个值发生变化时,计算函数将被重新计算。

import React, { useMemo } from 'react';

function ExpensiveComponent({ value1, value2 }) {
const result = useMemo(() => {
console.log('calculating result');
return value1 * value2;
}, [value1, value2]);

return <div>Result: {result}</div>;
}

No7、useRef

useRef用于在函数组件中引用DOM元素或其他值。
它返回一个包含可变引用的对象。当在函数组件中传递该对象时,它将保留其引用,即使组件重新渲染。

import React, { useRef } from 'react';

function Input() {
const inputRef = useRef(null);

function handleClick() {
inputRef.current.focus();
}

return (
<>
<input ref={inputRef} />
<button onClick={handleClick}>Focus input</button>
</>
);
}

以上是React的每个Hooks的使用场景和示例。这些Hooks可以帮助我们更加方便地管理状态和生命周期,并且提高代码的可读性和可维护性。

总结

useState:用于在函数组件中管理状态。可以用于跟踪和更新组件的内部状态,例如表单输入、开关状态、计数器等。

useEffect:用于处理副作用操作,例如数据获取、订阅事件、DOM操作等。可以在组件渲染后执行一些操作,也可以在组件卸载前进行清理操作。

useContext:用于在组件之间共享数据。可以创建一个全局的上下文,并在组件树中的多个组件中访问和更新该上下文。

useReducer:用于管理复杂的状态逻辑。可以用于替代useState,特别适用于具有复杂状态转换的组件,例如有限状态机、游戏状态等。

useCallback:用于性能优化。可以缓存函数实例,以便在依赖项不变的情况下避免不必要的函数重新创建,提高组件的性能。

useMemo:用于性能优化。可以缓存计算结果,以便在依赖项不变的情况下避免重复计算,提高组件的性能。

useRef:用于在函数组件中保存可变值的引用。可以用于保存DOM元素的引用、保存上一次渲染的值等。

标签:function,count,return,函数,示例,Hooks,React,组件
From: https://www.cnblogs.com/mounterLove/p/18054447

相关文章

  • Pick和Extract的区别示例
    在TypeScript中,Pick和Extract是两种不同的类型操作工具。它们分别用于从一个已有的类型中选择或提取部分属性和从联合类型中提取符合条件的类型。Pick类型Pick<T,K>用于从类型T中选取指定的键K所对应的属性,创建一个新的类型。示例:interfacePerson{name:stri......
  • 大顶堆,小顶堆--优先队列,示例
    有一个数组,要求找出最大的3个数,最小的4个数。 小顶堆,从大到小排序,筛选最小的N个数。//创建一个小顶堆std::priority_queue<int,std::vector<int>,std::greater<int>>min_heap;  大顶堆,从小到大排序,筛选最大的N个数。//创建一个大顶堆std::priori......
  • Django REST framework 安装及简单示例
    Django是python的一个后端服务器框架,用来写webAPI接口简单且方便。Djangorestframework是构建webapi的一个强大而灵活的工具包。 Django官网文档:https://docs.djangoproject.com/en/5.0/ref/settings/Djangorestframework官网文档:https://docs.djangoproject.com/en/5.......
  • mitmdump写法示例
    在界面上操作抓住相关的接口,有点类似于loadrunner的录制 安装:pipinstallmitmproxy mitmproxy分为三个组件:mitmproxy mitmweb  可视化的web界面mitmdump 命令行格式,可用于对接python脚本  前置步骤:1.如果是https,需要安装证书2.开启代理:127.0.0.1:8080 ......
  • 策略模式代码示例(二)
    一、定义策略模式,针对每一个不同的类型,调用具有共同接口的不同实现类,从而使得它们可以相互替换。策略模式,针对实现同一接口的不同的类,采用不同的策略。比如,面对高级会员、初级会员会采用不同的折扣。策略模式,可以避免大量的if和else。二、角色策略模式涉及到三个角色:●......
  • Qt 多线程中使用信号槽的示例
    之前对线程理解得不深入,所以对Qt的线程机制没有搞清楚,今天写一篇文章总结一下,如有错误,欢迎指出。    首先需要理解线程是什么,线程在代码中的表现其实就是一个函数,只不过这个函数和主线程的函数同时运行,写C语言的都知道,一般代码是从main()函数开始运行的,每个线程都有一......
  • React项目升级
    一、前端框架(或者库)升级的原因:a、前端技术更新比较快,需要不断更新保持技术和依赖都和社区同步;b、新版脚手架对性能和开发体验都进行了很多优化,新版脚手架基于社区2021年的相对最优解决方案和依赖。如vite2.0、react17(相比react16版本有了核心实现的重构)等;二、详细描述要升级的......
  • react native工程打包成apk
    react-native工程打包成apk1.生成签名密钥使用jdk自带的keytool生成密钥以管理员身份运行如下命令keytool-genkey-v-keystoremy-test3-key.keystore-aliasmy-key-test3-keyalgRSA-keysize2048-validity10000其中my-test3-key.keystore为生成的密钥库文件(给Andr......
  • xss利用之盗取cookie示例
    实验环境目标网站:宿主机:192.168.10.1访问虚拟机win11:192.168.10.134伪造网站:192.168.10.12:100pikachu步骤一:受害者cookie:步骤二:输入xsspayload'"><script>document.location='http://192.168.10.12:100/pikachu/pkxss/xccokie/cookie.php?cookie='+doc......
  • FastAPI系列 :安装启动及简单示例
    安装pip3installfastapipip3installuvicorn[standard]#是一个ASGI异步服务器网关接口服务器框架pip3installpython-multipart#处理表单参数的#完整安装pipinstallfastapi[all]启动程序#命令行启动uvicornmain:app--reload--host0.0.0.0--port8888......