首页 > 其他分享 >react 常用的hook使用举例

react 常用的hook使用举例

时间:2024-12-16 21:44:05浏览次数:4  
标签:count React return react hook 举例 useState const

React 提供了许多内置的 Hook,用于在函数组件中添加状态管理和副作用等特性。以下是一些常用的 Hook 及其用法示例:

1. useState

useState 用于在函数组件中添加状态。

import React, { useState } from 'react';

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

  return (
    <div>
      <p>计数: {count}</p>
      <button onClick={() => setCount(count + 1)}>增加</button>
    </div>
  );
};

2. useEffect

useEffect 用于在函数组件中执行副作用操作,如数据获取、订阅或手动更改 React 组件中的 DOM。

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

const Timer = () => {
  const [seconds, setSeconds] = useState(0);

  useEffect(() => {
    const interval = setInterval(() => {
      setSeconds(prevSeconds => prevSeconds + 1);
    }, 1000);
    return () => clearInterval(interval); // 清理函数
  }, []); // 空数组表示仅在组件挂载和卸载时运行

  return <div>计时: {seconds} 秒</div>;
};

3. useContext

useContext 用于在函数组件中订阅 React 的上下文。

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

const ThemeContext = createContext('light');

const ThemedButton = () => {
  const theme = useContext(ThemeContext);
  return <button>当前主题: {theme}</button>;
};

const App = () => (
  <ThemeContext.Provider value="dark">
    <ThemedButton />
  </ThemeContext.Provider>
);

4. useReducer

useReducer 用于在函数组件中管理包含多个子值的复杂状态逻辑。

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();
  }
}

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

  return (
    <div>
      <p>计数: {state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>增加</button>
      <button onClick={() => dispatch({ type: 'decrement' })}>减少</button>
    </div>
  );
};

5. useCallback

useCallback 返回一个记忆化的回调函数。

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

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

  const increment = useCallback(() => {
    setCount(c => c + 1);
  }, []);

  return (
    <div>
      <p>计数: {count}</p>
      <button onClick={increment}>增加</button>
    </div>
  );
};

6. useMemo

useMemo 返回一个记忆化的值。

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

const ExpensiveComponent = ({ num }) => {
  console.log('ExpensiveComponent 渲染');
  return <div>{num}</div>;
};

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

  const memoizedValue = useMemo(() => {
    console.log('计算 memoizedValue');
    return count * 2;
  }, [count]);

  return (
    <div>
      <p>计数: {count}</p>
      <ExpensiveComponent num={memoizedValue} />
      <button onClick={() => setCount(count + 1)}>增加</button>
    </div>
  );
};

7. useRef

useRef 返回一个可变的 ref 对象,其 .current 属性被初始化为传入的参数。

import React, { useRef } from 'react';

const InputComponent = () => {
  const inputEl = useRef(null);

  const focusInput = () => {
    if (inputEl.current) {
      inputEl.current.focus();
    }
  };

  return (
    <div>
      <input ref={inputEl} type="text" />
      <button onClick={focusInput}>聚焦输入框</button>
    </div>
  );
};

8. useImperativeHandle

useImperativeHandle 用于在使用 ref 时自定义暴露给父组件的实例值。

import React, { forwardRef, useImperativeHandle, useRef } from 'react';

const FancyInput = forwardRef((props, ref) => {
  const inputRef = useRef();
  useImperativeHandle(ref, () => ({
    focus: () => {
      inputRef.current.focus();
    }
  }));

  return <input ref={inputRef} />;
});

const App = () => {
  const fancyInputRef = useRef();

  const handleClick = () => {
    fancyInputRef.current.focus();
  };

  return (
    <div>
      <FancyInput ref={fancyInputRef} />
      <button onClick={handleClick}>聚焦输入框</button>
    </div>
  );
};

9. useLayoutEffect

useLayoutEffectuseEffect 相似,但它会在所有的 DOM 变更之后同步调用。

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

const LayoutEffectComponent = () => {
  const [count, setCount] = useState(0);

  useLayoutEffect(() => {
    console.log('DOM 更新完成');
  });

  return (
    <div>
      <p>计数: {count}</p>
      <button onClick={() => setCount(count + 1)}>增加</button>
    </div>
  );
};

10. useDebugValue

useDebugValue 可以在 React 开发者工具中显示自定义的 label,以便于调试。

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

const Timer = () => {
  const [seconds, setSeconds] = useState(0);

  useDebugValue(seconds);

  useEffect(() => {
    const interval = setInterval(() => {
      setSeconds(prevSeconds => prevSeconds + 1);
    }, 1000);
    return () => clearInterval(interval);
  }, []);

  return <div>计时: {seconds} 秒</div>;
};

这些 Hook 为函数组件提供了强大的功能,使得在函数组件中管理状态和副作用变得更加简单和直观。通过结合使用这些 Hook,你可以构建复杂的 React 应用程序。

标签:count,React,return,react,hook,举例,useState,const
From: https://www.cnblogs.com/jocongmin/p/18611166

相关文章

  • react 子组件如何暴漏方法或者数据给父组件直接访问
    在React中,子组件可以通过几种方式将方法或数据暴露给父组件,以便父组件可以直接访问。以下是几种常见的方法:1.使用props传递回调函数父组件可以通过props向子组件传递一个回调函数,子组件可以在适当的时候调用这个回调函数并将数据或方法作为参数传递给父组件。//子组件......
  • react hook 修改对象数据的几种方式
    修改对象的方式在React中使用useState钩子来修改对象数据时,通常推荐使用函数式更新方式,以确保状态的不可变性,并让React能够正确地检测到状态变化并触发组件的重新渲染。以下是一些修改对象数据的例子:例子1:修改对象的一个属性importReact,{useState}from'react';......
  • react hook如何监听数据的变化,useEffect
    在React中,如果你需要监听某个状态或属性的变化,可以使用useEffectHook。useEffect可以让你在函数组件中执行副作用操作,例如数据获取、订阅或手动更改React组件中的DOM。基本用法importReact,{useState,useEffect}from'react';constExampleComponent=()=>{......
  • Rust中用enum实现多参数Hook机制
    在Rust中,如果想为enum实现一个带多参数的Hook机制,可以结合模式匹配和枚举来处理。这种方式可以扩展到支持不同类型的输入参数和逻辑处理。以下是一个实现enum和Hook的多参数机制的完整示例:定义枚举和Hook类型usestd::sync::{Arc,Mutex};//定义一个多参......
  • 使用纯的css如何定义变量?请举例说明
    在CSS中,你可以使用CSS自定义属性(也称为CSS变量)来存储和重复使用值。这些变量使你可以更轻松地维护和更新你的样式表,因为它们允许你在一个地方更改值,并在整个样式表中自动应用这些更改。以下是如何在CSS中定义和使用变量的示例:/*定义一个变量*/:root{--main-color:#06c;......
  • react jsx自定义标签 ts类型声明
    前言假设我自定义了一个组件全局导入的<myNewElementfoo="123"/>此时ts会报异常react18在react19之前,我们可以这么做declareglobal{namespaceJSX{interfaceIntrinsicElements{myNewElement:{foo:string}}}}react19但这在react19......
  • React 框架性能优化:代码分割与 SEO 改善
    React框架性能优化:代码分割与SEO改善React是构建现代前端应用的首选框架之一,但在项目规模不断扩大、功能复杂度逐步提升时,性能和SEO往往成为开发者关注的核心问题。本文将聚焦React的性能优化,探讨如何通过代码分割提升加载效率,并改善单页应用(SPA)的SEO表现。......
  • React 进阶深入理解核心概念与高阶实践
    在上一节中,我们学习了React的基础知识,包括组件、状态管理和基本操作。接下来,我们将进一步探索React的高级功能和实战技巧,例如组件间通信、高阶组件、ContextAPI、ReactRouter等。这些内容将帮助你构建更复杂、功能更丰富的应用。一、组件间通信React的组件树是单......
  • ReactPress最佳实践—搭建导航网站实战
    Github项目地址:https://github.com/fecommunity/easy-blog欢迎Star。近期,阮一峰在科技爱好者周刊第325期中推荐了一款开源工具——ReactPress,ReactPress一个基于Next.js的博客和CMS系统,可查看demo站点。(@fecommunity投稿)导航站可以通过后台配置分类网站,展示......
  • 2.1.3-2 第二次Reactor代码(百万并发测试过程的报错信息)
    零、概述做服务器性能测试的时候,并发量、QPS(每秒处理多少请求)、时迟(延迟,每个请求多长时间返回)、测试用例(业务代码,发什么数据和回什么数据)这四组都是重要的参数。并发→网络io的并发,是服务端最基础的技能。备注:研发和运营的数据不相同。一、报错信息serverip:192......