在 React 中使用自定义 Hooks 封装 Service 逻辑

在 React 项目中,将业务逻辑与组件逻辑分离,能使代码更加模块化、可维护且易于复用。自定义 Hooks 是实现这一目标的有效方式。本文将详细介绍如何使用自定义 Hooks 封装 service 逻辑,并通过具体实例展示其实际应用。

自定义 Hooks 封装 Service 的好处

  1. 状态管理和副作用处理:自定义 Hooks 可以处理组件的状态和副作用逻辑,使得组件代码更加简洁。
  2. 复用性:将常用的业务逻辑封装在自定义 Hooks 中,可以在多个组件中复用这些逻辑。
  3. 解耦逻辑:通过自定义 Hooks,将数据获取、同步等业务逻辑从 UI 逻辑中解耦出来,使得代码结构更加清晰。

具体实现步骤

Step 1: 封装 API 调用逻辑

将 API 调用逻辑封装在一个独立的模块中,集中管理与服务器交互的逻辑。

// apiService.js
const BASE_URL = 'https://api.example.com';

export async function fetchData() {
  const response = await fetch(`${BASE_URL}/data`);
  if (!response.ok) {
    throw new Error('Network response was not ok');
  }
  return response.json();
}
Step 2: 封装 SQLite 操作逻辑

将 SQLite 的插入和查询逻辑封装在一个模块中,集中管理与数据库交互的逻辑。

// sqliteService.js
import * as SQLite from 'expo-sqlite';

const db = SQLite.openDatabase('app.db');

export function insertData(data) {
  return new Promise((resolve, reject) => {
    db.transaction(tx => {
      tx.executeSql(
        'INSERT INTO data (id, value) VALUES (?, ?)',
        [data.id, data.value],
        (_, result) => resolve(result),
        (_, error) => reject(error)
      );
    });
  });
}

export function selectData() {
  return new Promise((resolve, reject) => {
    db.transaction(tx => {
      tx.executeSql(
        'SELECT * FROM data',
        [],
        (_, result) => resolve(result.rows._array),
        (_, error) => reject(error)
      );
    });
  });
}
Step 3: 创建同步逻辑的 Service

创建一个 service,将服务器的数据同步到 SQLite 中。

// syncService.js
import { fetchData } from './apiService';
import { insertData } from './sqliteService';

export async function syncData() {
  try {
    const data = await fetchData();
    await Promise.all(data.map(item => insertData(item)));
    console.log('Data synced successfully');
  } catch (error) {
    console.error('Failed to sync data:', error);
  }
}
Step 4: 创建自定义 Hook 封装业务逻辑

为了在组件中使用同步逻辑,我们创建一个自定义 Hook,支持定时任务和手动触发同步逻辑。

// useSync.js
import { useState, useEffect, useCallback } from 'react';
import { syncData } from './syncService';

function useSync(interval) {
  const [syncing, setSyncing] = useState(false);
  const [error, setError] = useState(null);

  const startSync = useCallback(async () => {
    setSyncing(true);
    setError(null);
    try {
      await syncData();
    } catch (err) {
      setError(err);
    } finally {
      setSyncing(false);
    }
  }, []);

  useEffect(() => {
    // Initial sync when the component mounts
    startSync();

    if (interval) {
      // Set up the interval for periodic sync
      const intervalId = setInterval(startSync, interval);
      // Clean up the interval on unmount
      return () => clearInterval(intervalId);
    }
  }, [startSync, interval]);

  return { syncing, error, startSync };
}

export default useSync;
Step 5: 在组件中使用自定义 Hook

在组件中使用这个自定义 Hook,可以在组件挂载时和定时任务触发同步逻辑,同时也可以手动触发同步逻辑。

// SyncComponent.js
import React from 'react';
import useSync from './useSync';

function SyncComponent() {
  const { syncing, error, startSync } = useSync(60000); // 60秒间隔

  return (
    <div>
      {syncing && <div>Syncing data...</div>}
      {error && <div>Error syncing data: {error.message}</div>}
      <button onClick={startSync}>Sync Now</button>
      {/* 渲染你的列表 */}
    </div>
  );
}

export default SyncComponent;

总结

通过以上步骤,我们将复杂的业务逻辑封装在 service 中,并通过自定义 Hooks 将这些业务逻辑引入到组件中。这种方式不仅提高了代码的可维护性,还使得业务逻辑更加清晰,组件更加专注于 UI 渲染。

使用自定义 Hooks 封装 service,可以使状态管理和副作用处理更加简洁和集中,同时提高代码的复用性和模块化程度。这种设计模式灵活且可扩展,可以根据实际需求调整同步的触发条件。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VMware Workstation桥接模式无法上网

问题背景 我之前创建过一个虚拟机&#xff0c;当时虚拟机的网络模式使用的是桥接模式&#xff0c;配置好了固定ip地址&#xff0c;是可以正常上网的&#xff0c;中间没有做任何网络上面的配置。但是今天再打开这台虚拟机时&#xff0c;发现竟然不能上网了。 物理主机的ip信息配…

详解COB封装的定义

COB封装全称是Chip on Board&#xff08;板上芯片封装&#xff09;&#xff0c;是一种非常先进的电子封装工艺&#xff0c;其会涉及到将发光芯片直接封装于印刷电路板&#xff08;PCB&#xff09;或者其他类型的互连电气基板上&#xff0c;通过细小的金属线进行键合&#xff0c…

LangChain 入门上篇:模型 I/O 封装

LangChain 是面向大模型的开发框架&#xff0c;是 AGI 时代软件工程的探索和原型。学习 LangChain 需要关注接口的变更。 LangChain 的核心组件 1.模型 I/O 封装 LLMS 大语言模型Chat Models 一套基于 LLMS&#xff0c;但按对话结构重新封装PromptTemplate 提示词模板Output…

七、函数练习

目录 1. 写一个函数可以判断一个数是不是素数。&#xff08;素数只能被1或其本身整除的数&#xff09; 2. 一个函数判断一年是不是闰年。 3.写一个函数&#xff0c;实现一个整形有序数组的二分查找。 4. 写一个函数&#xff0c;每调用一次这个函数&#xff0c;使得num每次增…

Appium+python自动化(三十九)-Appium自动化测试框架综合实践 - 代码实现(超详解)

1.简介 今天我们紧接着上一篇继续分享Appium自动化测试框架综合实践 - 代码实现。由于时间的关系&#xff0c;宏哥这里用代码给小伙伴演示两个模块&#xff1a;注册和登录。 2.业务模块封装 因为现在各种APP的层出不群&#xff0c;各式各样的。但是其大多数都有注册、登录。为…

【话题】IT专业入门,高考假期预习指南

IT专业入门&#xff0c;高考假期预习指南 亲爱的高考学子们&#xff0c; 七月的阳光&#xff0c;如同你们的梦想&#xff0c;炽热而明亮。当你们手中的笔落下最后一道题的答案&#xff0c;那不仅仅是对过去十二年寒窗苦读的告别&#xff0c;更是对未知世界探索的启程号角。你们…

surfer做等值线图笔记

surfer等值线图及其白化 **grd文件的制作****白化的边界文件的制作****白化****绘图****逆转坐标轴** grd文件的制作 单击格网&#xff0c;选择x,y,z的数据&#xff0c;选择克里金插值方法&#xff0c;让后确定&#xff0c;保存grd文件 白化的边界文件的制作 surfer新建表&am…

拒绝胶感,清纯甜美邻家女孩!逼真!逼真!SD1.5 更适合初恋般的国产真人大模型—— CNrealisticMIXV40

看惯了AI艺术大片&#xff0c;想寻找适合生成邻家女孩青涩照片的模型。 今天应邀&#xff0c;针对邻家女孩青涩风格进行下尝试。此前推荐过一款支持各种真实&#xff0c;摄影&#xff0c;写实风格模型的合体模型——**赛博Dream | CNrealistic_MIX_V40无损修剪版。**这款模型为…

notepad++ 中文乱码 出现小方格

从word文档直接拷贝过来的文字&#xff0c;到notepad 中文乱码 出现小方格 &#xff1a; 方法&#xff1a;设置-语言格式设置&#xff0c;字体样式更改为宋体&#xff0c;勾选“使用全局字体”&#xff0c;点保存并关闭&#xff0c;则ok

【Python机器学习】算法链与管道——用预处理进行参数选择的注意项

对于许多机器学习算法&#xff0c;提供的特定数据表示非常重要。比如&#xff0c;首先对数据进行缩放&#xff0c;然后手动合并特征&#xff0c;再利用无监督机器学习来学习特征。因此&#xff0c;大多数机器学习应用不仅需要应用多个算法&#xff0c;而且还需要将许多不同的处…

使用 llamaIndex 快速实现智能体

AI 智能体就是可以根据当前环境进行推理&#xff0c;并根据处理结果进行下一步的操作。简单来说 AI 智能体可以与外界环境进行交互&#xff0c;并根据结果执行更复杂的操作。本文将通过llamaIndex 实现一个简单的 Agent 实时获取数据&#xff0c;由于大模型是通过静态数据进行训…

【C++】 解决 C++ 语言报错:未定义行为(Undefined Behavior)

文章目录 引言 未定义行为&#xff08;Undefined Behavior, UB&#xff09;是 C 编程中非常危险且难以调试的错误之一。未定义行为发生时&#xff0c;程序可能表现出不可预测的行为&#xff0c;导致程序崩溃、安全漏洞甚至硬件损坏。本文将深入探讨未定义行为的成因、检测方法…

ERROR TypeError: AutoImport is not a function TypeError: AutoImport is not a

出现这种错误是AutoImport is not a function&#xff08;插件版本问题&#xff0c;回退插件版本&#xff09;-vue项目element plus按需引入配置错误 查看unplugin-auto 插件版本 npm list unplugin-auto-import 回退插件版本 npm install unplugin-auto-import0.16.1 ERRO…

字符串相似度算法完全指南:编辑、令牌与序列三类算法的全面解析与深入分析

在自然语言处理领域&#xff0c;人们经常需要比较字符串&#xff0c;这些字符串可能是单词、句子、段落甚至是整个文档。如何快速判断两个单词或句子是否相似&#xff0c;或者相似度是好还是差。这类似于我们使用手机打错一个词&#xff0c;但手机会建议正确的词来修正它&#…

无法定位程序输入点…于动态链接库…的解决方法

如下图所示: 出现上述问题,主要是因为使用的动态库问题,具体就是电脑里有几个不同版本的osgEarth的动态库。如下图所示,本人电脑里编译了好几个版本的osgEarth库,并且把其中的两个加入到了环境变量中,导致出现上述错误: 程序使用的是绿框所示的D:\OSGCore\OSGEarth\bin …

哈喽GPT-4o,对GPT-4o 论文速写的思考与探索

作为一款强大的语言模型&#xff0c;ChatGPT 在论文写作上具备显著优势。它能够辅助学者或研究人员自动创建论文框架、摘要、文献综述及论文段落&#xff08;如引言、方法、结果、结论等&#xff09;。此外&#xff0c;ChatGPT 还能优化论文结构、润色、降低内容重复率&#xf…

redis-cluster(集群模式搭建)

redis中间件版本: redis-5.0.5环境介绍 这里使用服务器数量3&#xff0c;分别为172.0.0.1&#xff0c;172.0.0.2&#xff0c;172.0.0.3&#xff0c;每台机器redis节点数量2个&#xff0c;共6个redis节点构成redis-cluster模式。编译安装包 在172.0.0.1的机器上进入安装目录 cd …

AI大模型从入门到精通:一站式学习教程

前言 在聊到AI的时候&#xff0c;我们都离不开“大模型”这三个字。 AI大模型已经完全融入了各个领域&#xff0c;也融入了我们的生活&#xff0c;它好像无所不在、无所不能。 百度李彦宏说 &#xff1a;大模型改变世界&#xff1b; 360周鸿祎说&#xff1a;大模型是新时代“…

Frida案例-hook app中指定类的方法

界面如下 代码如下 点击‘点赞’按钮时&#xff0c;会触发getThumbsCount&#xff08;&#xff09;函数 当前期望能通过frida获取getThumbsCount&#xff08;&#xff09;的值 首先查看手机上正在运行的进程 frida-ps -U 进程不一定会以包名显示&#xff0c;还可能会以app的名…

基于主流SpringBoot进行JavaWeb开发的学习路线

目录 一、学习路线 &#xff08;1&#xff09;第一部分&#xff08;Web前端开发的技术栈&#xff09; &#xff08;2&#xff09;第二部分&#xff08;Web后端开发&#xff09; 二、学习之后必备的技能 三、学习Web开发的基础与未来的收获 学完这一类知识目标&#xff1a;…