react自定义useState hook获取更新后值

2023-11-09

您好,如果喜欢我的文章,可以关注我的公众号「量子前端」,将不定期关注推送前端好文~

在业务中有比较多的场景需要在setState中获取更新后的值从而进行下一步的业务操作,在Class组件中可以通过:

this.setState({
	name: '123'
}, (newVal) => {
	console.log(newVal);
})

而react自身的useState hook并不支持这样做,通常是这样获取新值:

useEffect(() => {
	console.log(name);
}, [name])

自定义useState主要思路其实是基于useState和useEffect,在useEffect获取到状态变化时回调callback函数,从而拿到新值,直接上代码~

import { SetStateAction, useCallback, useState, useEffect, useRef } from 'react';

const useStateCallback = (defaultVal: any) => {
  const [state, setState] = useState(defaultVal);
  const listenRef = useRef<any>(); //监听新状态的回调器
  const _setState = useCallback((newVal: SetStateAction<any>, callback: Function) => {
    //更新业务
    listenRef.current = callback;
    setState(newVal);
  }, []);
  useEffect(() => {
    listenRef.current && listenRef.current(state); //回调新状态
  }, [state]);

  return [state, _setState];
};

export default useStateCallback;

其实hook本身就是多了一步在更新状态时把自定义的callback丢给useRef,让useRef长久保留在内存中,并且监听状态,在状态更新时调用内存中(useRef)中的回调函数,从而实现。

hooks其实本身并非高深的东西,其实hooks就是函数,而自定义hook其实就是基于react核心的一些hooks去根据我们的业务实现一些和状态有关的工具函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react自定义useState hook获取更新后值 的相关文章

随机推荐

  • 行为型模式-解释器模式

    package per mjn pattern interpreter import java util HashMap import java util Map 环境角色类 public class Context 定义一个map集合 用
  • C++ 多态

    多态按字面的意思就是多种形态 当类之间存在层次结构 并且类之间是通过继承关联时 就会用到多态 C 多态意味着调用成员函数时 会根据调用函数的对象的类型来执行不同的函数 下面的实例中 基类 Shape 被派生为两个类 如下所示 实例 incl
  • 入行软件测试7年,才知道原来字节跳动这么容易进

    当前就业环境 裁员 失业消息满天飞 好像有一份工作就不错了 更别说高薪了 其实这只是一方面 而另一方面 各大企业依然求贤若渴 高技术人才依然紧缺 只要你技术过硬 拿个年薪50w不是问题 我的人生格言 比你优秀的人不可怕 可怕的是比你优秀的人
  • C# Winform基本知识、文件结构、控件简介

    1 程序入口 Program类 STAThread com线程模型 单线程单位 如果没有它 无法工作 Application 提供了一系列静态化方法和属性 来管理应用程序 Application EnableVisualStyles 启用应
  • Python 异常捕获与处理

    视频版教程 Python3零基础7天入门实战视频教程 异常捕获与处理 如果出现程序异常 我们不去捕获和处理 那么程序遇到异常 就直接终止 后续的代码无法继续执行 这将是可怕的事情 Python提供了完善的异常处理机制 可以实现捕获异常 处理
  • html头部代码

    学习html是件比较容易的事情 但单单学html语言肯定是不够用的 所以大多数人并没有拿html作为学习核心 而是将html作为javascript 动态语言或者css学习的必经之路 于是很多人并不关注一些其他的html标签 主流书籍大多对
  • 【JavaSE系列】第八话 —— 继承和它的边角料们

    导航小助手 思维导图 一 引出继承 二 继承的概念 三 继承的语法 四 父类成员访问 4 1 子类中访问父类的成员变量 4 2 子类访问父类的成员方法 五 super 关键字 5 1 super 成员变量 5 2 super 成员方法 5
  • QT学习 -- 12信号连接信号

    视频学习链接 https www bilibili com video BV1g4411H78N p 12 信号可以连接事件 普通函数 可以连接槽函数 也可以连接信号 一 信号触发 连接 信号 举例如下 当用鼠标点击按键 按键发出点击 cl
  • 【Leetcode】560. 和为K的子数组

    题目描述 给你一个整数数组 nums 和一个整数 k 请你统计并返回该数组中和为 k 的连续子数组的个数 题解 暴力解法 双循环 i指针从左往右走 j指针从i往左走 一个个遍历一个个加起来 直到加到等于k 就计数一次 执行用时 1445 m
  • okhttp异常: java.io.IOException: closed okio.RealBufferedSource$1.read

    java io IOException closed at okio RealBufferedSource 1 read RealBufferedSource java 405 at sun nio cs StreamDecoder rea
  • Redis——redis配置与优化

    文章目录 一 关系数据库与非关系型数据库 1 关系型数据库 2 非关系型数据库 二 Redis 简介 1 Redis的应用场景 2 Redis的优点 三 Redis 安装部署 1 安装Redis 2 配置参数 四 Redis
  • 任务管理器详解

    进程 看是否有除系统外多余进程 可能是病毒或没有完全关闭的进程 影响机器性能 进程下显示了所有当前正在运行的进程 包括应用程序 后台服务等 性能下可以看到CPU和内存 页面文件的使用情况 卡机 死机 中毒时 CPU使用率会达到100 CPU
  • mysql 用sqlyog连接1045错误解决办法(数据库在linux)

    1045 多半就是要么你端口号3306没开 要么就是你密码错误 安装网路分析 yum install net tools 防火墙开放3306端口 root localhost firewall cmd zone public add por
  • 学生信息管理系统(登录功能)

    工具eclipse 主要操作登陆 增删查改 编写实体类 public class Student private int id private String sId 学号 private String name private String
  • CTF BugKu平台———(Web篇②)

    源代码 unescape编码 https tool chinaz com Tools Escape aspx PS p1 35 34 61 61 32 p2 然后提交即可 67d709b2b54aa2aa648cf6e87a7114f1 文
  • 操作系统 线程同步实验

    操作系统 线程同步实验 一 实验目标 顺序表循环队列实现的实验目标 掌握使用顺序表和循环队列实现队列的基本操作 如队列的插入 删除 遍历等 同时了解循环队列的内部实现原理和利用循环队列解决实际问题的方法 Linux生产者 消费者问题的多线程
  • MFC自定义消息

    一 背景 消息机制是windows程序的典型运行机制 在MFC中有很多已经封装好了的消息 但是在有些特殊情况下我们需要自定义一些消息去完成一些我们所需要的功能 这时候MFC的向导不能帮助我们做到这一点 对此 我们可以通过添加相应的代码去完成
  • C++ 深浅拷贝、写时拷贝

    前言 本章以string类为例介绍浅拷贝与深拷贝 引用计数写时拷贝作为了解内容 string类的模拟实现参考C string类的模拟实现 文章目录 1 浅拷贝 2 深拷贝 3 引用计数 写时拷贝 1 浅拷贝 浅拷贝 对于有申请空间的对象的类
  • Java集合类的总结与比较

    Collection List LinkedList ArrayList Vector Stack Set Map Hashtable HashMap WeakHashMap Collection接口 Collection是最基本的集合接口
  • react自定义useState hook获取更新后值

    您好 如果喜欢我的文章 可以关注我的公众号 量子前端 将不定期关注推送前端好文 在业务中有比较多的场景需要在setState中获取更新后的值从而进行下一步的业务操作 在Class组件中可以通过 this setState name 123