react常用hook的实现示例

 更新时间:2025年08月25日 09:47:56   作者:Aphasia  
本文主要介绍了react常用hook的实现示例,提供状态管理、副作用处理、引用、跨组件共享及性能优化功能,具有一定的参考价值,感兴趣的可以了解一下

引言💭

自 React 16.8 起,Hook 的引入彻底改变了函数组件的开发方式。Hook 让函数组件拥有了管理状态、处理副作用、访问上下文等能力,大大提高了代码的可复用性和可读性。

一、useState—— 管理组件状态的基础

useState 是最常用的 Hook,用于在函数组件中声明状态变量。

用法示例:

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0); // 初始值为0

  return (
    <button onClick={() => setCount(count + 1)}>
      点击次数:{count}
    </button>
  );
}

特点:

  • 每次调用 setCount 都会触发组件重新渲染。
  • useState 可以接收一个函数作为初始值(惰性初始化)。

二、useEffect—— 副作用处理器

useEffect 用于处理副作用,例如:数据获取、事件监听、DOM 操作等。

用法示例:

import { useEffect } from 'react';

function Timer() {
  useEffect(() => {
    const id = setInterval(() => {
      console.log('tick');
    }, 1000);

    return () => clearInterval(id); // 清理定时器
  }, []); // 仅在组件挂载时执行一次
}

特点:

  • 第一个参数是副作用函数。
  • 第二个参数是依赖数组,控制副作用的执行时机。
  • 返回函数用于清理资源。

注意

在 React 18 及更高版本中,useEffect 在开发模式下会故意执行两次。

  • 主要原因

严格模式(Strict Mode)的影响:React 18 在开发模式下默认启用严格模式,严格模式下会故意挂载、卸载、再重新挂载组件,目的是帮助开发者发现副作用中的错误,模拟用户行为(如快速切换页面),确保组件的副作用能够正确处理清理和重新设置。

  • 具体表现
useEffect(() => {
  console.log("Effect ran"); // 在开发模式下会打印两次
  
  return () => {
    console.log("Cleanup"); // 也会执行两次
  };
}, []);

三、useRef—— 引用 DOM 或保存可变值

useRef 用于获取 DOM 元素的引用,或在组件间保存一个不会触发重新渲染的变量。

用法示例:

import { useRef } from 'react';

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

  const handleClick = () => {
    inputRef.current.focus(); // 直接操作 DOM
  };

  return (
    <>
      <input ref={inputRef} />
      <button onClick={handleClick}>聚焦输入框</button>
    </>
  );
}

特点:

  • ref.current 可以持久保存任意值。
  • 常用于处理定时器、缓存值等不需触发更新的场景。

四、useContext—— 跨组件共享状态

配合 React 的 Context API,useContext 可让你在任意子组件中访问全局数据。

用法示例:

import { createContext, useContext } from 'react';

const ThemeContext = createContext('light');

function ThemedButton() {
  const theme = useContext(ThemeContext); // 获取上下文值
  return <button className={theme}>主题按钮</button>;
}

特点:

  • 避免多层 props 传递。
  • useContext 会订阅 context 变化,自动更新。

五、useMemo—— 缓存计算结果

useMemo 用于缓存耗时计算,避免不必要的重复运算。

用法示例:

import { useMemo } from 'react';

function ExpensiveComponent({ input }) {
  const result = useMemo(() => {
    return expensiveCalculation(input);
  }, [input]);

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

特点:

  • 只有依赖项发生变化时才会重新计算。
  • 用于优化性能,但请勿滥用。

六、useCallback—— 缓存函数引用

useCallback 返回一个记忆化的函数引用,用于避免子组件重复渲染。

用法示例:

import { useCallback } from 'react';

function Parent() {
  const handleClick = useCallback(() => {
    console.log('Clicked');
  }, []);

  return <Child onClick={handleClick} />;
}

特点:

  • useMemo 类似,但用于缓存函数。
  • 在需要传递稳定函数引用时使用(如依赖项、子组件 props)。

七、useReducer—— 更复杂的状态逻辑管理

useReducer 更适合处理状态变化逻辑复杂或状态结构较大的情况。

用法示例:

import { useReducer } from 'react';

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

function Counter() {
  const [state, dispatch] = useReducer(reducer, { count: 0 });

  return (
    <button onClick={() => dispatch({ type: 'increment' })}>
      {state.count}
    </button>
  );
}

八、总结

  • 使用 useState 管理简单状态,useReducer 管理复杂状态。
  • 使用 useEffect 时确保清理副作用,避免内存泄漏。
  • 使用 useMemouseCallback 仅在性能瓶颈时启用。
  • 将重复逻辑封装成自定义 Hook 提高复用性。

结语✒️

React Hook 为函数组件带来了强大的功能和灵活性。掌握这些常用 Hook,不仅可以简化代码结构,还能提升应用的性能与可维护性。

到此这篇关于react常用hook的实现示例的文章就介绍到这了,更多相关react常用hook内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • React实现类似淘宝tab居中切换效果的示例代码

    React实现类似淘宝tab居中切换效果的示例代码

    这篇文章主要介绍了React实现类似淘宝tab居中切换效果,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06
  • 浅谈React组件在什么情况下会重新渲染

    浅谈React组件在什么情况下会重新渲染

    当我们使用React编写组件时,组件的重新渲染是一个重要的概念,本文主要介绍了React组件在什么情况下会重新渲染,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • react-router 路由切换动画的实现示例

    react-router 路由切换动画的实现示例

    这篇文章主要介绍了react-router 路由切换动画的实现示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • React Streaming SSR原理示例深入解析

    React Streaming SSR原理示例深入解析

    这篇文章主要为大家介绍了React Streaming SSR原理示例深入解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 解决react antd Table组件使用radio单选框 更新选中数据不渲染问题

    解决react antd Table组件使用radio单选框 更新选中数据不渲染问题

    这篇文章主要介绍了解决react antd Table组件使用radio单选框 更新选中数据不渲染问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 在React框架中实现一些AngularJS中ng指令的例子

    在React框架中实现一些AngularJS中ng指令的例子

    这篇文章主要介绍了在JavaScript的React框架中实现一些AngularJS指令的例子,React使用Virtual DOM因而与普通的js框架有些不同,需要的朋友可以参考下
    2016-03-03
  • react-router v4如何使用history控制路由跳转详解

    react-router v4如何使用history控制路由跳转详解

    这篇文章主要给大家介绍了关于react-router v4如何使用history控制路由跳转的相关资料,文中通过示例代码介绍的的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2018-01-01
  • 一文带你搞懂React中的useReducer

    一文带你搞懂React中的useReducer

    useReducer 是除useState之外另一个与状态管理相关的 hook,这篇文章主要为大家介绍了useReducer应用的相关知识,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-06-06
  • 详解react-native-fs插件的使用以及遇到的坑

    详解react-native-fs插件的使用以及遇到的坑

    本篇文章主要介绍了react-native-fs插件的使用以及遇到的坑,详细的介绍了react-native-fs安装使用,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • React中常用的一些钩子函数总结

    React中常用的一些钩子函数总结

    这篇文章给大家总结了React中常用的一些钩子函数,文中通过代码示例给大家介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-01-01

最新评论