当前位置: 首页 > news >正文

浅谈react如何自定义hooks

react 自定义 hooks

简介

一句话:使用自定义hooks可以将某些组件逻辑提取到可重用的函数中。

自定义hooks是一个从use开始的调用其他hooks的Javascript函数。

下面以一个案例: 新闻发布操作,来简单说一下react 自定义 hooks。

不使用自定义hooks时

未发布新闻 – UnPublished.js

// UnPublished.jsimport React, { useEffect, useState } from "react";
import { fetchGetUnPublishedNewsList } from "../../../utils/api";
import NewsPublish from "./components/NewsPublish";import { reactLocalStorage } from "reactjs-localstorage";export default function UnPublished() {// 获取用户权限列表const { roleId, region, username } = reactLocalStorage.getObject("token");const [dataSource, setdataSource] = useState([]);useEffect(() => {const fetchData = async () => {let params = {author: username,publishState: 1, // publishStateList = ['未发布','待发布','已发布','已下线']};const newsListData = await fetchGetUnPublishedNewsList(params); setdataSource(newsListData);};fetchData();}, []);return (<div><NewsPublish dataSource={dataSource}></NewsPublish></div>);
}

发布新闻 – Published.js

// Published.jsimport React, { useEffect, useState } from "react";
import { fetchGetUnPublishedNewsList } from "../../../utils/api";
import NewsPublish from "./components/NewsPublish";import { reactLocalStorage } from "reactjs-localstorage";export default function UnPublished() {// 获取用户权限列表const { roleId, region, username } = reactLocalStorage.getObject("token");const [dataSource, setdataSource] = useState([]);useEffect(() => {const fetchData = async () => {let params = {author: username,publishState: 3, // publishStateList = ['未发布','待发布','已发布','已下线']};const newsListData = await fetchGetUnPublishedNewsList(params); setdataSource(newsListData);};fetchData();}, []);return (<div><NewsPublish dataSource={dataSource}></NewsPublish></div>);
}

很明显,以上两个文件呈现效果不同,但使用的 逻辑代码大部分相同 时,这些逻辑代码我们就可以使用hooks进行逻辑复用。

使用自定义hooks

我们抽离以上两个文件里可以复用的逻辑代码,抽离相同逻辑代码部分,自定义hooks (即:把fetch请求数据部分,单独抽离出来),新建一个usePublish的文件。

./components/usePublish

// ./components/usePublishimport { useEffect, useState } from "react";
import { fetchGetUnPublishedNewsList } from "../../../../utils/api";
import { reactLocalStorage } from "reactjs-localstorage";function usePublish(type) { // 注意这里// 获取用户权限列表const { username } = reactLocalStorage.getObject("token");const [dataSource, setdataSource] = useState([]);useEffect(() => {const fetchData = async () => {let params = {author: username,publishState: type, // publishStateList = ['未发布','待发布','已发布','已下线']};const newsListData = await fetchGetUnPublishedNewsList(params);setdataSource(newsListData);};fetchData();}, []);return { dataSource };
}export default usePublish;

未发布新闻 – UnPublished.js 改进

import NewsPublish from "./components/NewsPublish"; import usePublish from "./components/usePublish"; // 引入自定义hooksexport default function UnPublished() {  const { dataSource } = usePublish(1);   // 使用自定义hooksreturn (<div> <NewsPublish dataSource={dataSource}></NewsPublish></div>);
}

发布新闻 – Published.js 改进

import NewsPublish from "./components/NewsPublish";import usePublish from "./components/usePublish"; // 引入自定义hooksexport default function Published() {const { dataSource } = usePublish(2); // 使用自定义hooksreturn (<div><NewsPublishdataSource={dataSource}></NewsPublish></div>);
}

自定义hooks实质

  • 自定义 Hooks 是一个函数,约定函数名称必须以 use 开头,React 就是通过函数名称是否以 use 开头来判断是不是 Hooks
  • Hooks 只能在函数组件中或其他自定义 Hooks 中使用,否则,会报错!
  • 自定义 Hooks 用来提取组件的状态逻辑,根据不同功能可以有不同的参数和返回值(就像使用普通函数一样)

总结

这个案例简单说明了如何使用react自定义hooks

在自定义hooks时,我们需要考虑几个问题:

  • 什么时候使用自定义hooks?
  • 使用自定hooks时应该传入什么参数,又返回出什么值?
  • 使用自定义hooks,我的代码逻辑有没有变简洁?

什么时候使用自定义hooks?

  • 发现某处业务逻辑重复使用时,可将业务逻辑抽离开
  • 组件比较复杂时,可通过自定义hooks拆分组件逻辑,简化代码

使用自定hooks时应该传入什么参数,又返回出什么值?

传参和返回值是比较灵活的,需要注意的是,不仅能传常规的数据类型,还能传递函数对象

为什么时候自定义hooks,我的代码好像没有变简洁?

要理解UI组件和容器组件这两个概念。

恰当的抽离业务逻辑部分,保留组件的UI部分。

组件复杂时拆分可能也有一定的难度,过度设计会导致组件更难维护,因此要把控好度 。

参考文档

  • https://blog.csdn.net/DDAD9527/article/details/121341862
http://www.lryc.cn/news/62789.html

相关文章:

  • 如何优雅的写个try catch的方式!
  • 海尔智家:智慧场景掌握「主动」权,用户体验才有话语权
  • 基于铜锁,在前端对登录密码进行加密,实现隐私数据保密性
  • LVS的小总结
  • Spring依赖注入(DI配置)
  • 绘声绘影2023简体中文版新功能介绍
  • 一个好的前端开发人员必须掌握的前端代码整洁与开发技巧
  • 【别再困扰于LeetCode接雨水问题了 | 从暴力法=>动态规划=>单调栈】
  • 酒厂酒业IP网络广播系统建设方案-基于局域网的新一代交互智慧酒厂酒业IP广播设计指南
  • OpenHarmony JS Demo开发讲解
  • CentOS系统安装Intel E810 25G网卡驱动
  • Java经典的String面试题
  • c# 结构体与类区别
  • 使用 patch 命令打补丁
  • C++——类和对象[上]
  • MySQL日志
  • TinyURL 的加密与解密、猜数字游戏、 Fizz Buzz、相对名次----2023/4/28
  • Spring boot结合SkyWalking-Trace工具类实现日志打印请求链路traceid
  • 精通ES=ElasticSearch
  • RabbitMQ-扇形交换机(Fanout )
  • Python 学习曲线 从 Python 新手到 Pro
  • 薪资18K需要什么水平?来看看98年测试工程师的面试全过程…
  • 基于趋动云的 Stable Diffusion Webui 环境搭建
  • 备忘录设计模式解读
  • 股票期货模拟交易有用吗?股票期货模拟交易心得
  • 2023年五月份图形化三级打卡试题
  • 【华为OD机试真题】字母组合(javapython)100%通过率 详细代码注释
  • 精彩!openEuler 社区年度顶级会议发生了啥?
  • Confidential Containers发布0.5.0版本,龙蜥将基于八大特性构建开箱即用的机密容器解决方案
  • 独立储能的现货电能量与调频辅助服务市场出清协调机制(Matlab代码实现)