React中常用的钩子

devtools/2024/12/25 23:35:07/

在当今,React的钩子写法已经逐渐成为了一种主流开发模式,本文将介绍几种在React中常用的钩子

  1. useState
    可以用来双向绑定,创建需要监听变化并且使用的数据
    使用该钩子定义时,参数可以是一个直接定义好的变量,也可以是一个函数,函数返回什么,初始状态就是什么,函数只会被调用一次,用在初始值是动态值的情况下(props)
javascript">import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);return (<div><h2>Count: {count}</h2><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default Counter;
  1. useRef
    用于获取操作DOM
    可以存储上一次渲染的值,用useRef创建一个对象来存储setState前的旧值
javascript">import { useRef } from "react";/*** 1、useRef生成ref对象 绑定到dom标签上* 2、DOM可用时,ref.current获取DOM,渲染完毕之后DOM生成之后才可用*/
function App() {const inputRef = useRef(null);const showDom = () => {console.log(inputRef.current);};return (<div className="App"><input type="text" ref={inputRef} /><button onClick={showDom}>获取DOM</button></div>);
}

也可以用于保存数据,特点是跨组件周期,组件重新渲染的时候还会存在,确保不会丢失

javascript">import React, { useRef, useEffect, useState } from 'react'export default function ref() {const [count, setCount] = useState(0)const timerId = useRef()useEffect(() => {timerId.current = setInterval(() => {setCount(count => count + 1)}, 1000)}, [])const stopCount = () => {console.log(timerId);clearInterval(timerId.current)}return (<div>{count}<button onClick={stopCount}>停止</button></div>)
}
  • useEffect
    这个钩子在我们开发的时候特比较常用,所对应的情况也比较多一点,可以看作类组件挂载完成之后、组件数据更新完成之后、组件卸载之前去执行,主要分为以下几种情况
    在这里插入图片描述
  • 没有依赖项
javascript">function App() {const [count, setCount] = useState(0);useEffect(() => {console.log(111);});return (<div><button onClick={() => setCount(count + 1)}>+{count}</button></div>);
}
  • 空数组依赖
javascript">const URL = "http://geek.itheima.net/v1_0/channels";
function App() {const [list, setList] = useState([]);useEffect(() => {// 额外的操作,获取频道列表async function getList() {const res = await fetch(URL);const list = await res.json();console.log(list);setList(list.data.channels);}getList();}, []);return (<div>this is app{list.map((i) => (<li key={i.id}>{i.name}</li>))}</div>);
}
  • 添加特定的依赖项
javascript">function App() {const [count, setCount] = useState(0);useEffect(() => {console.log(111);},[count]);return (<div><button onClick={() => setCount(count + 1)}>+{count}</button></div>);
}

最后,我们在使用完成后,还应该清除对应的副作用,最常见的时机是在组件卸载时自动执行

javascript">function Son() {useEffect(() => {const timer = setInterval(() => {console.log("定时器执行中...");}, 1000);return () => {clearInterval(timer);};}, []);return <div>this is son</div>;
}function App() {const [show, setShow] = useState(true);return (<div>{show && <Son></Son>}<button onClick={() => setShow(false)}>卸载Son组件</button></div>);
}
  1. useMemo
    该钩子属于React性能优化中的一环,可以对数据进行缓存
    类似于Vue中的计算属性,可以监听某个值的变化,根据变化值重新计算新值
    会缓存计算结果,如果检测到值没有变化,即时组件重新渲染,也不会重新计算,可以有助于避免在每个渲染上浪费计算
javascript">import React, { useMemo } from 'react';function ExpensiveCalculation({ num }) {const calculateFactorial = (n) => {console.log('Calculating factorial...');return n <= 1 ? 1 : n * calculateFactorial(n - 1);};const factorial = useMemo(() => calculateFactorial(num), [num]);return (<div><h2>Factorial of {num}: {factorial}</h2></div>);
}
  1. useCallback
    用来缓存函数,使组件渲染的时候得到相同的函数实例,避免函数在组件重新渲染时重新创建
javascript">import React, { useState, useCallback } from 'react';function Child({ onClick }) {console.log('Child component rendered');return <button onClick={onClick}>Click Me</button>;
}function Parent() {const [count, setCount] = useState(0);// 使用 useCallback 避免函数在每次渲染时重新创建const handleClick = useCallback(() => {alert('Button clicked!');}, []);return (<div><h2>Count: {count}</h2><button onClick={() => setCount(count + 1)}>Increment</button><Child onClick={handleClick} /></div>);
}
  1. useReducer
    让函数组件保存状态的方式,与usestate钩子相比,结合了usestate和redux的优点,比如说在父组件想要修改子组件数据的时候,就不需要传递方法了,可以直接吧dispatch传递过去进行修改使用(通过props进行传递即可)
javascript">import { useReducer } from 'react'function App() {const reducer = (state, action) => {switch (action.type) {case 'plus':return state + 1;case 'des':return state - 1;default:return state;}}const [count, dispatch] = useReducer(reducer, 0)return (<><div className="card"><button onClick={() => dispatch({ type: "plus" })}>+1</button>{count}<button onClick={() => dispatch({ type: "des" })}>-1</button></div></>)
}
  1. useContext
    在跨组件层级获取数据时简化数据的代码(App -> Foo)
javascript">import React, { useContext, useState } from 'react';// 1. 创建 Context
const UserContext = React.createContext();function App() {const [user, setUser] = useState({ name: 'Alice', age: 25 });return (// 2. 使用 Provider 共享数据<UserContext.Provider value={user}><UserProfile /></UserContext.Provider>);
}function UserProfile() {// 3. 在子组件中使用 useContext 获取 Context 的值const user = useContext(UserContext);return (<div><h2>User Profile</h2><p>Name: {user.name}</p><p>Age: {user.age}</p></div>);
}export default App;

http://www.ppmy.cn/devtools/145392.html

相关文章

力扣-图论-19【算法学习day.69】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

乐乐音乐Flutter版

简介 乐乐音乐Flutter版主要是基于Flutter Desktop框架开发的音乐播放器&#xff0c;它支持lrc歌词和动感歌词(ksc歌词、krc歌词、trc歌词、zrce歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 编译环境 Flutter:ideaIU-2024.1.4 参考地址 多…

k8s创建单例redis设置密码

在 Kubernetes (k8s) 中创建一个带密码的单例 Redis 部署&#xff0c;你可以通过定义一个包含 Redis 容器、服务(Service)以及必要配置(如密码设置)的 YAML 文件来实现。以下是一个基本的示例&#xff0c;展示了如何配置这些组件。 1. 创建 Redis 部署(Deployment) 首先&#x…

vivado 覆盖ip核默认生成的xdc约束

目录 简介 默认绑定管脚的IP核 总结 简介 本文介绍了解决Vivado中PCIe IP核自动生成的只读xdc文件与用户自定义xdc文件冲突的问题。通过设置空位置约束来覆盖原有的IP核引脚分配,实现了自定义的引脚绑定。并给出了适用于AX7103开发板的具体配置实例。 默认绑定管脚的IP核 …

Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总

问题1&#xff1a;打包的过程中不断提示 &#xff1a;codesign 想要访问你的钥匙串中的密钥“develop 或者distribution 证书” 解决&#xff1a;打开钥匙串&#xff0c;点击证书---显示简介---信任----改为始终信任 &#xff08;记住 &#xff1a;不能只修改钥匙的显示简介的…

workman服务端开发模式-应用开发-gateway长链接端工作原理

一、长链接的工作原理 Register类其实也是基于基础的Worker开发的。Gateway进程和BusinessWorker进程启动后分别向Register进程注册自己的通讯地址&#xff0c;Gateway进程和BusinessWorker通过Register进程得到通讯地址后&#xff0c;就可以建立起连接并通讯了。而Gateway进程…

【Ubuntu】如何轻松设置80和443端口的防火墙

说到 UFW&#xff08;也就是 Uncomplicated Firewall&#xff09;&#xff0c;这可是基于 Ubuntu 的 Linux 系统里自带的安全小能手。通常情况下它是被禁用的&#xff0c;但在服务器系统上它可能会处于激活并运行的状态。这就有可能阻止我们访问像 Apache 和 Nginx 这样的服务器…

网络架构与IP技术:4K/IP演播室制作的关键支撑

随着科技的不断发展&#xff0c;广播电视行业也在不断迭代更新&#xff0c;其中4K/IP演播室技术的应用成了一个引人注目的焦点。4K超高清技术和IP网络技术的结合&#xff0c;不仅提升了节目制作的画质和效果&#xff0c;还为节目制作带来了更高的效率和灵活性。那么4K超高清技术…