React学习笔记之十四: React hooks初探

2023-11-04

React Hooks

本文参考主要博文:

阮一峰老师的 React-hooks 教程

How to fetch data with React Hooks?

useEffect 完整指南

React-hooks 的官方文档

demo

React hooks 的主要功能是让函数式组件能够模拟出自身的状态 state 和生命钩子函数

常用的 React Hooks 函数包括

  • useState
  • useEffect
  • useContext
  • useReducer

1. useState

useState 主要是创建一个 state 变量并赋予初始值

通过数组解构的方式来获取 state 变量和一个改变该变量的函数

import React, { useState, useEffect } from 'react'
import { Button, Notify } from 'zent'

export function Counter(props) {
  // 这里的counter为state中的一个值且其初始值为0
  const [counter, setCounter] = useState(0)

  const handleSetCounter = number => () => {
    // 通过调用setCounter可以实现对于counter的赋值
    setCounter(number)
  }

  return (
    <div>
      <div>{counter}</div>
      <Button onClick={handleSetCounter(counter + 1)} type="primary">
        +1
      </Button>
      <Button type="primary" onClick={handleSetCounter(counter - 1)}>
        -1
      </Button>
      <Button type="danger" onClick={handleSetCounter(0)}>
        reset
      </Button>
    </div>
  )
}

2. useEffect

  • useEfffect 的执行一般在页面渲染之后 -> React 保证了每次 effect 的执行都在页面的 DOM 更新完毕之后!
  • useEffect 一般放在函数内部,这样可以直接完成对 state 和更改 state 函数的调用方法
  • useEffect 的第一个参数为一个函数,用来作为每次渲染完成后执行的回调函数 effect,通过 return 一个函数来作为清除操作时调用的函数(组件卸载的时候调用)

可能存在的问题

这里可能会有一个问题 如果当我们在 useEffect 中调用了改变 state 那可能又会渲染这个函数, 再调用 effect 函数可能就会出现循环调用的问题

解决办法

通过 useEffect 函数中的第二个参数来解决

我们可以通过 useEffect 中的第二个参数来设置,该 effect 函数只在特定的某个参数进行变动的时候才会执行

这里要注意的是,如果第二个参数为[]说明该函数在任何参数变动的时候都不执行,则该函数只在一开始初始化 render 的时候执行一次,所以代表的是 componentDidMount 这个钩子函数

3. useContext

  • useContext主要用于为函数式组件接入伏组件的context
  • useContext相当于一个Consumer
// 父组件 App.tsx
import React from 'react';
import './App.css';
import { BrowserRouter as Router, Link, Route } from 'react-router-dom';
import { Index } from './component/Index';

// 给定一个初始值
// 1. 首先创建一个createContext
export const Context = React.createContext({ name: '' });

export const App: React.FC = () => {
  return (
    <div className="App">
    	// 2. 通过Context的Provider来共享Context的值
      <Context.Provider value={{ name: 'Context Name' }}>
    		<Index />
      </Context.Provider>
    </div>
  );
};

子组件获取其Context的方式

// Index.tsx
import React, { useContext } from 'react'
// 父组件
import { Context } from '../../App';

export function Index(): Props {

  const { name } = useContext(Context);

  return (
    <div>
      Index { name }
    </div>
  )
}

Notes: 使用方法

1. 在父组件中调用React.createContext创建一个Context并赋予初始值
2. 通过Context.Provider把Context传给子树
3. 在需要调用的子组件中导入Context
4. 通过useContext获得导出的值(通过解构赋值得到)

4.useReducer

  • useReducer类似于Redux(调用的作用机制),但是又何redux不一样(只能维护组件内的状态)
  • useReducer 会比 useState 更适用,例如 state 逻辑较复杂且包含多个子值,或者下一个 state 依赖于之前的 state 等。并且,使用 useReducer 还能给那些会触发深更新的组件做性能优化,因为你可以向子组件传递 dispatch 而不是回调函数 。(官网原文)
  • useReducer一般用于复杂的业务逻辑下用来更新state, 然后通过reducer函数中做集中的状态控制
import React, { useReducer, useState } from 'react';
import { Button, Input } from 'zent';
interface IProps {}

// 1. 给定reducer的初始值
const initialState = {
  commentList: [{ name: 'React', isDone: false }, { name: 'Vue', isDone: true }]
};

// 2. 创建一个reducer
const commentListReducer = (state, action) => {
  switch (action.type) {
    case 'addComment':
      return {
        ...state,
        commentList: [...state.commentList, action.payload]
      };
    default:
      break;
  }
  return state;
};

export function CommentList(): IProps {
  // 3. 通过useReducer创建一个reducer
  const [commentState, commentDispatch] = useReducer(
    commentListReducer,
    initialState
  );

  const [inputContent, setContent] = useState('');

  // 4. 通过dispatch方法来发起一个action
  // action传到reducer完成处理后返回更改state
  const addComment = value => () =>
    commentDispatch({ type: 'addComment', payload: {name: value, isDone: false} });

  const inputChange = event => setContent(event.target.value);

  const renderController = () => (
    <div style={{ display: 'flex' }}>
      <Input
        value={inputContent}
        onChange={inputChange}
        placeholder="请输入值"
        width="100px"
      ></Input>
      <Button onClick={addComment(inputContent)}>新增信息</Button>
    </div>
  );

  const rednderCommentList = () => (
    <div>
      {commentState.commentList.map(elem => (
        <div>
          {elem.name} / {elem.isDone ? '已完成' : '未完成'}
        </div>
      ))}
    </div>
  );

  return (
    <div>
      {renderController()}
      {rednderCommentList()}
    </div>
  );
}

Notes: 使用方法

  1. 创建初始值和reducer
  2. 通过useReducer创建状态管理的reducer,得到一个statedispatch方法
  3. 在需要的地方通过dispatch方法完成对于state的改变,其中一般通过action.type来指定操作方法,通过action.payload来指定参数(也可以自己自定义问题不大)
  4. state更改后回重新渲染得到新的页面
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React学习笔记之十四: React hooks初探 的相关文章

  • React Native 环境搭建, 新建项目, 运行和调试

    React Native 可以理解为一个基于 JavaScript 具备动态配置能力 面向前端开发者的移动端开发框架 目前为止虽然一直还没有V1 0 0版本 但是相信很多小伙伴都了解过或者已经入坑了 为什么RN那么有人气呢 我们可以先简单分
  • React 初识之Umi项目搭建实战

    一 创建项目 创建之前需要安装 Node js 和 npm yarn 这俩个环境 在WebStorm里面创建一个项目 输入命令 yarn create umi 弹出选项 这里我们选择第二项APP 选择是否使用typescript 这里选no
  • 在react项目中,使用craco插件进行mobx配置解决方案

    在使用react项目中 不可避免的要使用蚂蚁金服出品的ant desgin前端UI组件 ant desgin推荐使用 craco 一个对 create react app 进行自定义配置的社区解决方案 对 create react app
  • 使用React实现时间的天数,小时数,分钟数之间的自动转化

    由于公司项目需要使用React实现时间的天数 小时数 分钟数之间的自动转化 在遇了很多坑后终于解决了问题 需要实现的功能 当用户在输入小时数的时候 超过24小时就自动转化为相应的天数 当用户在输入分钟数的时候 超过60分钟以上就要自动转化成
  • 在校学生如何白嫖黑群辉虚拟机和内网穿透,实现海量资源的公网访问?(小白专用)

    文章目录 前言 本教程解决的问题是 按照本教程方法操作后 达到的效果是 前排提醒 1 搭建群辉虚拟机 1 1 下载黑群辉文件 vmvare虚拟机安装包 1 2 安装VMware虚拟机 1 3 解压黑 群辉虚拟机文件 1 4 虚拟机初始化 1
  • 前端学习——JavaScript原生实现购物车案例

    一 购物车案例 1 1 案例介绍 今天我们来写另外一个购物车案例 说实话对于我来说这个是花了将近三个小时的时间然后才做出来的 里面可能还存在一些我没有发现的问题 但是能完成基本的功能 对于一些基本的需求都是可以完成的 下面照旧是案例实现的g
  • React页面设计初体验

    1 定制路由 export default login path login name login component layouts BlankLayout routes path login component Login Index
  • 编写一套工具库并上传NPM

    你的 工具箱 开箱即可用的 directive utils 说明 vue3 directive tools 是一个方便在 Vue 3 Ts 项目中快速使用的 directive tool 的 npm 插件 它允许您轻松地在项目中添加多种功能
  • 组件间样式覆盖问题--CSS Modules

    1 组件间样式覆盖问题 问题 CityList 组件的样式 会影响 Map 组件的样式 原因 在配置路由时 CityList 和 Map 组件都被导入到项目中 那么组件的样式也就被导入到项目中了 如果组件之间样式名称相同 那么一个组件中的样
  • Notion笔记搭建博客网站 - NotionNext

    NotionNext是什么 NotionNext是我在Github上开源的基于Next js框架开发的博客生成器 目的是帮助写作爱好者们通过Notion笔记快速搭建一个独立站 从而专注于写作 而不需要操心网站的维护 它将您的Notion笔记
  • React-(4)React中的事件绑定

    React中的事件绑定 在 React 组件中 每个方法的上下文都会指向该组件的实例 即自动绑定 this 为当前组件 而且 React 还会对这种引用进行缓存 以达到 CPU 和内存的最优化 在使用 ES6 classes 或者纯函数时
  • umi 后台管理demo

    umi 后台管理demo umi react ts dva antd egg 有待优化 简单的前后端管理demo 接口提供增删查改 前端也有相应功能 github代码 https github com huiBuiling ql admin
  • React、Vue2.x、Vue3.0的diff算法

    前言 本文章不讲解 vDom 实现 mount 挂载 以及 render 函数 只讨论三种 diff 算法 VNode 类型不考虑 component functional component Fragment Teleport 只考虑 E
  • ant design pro 代码学习(七) ----- 组件封装(登录模块)

    以登录模块为例 对ant design pro的组件封装进行相关分析 登录模块包含基础组件的封装 组件按模块划分 同类组件通过配置文件生成 跨层级组件直接数据通信等 相对来说还是具有一定的代表性 1 登录模块流程图 首先 全局了解一下登录模
  • vue发展历史简介

    基本介绍 Vue 是一套用于构建用户界面的 渐进式框架 与其它大型框架不同的是 Vue 被设计为可以自底向上逐层应用 最初它不过是个人项目 时至今日 已成为全世界三大前端框架之一 github 上拥有 17 8万 Star 领先于 Reac
  • React事件处理及事件流

    React事件处理 React事件处理是通过将事件处理器绑定到组建上处理事件 事件触发的同时更新组建的内部状态 内部状态更新会触发组件的重绘 React 元素的事件处理和 DOM 元素的事件处理很相似 但语法上的略有区别 在React中事件
  • React配置@src根路径

    第一种 直接修改node modules包中的webpack config js文件 找到node modules react scripts config webpack config js文件 修改其中alias中的配置 添加 src
  • 学习笔记——SVG.js中形状元素的创建及其相关方法

    CreateElement 1 创建svg元素 在svg js中 每个元素都是一个对象 可以通过构造它来创建 import Rect from svgdotjs svg js var rect new Rect size 100 100 a
  • 自定义hooks

    自定义传参hooks 把大多数的通用代码 或者props 抽成一个hooks 用hooks实现上下文 就不用再一一传参了 实现原理 主要是通过createContext useContext 生产 消费者模式 用于大量props一层一层传参
  • React中渲染html结构---dangerouslySetInnerHTML

    dangerouslySetInnerHTML 胡子 语法绑定的内容全部作为普通文本渲染 渲染html结构基于 dangerouslySetInnerHTML dangerouslySetInnerHTML 是 React 标签的一个属性

随机推荐

  • Prim算法 与 Kruskal算法 求最小生成树

    一 Prim算法 普利姆 Prim 算法适用于求解无向图中的最小生成树 Minimum Cost Spanning Tree 下面是Prim算法构造最小生成树的过程图解 选择一个节点开始 比如V1进入集合U 剩下的集合的
  • Spring Boot多线程环境下,解决多个定时任务冲突问题

    问题引入 关于定时任务注解 Scheduled在之前的文章已经讲到 Spring Boot定时器默认的是单线程的 但是问题就来了 如果在线程争夺资源后 某个线程需要比较长时间才能执行完 那其他的定时器怎么办 都只能进入等待状态 时间越久 累
  • cmake 条件判断

    以下内容来自cmake官方文档 传送门 if 语法 if
  • C++11变长模板

    C 11变长模板 文章目录 简介 模板和函数参数包 模板参数包说明 解包 在可变参数模板中使用递归 进阶 不同的包拓展方式 简介 该篇博客主要介绍C 11中的变长模板 对变长模板的原理和使用方法进行介绍 本篇博客参考书籍深入理解C 11新特
  • 再淡spring jdbc 连接池断开重连设置

    先看一段错误日志 Error querying database Cause com mysql jdbc exceptions jdbc4 MySQLNonTransientConnectionException No operation
  • 安装Fortran语言编程环境全流程记录

    本文以Visual Studio 2017 Intel Parallel Studio XE 2019配置Fortran语言编译环境 系统版本Windows10 目录 版本问题 安装VS2017 安装Intel Parallel Studi
  • Win10 Snip & sketch无法保存截图

    如果你看到了我的博客 相信你也遇上了上面这个问题 在一次win10更新后发现 当按下Win Shift S使用截图后无法正常保存的问题 我寻找了很多文章也没有找到解决方案 最后找到了一个替代的软件 感觉挺好用的 微软官网上面找到的答案在 这
  • 【千律】C++基础:计算宽窄字节字符串所占用的字节数

    include
  • 【C ++ 】C++中的double和float区别

    文章目录 一 概述 二 精度的理解 三 存储空间 四 范围 五 运算精度 一 概述 在C 中 double和float是用于表示浮点数的两种数据类型 它们具有以下的详细介绍和区别 精度 double类型的变量具有更高的精度 即它可以表示更多
  • NPM详解

    NPM详解 介绍 命令 执行多个脚本 pre post 错误 静默消息 日志等级 从文件中引用路径 访问环境变量 传递参数 命名规则 前缀 在拿到一个项目之后 如何看入口文件 如何运行项目 我们都会找到 package json 中的 sc
  • 小点dian儿:pandas数据存入文件,行索引处理

    小点dian儿 存入数据的时候 我们希望对数据在系统的行名 保存或者不保存 参数 index None 类似 header False不保存列名 在我们不进行如上的设计的时候 系统或分配默认的行index 0 1 2 在我们将运行结果存入文
  • Python预测糖尿病

    今天给大家讲解一个实战案例 如何根据现有数据预测糖尿病 在这个案例开始之前 希望大家回忆一下大学里讲过的线性回归的知识 这是数据挖掘里非常重要的一部分知识 当然 鉴于大家都学过 本篇就不再赘述 一 数据集介绍 diabetes datase
  • 人工学习之预测2023年考研英语答案分布

    统计了2012 2022年共计11年的英语一完形和阅读答案 除了20年 ABCD四个选项基本都均匀分布 所以大概率是各自5个或者两个5一个4 20年类似13年 不管完形还是阅读 答案都是十分均匀分布 即5555型 至于原因 可能是老师的偏好
  • 计算机网络(第七版)谢希仁1-2章笔记

    笔记基于谢希仁老师的计算机网络笔记 第七版 第1 2章 1章 概述 2章 物理层 第1章 概述 1 1 计算机网络在信息时代的中的作用 1 21世纪的一些重要特征就是数字化 网络化和信息化 是一个以网络为核心的信息时代 2 三类网络 电信网
  • 登录功能的测试点大全

    登录功能的测试点大全 还是比较全面的 有什么考虑不到的 可以补上 功能性用例 1 输入已注册的用户名和正确的密码 验证是否成功登录 2 输入已注册的用户名和不正确的密码 验证是否成功失败 且提示信息正确 3 输入未注册的用户名和任意密码 验
  • [转]QNX_BSP包分析

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 这篇文章主要分
  • FreeRTOS简述和移植文档

    FreeRTOS简述和移植文档 文章目录 FreeRTOS简述和移植文档 1 前言 2 FreeRTOS简述 1 概述 2 实现 3 主要特色 4 支持平台 3 移植FreeRTOS 4 最后 1 前言 目前由于IOT的飞速发展 针对单片机
  • docker删除镜像和容器后,磁盘空间未释放

    用下列命令 docker container prune f docker image prune f docker volume prune f 它们将释放被停止容器 悬空图像和悬空卷使用的空间
  • 语雀 个人使用指南

    优点 markdown 此处为语雀内容卡片 点击链接查看 https www yuque com nanfang fw1qz wuc5c4 cts7ny 特色卡片 基础模块 思维导图无缝组成文本 第三方服务 免费即够用 多平台 云端存储 中
  • React学习笔记之十四: React hooks初探

    React Hooks 本文参考主要博文 阮一峰老师的 React hooks 教程 How to fetch data with React Hooks useEffect 完整指南 React hooks 的官方文档 demo Reac