如何写一个react自定义的hooks?

使用过useState,也使用过ahook的useSetState,我们知道useState和useSetState左边赋值的第一个参数是接收初始值的变量和设置变量的方法,这里左边用的是数组解构实现的。所以,这里我们想一下,如何自定义一个hooks,也可以像useState和useSetState那样呢?

[a, setA] = useState();

按我个人的理解,react自定义hooks其实就是个函数,函数里可以使用useState、useSetState、useEffect,可以任意返回结果。下面我们以hooks的useBoolean为例,我写一个hooks。

1.写一个hooks


import {useEffect, useState} from 'react';function useBoolean(b: boolean = true): any {const [B, setB] = useState(false);const toggle = () => setB(!B);const set = () => setB(b);const setTrue = () => setB(true);const setFalse = () => setB(false);useEffect(() => {setB(b);}, []);return [B, { toggle, set, setTrue, setFalse }];
};export default useBoolean;

我们定义一个useBoolean的函数,函数使用useState定义一个B变量和setB方法用于改变状态,给B赋一个初始值false,在useEffect里设置调用useBoolean时赋的值,然后返回一个数组,数组的值分别是B变量,包含toggle, set, setTrue, setFalse等设置B变量的方法。至此,一个简单的hooks就实现了。

2.使用

const [B, { toggle, set, setTrue, setFalse }] = useBoolean();
console.log(B, new Date().getTime())

这里调用useBoolean,然后输出B变量,会发现B变量输出了两次,问题出在哪呢?原来是useBoolean hooks里的useEffect赋了值导致的。所以我们改进一下,注释掉useEffect,把const [B, setB] = useState(false);改成const [B, setB] = useState(b);,不使用useEffect去赋B变量初始值了。

import {useEffect, useState} from 'react';function useBoolean(b: boolean = true): any {const [B, setB] = useState(b);const toggle = () => setB(!B);const set = () => setB(b);const setTrue = () => setB(true);const setFalse = () => setB(false);// useEffect(() => {//   setB(b);// }, []);return [B, { toggle, set, setTrue, setFalse }];
};export default useBoolean;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744393.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北京调研公司揭秘:问卷调查6大秘籍,让你领先对手一步!

民安智库作为一家专业的第三方市场调研公司,我们经常会遇到客户需要开展问卷调查的情况。为了帮助客户更好地进行问卷调查,我们总结出了以下6大秘籍: 1.明确调查目的和受众群体 在进行问卷调查之前,一定要明确调查的目的和受众群…

【学习总结】Python transformers TrainingArguments 重要参数说明

代码: from transformers import TrainingArgumentstraining_args TrainingArguments(output_dirmodel_dir,per_device_train_batch_size16,num_train_epochs5,logging_steps100)TrainingArguments 类在以下代码里: /xxx/anaconda/envs/your_env/lib/…

Navicat16安装时报错记录

1.安装过程中一定要断网 2.安装好后,先不要直接打开客户端,应该先打开激活破解软件,如下: 选择HOSTS--》再Patch-->是,然后生成注册码,打开客户端正常执行即可

从“断亲”到“自我养育”,看年轻一代消费变迁丨小红书热点

一、不爱走亲戚,年轻人“断亲潮”来袭 今年春节期间,关于“农村出现以家庭为单位的断亲”的话题登上热搜。小红书等社交媒体平台上,也涌现出许多“回怼亲戚”的短视频,娱乐性调侃亦或是“阴阳怪气”地攻击,内容背后是当…

全局Ceph节点宕机处理

在极端情况下,如数据中心断电,造成 Ceph 存储集群全局宕机,可以按照本节所示流程进行 Ceph 集群上电恢复操作。 4.1 手动上电执行步骤 如为 Ceph 集群上电,monitor server 应最先上电;集群上电前确认使用 Ceph 之前端…

IIS上部署.netcore WebApi项目及swagger

.netcore项目一般是直接双击exe文件,运行服务,今天有个需求,需要把.netcore项目运行在IIS上,遇到了一个小坑,在这里记录一下。 安装IIS,怎么部署站点,这些过于简单就不细说了,不知道…

C++:继承与派生

为什么会有继承这样的语法呢??试想这样一个场景:假设我们这个App需要去获取不同类型用户的数据,并进行分类,那么就需要我们去写对应不同的类,比如说学生、老师、军人、公司职工…………每个类都需要有名字、…

品牌方如何借热点做话题?媒介盒子分享

每时每刻都有热点,品牌方总想着借热点来做话题营销,然而有些热点能让品牌有效曝光,有些热点稍不注意就会让品牌产生负面舆论,今天媒介盒子就来和大家好好聊聊:品牌方如何借热点做话题。 一、 热点选择 品牌方可以通过…

猿区 Node.js 版本控制工具介绍

Node.js 版本控制工具:nvm、n 和 fnm 如果你是一位刚开始学习 Node.js 的初学者,你可能已经注意到 Node.js 有多个版本。不同的项目可能需要不同的 Node.js 版本,而在本地环境中同时安装和管理这些版本可能会变得复杂。幸运的是,…

域内令牌窃取

前言 有这样一种场景,拿到了一台主机权限,是本地管理员,同时在这台主机上登录的是域管成员,这时我们可以通过dump lsass或通过 Kerberos TGT ,但是这是非常容易被edr命中的。 本文就通过令牌窃取进行研究&#xff0c…

正则表达式笔记+demo

//1.正则表达式由普通字符和特殊字符(又称元字符)组成的文字模式,是一个模板 // 常用元符号示例:^ . \ * ? { 、} ( 、 ) [ 、 ] | $ // ★★★这些元符号都有其特殊含义,如果要表示其本来字符的含义,需要…

mysql基础之事务

简介 事务是数据库的逻辑工作单位,具有原子性、一致性、隔离性、持久性四大特性。 【原子性】:事务中的操作要么全部成功,要么操作失败全部回滚,不会出行部分完成的状态。 【一致性】:事务开始到结束时,数据…

pgsql常用索引简写

文章来源:互联网博客文章,后续有时间再来细化整理。 在数据库查询中,合理的使用索引,可以极大提升数据库查询效率,充分利用系统资源。这个随着数据量的增加得到提升,越大越明显,也和业务线有关…

《鸟哥的Linux私房菜》第6章——总结与习题参考答案

目录 一、 简介 二、一些新了解的指令 1.touch- 修改文件时间或创建新文件 2.umask-新建文件/目录的默认权限 3.文件隐藏属性 4.文件特殊权限 5.file-观察文件类型 三、简答题部分 一、 简介 本章介绍了一些常用的文件与目录指令,包括新建/删除/复制/移动/查…

2024HVV行动-进军蓝中研判(log4j2、fastjson、Struts2、Shiro)

1、log4j2 特征: 恶意请求中包含 JNDI 协议地址,如"ldap://"、"rmi://"等,被 log4j2 解析为 JNDI 查找。 原理: 在日志输出中,未对字符进行严格的过滤,执行了 JNDI 协议加载的远程恶…

教师如何搭建学生查询考试分数的平台?

随着信息技术的快速发展,搭建一个学生查询考试分数的平台已经成为现代教育管理的重要组成部分。这样的平台不仅可以提高成绩管理的效率,还能为学生提供便捷、及时的成绩查询服务。那么,作为教师,我们应该如何搭建这样一个平台呢&a…

Python中的惩罚分析:理论与实践指南

目录 写在开头1. 理论基础1.1 优化问题与约束条件简介1.2 什么是惩罚分析1.3 惩罚分析的应用场景1.4 惩罚方法的类型2. 惩罚分析在Python中的实现2.1 实现代码示例2.2 未加惩罚的模型2.3 加惩罚的模型(L1和L2正则化)2.4 选择合适的惩罚方法与调整强度2.5 惩罚过程改善过拟合问…

【海贼王的数据航海】栈和队列

目录 1 -> 栈 1.1 -> 栈的概念及结构 1.2 -> 栈的实现 1.2.1 -> Stack.h 1.2.2 -> Stack.c 1.2.3 -> Test.c 2 -> 队列 2.1 -> 队列的概念及结构 2.2 -> 队列的实现 2.2.1 -> Queue.h 2.2.2 -> Queue.c 1 -> 栈 1.1 -> 栈的…

如何缩小你和大厂UI设计师之间的差距?重点关注你的作品集!

据说金三银四,在新一轮招聘旺季到来之前,你做过UI作品集吗?一个好的作品集可以为你的面试增加很多分数!在开始之前,分享五个适合交互设计作品集的软件: 一、即时设计 这是一款专门为UI设计而设计的在线矢…

多线程(volatile)

volatile的功能 保证内存可见性禁止指令重排序 内存可见性 简单的理解 两(多)个线程同时针对一个变量进行操作, 一个线程读, 一个线程修改, 此时读到的值不一定是修改过后的值 即读线程没有感知到变量的变化 (其实是 编译器/JVM 对于代码在多线程情况下的优化进行了误判) 从 J…