React Hooks的使用方法及注意事项_老版本升级 react 如何快速使用 hooks-程序员宅基地

技术标签: react.js  React  javascript  ecmascript  

React Hooks是React 16.8版本引入的新特性,它们可以让你在函数式组件中使用状态和其他React功能,而不需要编写类组件。下面是React中所有钩子的使用方法及注意事项:

  1. useState:用于在函数式组件中添加局部状态。

使用方法:

import React, { useState } from 'react';

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

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

注意事项:

  • useState的第一个参数是初始状态值,可以是任何类型的值。
  • useState函数返回一个数组,其中第一个元素是当前状态值,第二个元素是用于更新状态的函数。
  • 在使用useState的时候,需要导入React库。
  1. useEffect:在函数组件中添加副作用(比如订阅和取消订阅)。

使用方法:

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

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

  useEffect(() => {
    // Update the document title using the browser API
    document.title = `You clicked ${count} times`;
  }, [count]);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

注意事项:

  • useEffect接受一个函数和一个可选的依赖项数组作为参数。
  • 传递给useEffect的函数将在组件每次渲染时都执行。
  • 可以使用依赖项数组来避免重复执行,只有依赖项中的值发生变化时才会执行。
  • useEffect的返回值是一个清除函数,用于清除组件卸载时产生的副作用(例如定时器)。
  1. useContext:用于在多级嵌套的组件中传递数据。

使用方法:

import React, { useContext } from 'react';
const ThemeContext = React.createContext('light');

function ThemedButton(props) {
  const theme = useContext(ThemeContext);
  return (
    <button {...props} style={
   {backgroundColor: theme.background}} />
  );
}

function Toolbar(props) {
  return (
    <div>
      <ThemedButton onClick={props.changeTheme}>
        Change Theme
      </ThemedButton>
    </div>
  );
}

注意事项:

  • useContext接收一个上下文对象作为参数。
  • 上下文对象可通过React.createContext创建并在父组件中初始化。
  • useContext将返回上下文对象的当前值,如果没有提供上下文提供程序,则使用defaultValue。
  1. useReducer:一种替代useState的方式,用于管理复杂的本地状态。

使用方法:

import React, { useReducer } from 'react';

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, {count: 0});
  return (
    <>
      Count: {state.count}
      <button onClick={() => dispatch({type: 'decrement'})}>-</button>
      <button onClick={() => dispatch({type: 'increment'})}>+</button>
    </>
  );
}

注意事项:

  • useReducer接受一个reducer函数和一个初始值作为参数。
  • 返回一个状态值和一个派发操作函数,用于触发reducer修改状态值。
  • useReducer可以用于管理复杂的本地状态,类似于Redux的设计思路。
  1. useCallback:用于避免在渲染时重复创建回调函数。

使用方法:

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

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

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={handleClick}>
        Click me
      </button>
    </div>
  );
}

注意事项:

  • useCallback接受一个函数和一个依赖项数组作为参数。
  • 如果依赖项数组中的值没有发生变化,则返回memoized的函数。
  • 可以使用useCallback避免在每次渲染时都创建新的回调函数,优化性能。
  1. useMemo:用于记忆计算结果,避免重复计算。

使用方法:

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

function Example() {
  const [count, setCount] = useState(0);
  const memoizedValue = useMemo(() => {
    return count * 2;
  }, [count]);

  return (
    <div>
      <p>Count: {count}, Memoized Value: {memoizedValue}</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

注意事项:

  • useMemo接受一个函数和一个依赖项数组作为参数。
  • 如果依赖项数组中的值没有发生变化,则返回memoized的记忆计算结果。
  • 可以使用useMemo避免重复计算,优化性能。
  1. useRef:用于在函数组件中存储可变值。

使用方法:

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

function Example() {
  const [count, setCount] = useState(0);
  const prevCountRef = useRef();

  useEffect(() => {
    prevCountRef.current = count;
  });

  const prevCount = prevCountRef.current;

  return (
    <div>
      <p>Previous Count: {prevCount}</p>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

注意事项:

  • useRef函数返回一个可变的ref对象,可以存储任何值。
  • 可以通过Ref对象current属性来读取或修改存储的值。
  • useRef通常用于在effect中存储前一个状态或其他可变值。

这些是React中常用的Hooks,使用它们可以让你更轻松地管理状态和副作用。需要注意,Hooks只能在函数式组件和自定义Hooks中使用,不能在类组件中使用。同时,使用Hooks时需要导入React库,以便React正确地管理Hooks的状态。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39024950/article/details/130888248

智能推荐

前端开发之vue-grid-layout的使用和实例-程序员宅基地

文章浏览阅读1.1w次,点赞7次,收藏34次。vue-grid-layout的使用、实例、遇到的问题和解决方案_vue-grid-layout

Power Apps-上传附件控件_powerapps点击按钮上传附件-程序员宅基地

文章浏览阅读218次。然后连接一个数据源,就会在下面自动产生一个添加附件的组件。把这个控件复制粘贴到页面里,就可以单独使用来上传了。插入一个“编辑”窗体。_powerapps点击按钮上传附件

C++ 面向对象(Object-Oriented)的特征 & 构造函数& 析构函数_"object(cnofd[\"ofdrender\"])十条"-程序员宅基地

文章浏览阅读264次。(1) Abstraction (抽象)(2) Polymorphism (多态)(3) Inheritance (继承)(4) Encapsulation (封装)_"object(cnofd[\"ofdrender\"])十条"

修改node_modules源码,并保存,使用patch-package打补丁,git提交代码后,所有人可以用到修改后的_修改 node_modules-程序员宅基地

文章浏览阅读133次。删除node_modules,重新npm install看是否成功。在 package.json 文件中的 scripts 中加入。修改你的第三方库的bug等。然后目录会多出一个目录文件。_修改 node_modules

【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure-程序员宅基地

文章浏览阅读883次。【代码】【】kali--password:su的 Authentication failure问题,&sudo passwd root输入密码时Sorry, try again._password: su: authentication failure

整理5个优秀的微信小程序开源项目_微信小程序开源模板-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏97次。整理5个优秀的微信小程序开源项目。收集了微信小程序开发过程中会使用到的资料、问题以及第三方组件库。_微信小程序开源模板

随便推点

Centos7最简搭建NFS服务器_centos7 搭建nfs server-程序员宅基地

文章浏览阅读128次。Centos7最简搭建NFS服务器_centos7 搭建nfs server

Springboot整合Mybatis-Plus使用总结(mybatis 坑补充)_mybaitis-plus ruledataobjectattributemapper' and '-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏3次。前言mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。..._mybaitis-plus ruledataobjectattributemapper' and 'com.picc.rule.management.d

EECE 1080C / Programming for ECESummer 2022 Laboratory 4: Global Functions Practice_eece1080c-程序员宅基地

文章浏览阅读325次。EECE 1080C / Programming for ECESummer 2022Laboratory 4: Global Functions PracticePlagiarism will not be tolerated:Topics covered:function creation and call statements (emphasis on global functions)Objective:To practice program development b_eece1080c

洛谷p4777 【模板】扩展中国剩余定理-程序员宅基地

文章浏览阅读53次。被同机房早就1年前就学过的东西我现在才学,wtcl。设要求的数为\(x\)。设当前处理到第\(k\)个同余式,设\(M = LCM ^ {k - 1} _ {i - 1}\) ,前\(k - 1\)个的通解就是\(x + i * M\)。那么其实第\(k\)个来说,其实就是求一个\(y\)使得\(x + y * M ≡ a_k(mod b_k)\)转化一下就是\(y * M ...

android 退出应用没有走ondestory方法,[Android基础论]为何Activity退出之后,系统没有调用onDestroy方法?...-程序员宅基地

文章浏览阅读1.3k次。首先,问题是如何出现的?晚上复查代码,发现一个activity没有调用自己的ondestroy方法我表示非常的费解,于是我检查了下代码。发现再finish代码之后接了如下代码finish();System.exit(0);//这就是罪魁祸首为什么这样写会出现问题System.exit(0);////看一下函数的原型public static void exit (int code)//Added ..._android 手动杀死app,activity不执行ondestroy

SylixOS快问快答_select函数 导致堆栈溢出 sylixos-程序员宅基地

文章浏览阅读894次。Q: SylixOS 版权是什么形式, 是否分为<开发版税>和<运行时版税>.A: SylixOS 是开源并免费的操作系统, 支持 BSD/GPL 协议(GPL 版本暂未确定). 没有任何的运行时版税. 您可以用她来做任何 您喜欢做的项目. 也可以修改 SylixOS 的源代码, 不需要支付任何费用. 当然笔者希望您可以将使用 SylixOS 开发的项目 (不需要开源)或对 SylixOS 源码的修改及时告知笔者.需要指出: SylixOS 本身仅是笔者用来提升自己水平而开发的_select函数 导致堆栈溢出 sylixos

推荐文章

热门文章

相关标签