优化 React Native 日期选择器:避免重复请求和数据更新

优化 react native 日期选择器:避免重复请求和数据更新

本文旨在解决 React Native 应用中使用日期选择器时,`getOpenHours` 函数被快速连续调用多次以及 `openHours` 数组被重复更新的问题。我们将通过使用 `useEffect` 钩子和正确地更新状态来优化代码,确保函数只在日期真正改变时执行,并避免不必要的数据更新。

在 React Native 应用中,使用日期选择器时,可能会遇到 getOpenHours 函数在日期选择后被多次调用的问题,导致不必要的网络请求和性能损耗。同时,openHours 数组也可能被重复更新,影响用户体验。为了解决这些问题,我们需要对代码进行优化,确保函数只在日期真正改变时执行,并避免不必要的数据更新。

使用 useEffect 钩子监听日期变化

useEffect 钩子允许我们在组件渲染后执行副作用操作,例如数据获取、订阅或手动更改 DOM。 我们可以利用它来监听 date 状态的变化,并在日期改变时才调用 getOpeningHours 函数。

const [date, setDate] = useState();const [openHours, setOpenHours] = useState([]);useEffect(() => {    if (date){        const formattedDate = date.replace(///g, "-");        const selectedDate = new Date(formattedDate);        const getOpeningHours = async () => {            try {              const response = await axios.post(                `https://spacezone-backend.cyclic.app/api/booking/getOpenHours/${placeId}`,                { Date: date }              );               setOpenHours(response.data.openHoursArray);            } catch (error) {              console.log(error);            }          };        getOpeningHours();        setSelectedStartHour(null);        setSelectedEndHour(null);        setStartHour(null);        setEndHour(null);    }}, [date, placeId]);

代码解释:

useState(null): 初始化 date 状态,用于存储选中的日期。useEffect(() => { … }, [date, placeId]): useEffect 钩子监听 date 和 placeId 的变化。只有当 date 或 placeId 发生变化时,才会执行回调函数if (date): 确保只有当 date 有值时才执行后续操作。getOpeningHours 函数: 定义一个异步函数 getOpeningHours,用于从服务器获取开放时间数据。setOpenHours(response.data.openHoursArray): 使用从服务器获取的开放时间数据更新 openHours 状态。setSelectedStartHour(null); …: 重置其他相关状态。[date, placeId]: 依赖项数组,指定 useEffect 钩子依赖的状态。只有当这些状态发生变化时,才会重新执行回调函数。 placeId 也应该作为依赖项,因为这个值是从 route.params 中获取的,如果这个值变化了,也应该重新获取数据。

更新日期选择器组件

在日期选择器组件中,只需要更新 date 状态即可。

return (     setDate(value)}        // other props    />)

代码解释:

onSelectedChange={(value) => setDate(value)}: 当日期选择器中的日期发生变化时,调用 setDate 函数更新 date 状态。

完整示例代码

const RoomDetailsPage = ({ route }) => {  const [selectedDate, setSelectedDate] = useState(null);  const [selectedStartHour, setSelectedStartHour] = useState(null);  const [selectedEndHour, setSelectedEndHour] = useState(null);  const [startHour, setStartHour] = useState(null);  const [endHour, setEndHour] = useState(null);  const [isDatePickerVisible, setDatePickerVisible] = useState(false);  const { roomId } = route.params;  const { placeId } = route.params;  const { roomDetails } = route.params;  const startDate = roomDetails.days[0].date.split("T")[0];  const endDate =    roomDetails.days[roomDetails.days.length - 1].date.split("T")[0];  const [openHours, setOpenHours] = useState([]);  const [date, setDate] = useState(null); // 使用新的 date 状态  useEffect(() => {    if (date) {      const formattedDate = date.replace(///g, "-");      const selectedDate = new Date(formattedDate);      const getOpeningHours = async () => {        try {          const response = await axios.post(            `https://spacezone-backend.cyclic.app/api/booking/getOpenHours/${placeId}`,            { Date: date }          );          setOpenHours(response.data.openHoursArray);        } catch (error) {          console.log(error);        }      };      getOpeningHours();      setSelectedStartHour(null);      setSelectedEndHour(null);      setStartHour(null);      setEndHour(null);    }  }, [date, placeId]);  return (          Select Date      Selected Date is {date} {/*  显示 date 状态 */}       setDate(value)} // 更新 date 状态        options={{          backgroundColor: "#090C08",          textHeaderColor: "#FFA25B",          textDefaultColor: "#F6E7C1",          selectedTextColor: "#fff",          mainColor: "#F4722B",          textSecondaryColor: "#D6C7A1",          borderColor: "rgba(122, 146, 165, 0.1)",        }}        current="2023-06-01"        mode="calendar"        minimumDate={startDate}        maximumDate={endDate}        minuteInterval={30}        style={{ borderRadius: 10 }}      />      {/* List of selectable hours */}      {openHours && openHours.length > 0 ? (                  Select Hours                      {openHours.map((hour) => (               handleHourPress(hour)}              >                {hour}:00                          ))}                  Loading open hours...      )}      );};

注意事项

确保 placeId 在 useEffect 的依赖项数组中,以便在 placeId 发生变化时也能重新获取数据。在 getOpeningHours 函数中处理错误,避免程序崩溃。根据实际需求调整代码,例如添加 loading 状态,优化用户体验。axios 需要先安装 npm install axios 或者 yarn add axios

总结

通过使用 useEffect 钩子监听日期变化,并正确地更新状态,我们可以有效地避免 getOpenHours 函数被重复调用以及 openHours 数组被重复更新的问题。 这种方法可以提高 React Native 应用的性能和用户体验。

以上就是优化 React Native 日期选择器:避免重复请求和数据更新的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1529436.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月20日 21:07:38
下一篇 2025年12月20日 21:07:54

相关推荐

  • 将扁平对象数组转换为多层级嵌套对象

    本文详细介绍了如何利用JavaScript的`Array.prototype.reduce`方法,将一个包含父子关系信息的扁平对象数组高效地转换为一个多层级嵌套的对象结构。通过巧妙运用空值合并赋值运算符(`??=`),我们能以简洁的方式处理多层级嵌套,构建出符合预期树状结构的复杂对象。 在现代Jav…

    2025年12月20日
    000
  • React Hook Form 动态输入字段处理指南

    本文深入探讨了在%ignore_a_1% hook form中处理动态生成输入字段的有效策略。针对通过索引动态命名字段时数据访问的常见误区,我们首先介绍了如何使用方括号语法正确获取表单数据。随后,文章重点推荐并详细演示了react hook form提供的`usefieldarray`钩子,作为管理…

    2025年12月20日
    000
  • Django中实现Excel、DOCX和PDF文件浏览器内联预览的教程

    本教程详细介绍了如何在Django应用中实现Excel、DOCX和PDF文件的浏览器内联预览,而非强制下载。通过利用Python的io.BytesIO模块与Django的HttpResponse,并正确设置Content-Disposition头部为inline,开发者可以为用户提供流畅的文件预览体…

    2025年12月20日
    000
  • Bootstrap 5.3.0 折叠按钮图标不显示问题解析与修复

    在使用 bootstrap 5.3.0 的折叠(collapsible)组件时,`navbar-toggler-icon` 可能因缺少父级 `.navbar` 类而无法显示。本文深入解析了该问题的原因,即 `navbar-toggler-icon` 的背景图像依赖于 `.navbar` 类定义的 c…

    2025年12月20日
    000
  • jQuery动态列表移除按钮失效问题解析与解决方案

    本文深入探讨了jquery中动态生成元素事件绑定失效的常见问题,特别是移除按钮无法响应点击事件的场景。教程将详细阐述如何通过事件委托机制(`on()`方法)解决此问题,并提供完善的解决方案,包括正确的目标元素选择、处理边界条件(如最后一个元素的移除)以及增强用户体验的反馈机制(如提示信息)。旨在帮助…

    2025年12月20日
    000
  • Angular工作区中库SASS模块的命名空间引用:现状与挑战

    本文探讨了在Angular工作区中,从应用程序引用同一工作区内库项目的SASS文件时,是否能像TypeScript模块一样使用命名空间路径的问题。目前,SASS模块尚不支持这种命名空间引用方式,导致在尝试此类导入时会遇到编译错误,但Angular CLI社区已提出了相关功能请求。 理解Angular…

    2025年12月20日
    000
  • Angular Material Table 数据源更新后未刷新问题的解决方案

    本文旨在解决Angular Material Table在数据源更改后未能正确刷新的问题。我们将深入探讨可能的原因,并提供详细的解决方案,包括如何正确地更新数据源以及通知`MatTableDataSource`数据已更改,确保表格能够及时反映最新的数据状态。 当你在Angular Material …

    2025年12月20日
    000
  • 深入理解 JavaScript 数组:索引与命名属性的共存机制

    javascript数组作为特殊的对象,除了常规的数值索引元素外,还可以拥有自定义的命名属性。这种特性允许开发者在数组中存储额外的信息,例如为兼容性或提供更清晰的数据访问方式。当通过`console.log`等工具输出时,这种混合结构可能表现为同时包含索引值和键值对的列表,这并非数组的内部矛盾,而是…

    2025年12月20日
    000
  • React中复杂嵌套对象数组的状态更新策略:useReducer与数据结构优化

    本文探讨了在react应用中如何高效更新嵌套在对象中的对象数组状态。针对`usestate`在处理复杂状态时的局限性,我们推荐使用`usereducer` hook,并结合数据结构优化(将数组转换为以id为键的对象),以实现更清晰、更可维护且性能更优的状态管理。文章通过示例代码详细展示了`reduc…

    2025年12月20日
    000
  • Vite 与 React 应用中正确导入静态图片资产的实践指南

    本教程旨在解决vite与react项目中导入图片时常见的”uncaught syntaxerror: ambiguous indirect export”错误。我们将深入探讨该错误产生的原因,并提供一种可靠的解决方案:利用`new url(assetpath, import.…

    2025年12月20日
    000
  • JavaScript字符串模式匹配与函数转换:高效处理特定内容

    本文旨在探讨如何在JavaScript中高效地识别字符串中特定模式(如括号内内容),并将其替换为经过自定义函数处理后的结果。我们将介绍两种主要方法:一种结合正则表达式和`eval()`,另一种是更推荐的、基于回调函数的`String.prototype.replace()`方法,并详细分析它们的实现…

    2025年12月20日
    000
  • 纯JavaScript动态生成与初始化Bootstrap Toggle开关

    本教程详细指导如何使用纯javascript动态创建并初始化bootstrap toggle开关。通过创建`input`元素并设置必要属性,然后利用jquery的`bootstraptoggle()`方法将其转换为功能完善的开关组件,实现页面元素的动态交互。 引言 在现代Web应用开发中,动态生成U…

    2025年12月20日
    000
  • JavaScript 类中等待特定按键事件的实现方法

    本文将介绍如何在 JavaScript 类中实现等待特定按键事件触发后再继续执行的功能。我们将探讨使用 Promise 和事件监听器来实现这一目标,并提供两种不同的实现方式,包括基于 Promise 的异步方法和直接使用事件监听器的方法,以便在不同的场景下灵活应用。 使用 Promise 实现按键等…

    2025年12月20日
    000
  • VSCode中利用正则表达式批量定位并转换React项目中未翻译的文本

    本文旨在指导开发者如何在vscode中高效利用正则表达式,批量查找并转换react i18next项目中尚未封装翻译函数(如`t()`)的硬编码文本。通过提供具体的搜索和替换模式,文章详细解析了正则表达式的工作原理,并给出了实际应用示例及重要注意事项,帮助开发者快速完成国际化改造。 在进行React…

    2025年12月20日
    000
  • Node.js Web应用中动态HTML内容渲染的正确姿势

    本文旨在解决node.js web应用中动态生成的html内容(包括链接)无法在浏览器中显示的问题。核心在于理解node.js服务器如何通过定义路由并利用响应对象将模板函数生成的html字符串发送至客户端,从而确保所有预期的内容能够正确渲染。 在Node.js环境中构建Web应用时,我们经常会使用模…

    2025年12月20日
    000
  • 解决Express.js中EJS模板渲染失败的常见问题

    本文旨在解决Express.js应用中EJS模板文件无法正确渲染为HTML的问题。核心原因通常在于路由配置不当,例如请求了错误的URL路径或使用了不匹配的文件扩展名。教程将详细指导如何正确配置Express路由以渲染EJS视图,并强调了EJS视图引擎的正确设置与使用规范,确保您的EJS文件能够被服务…

    2025年12月20日
    000
  • 查找 Mongoose 集合中未被其他文档引用的文档

    本文旨在指导开发者如何使用 Mongoose 查询数据库,找出 `Post` 集合中所有未被其他文档的 `replies` 数组引用的文档,即查找所有非回复的原始帖子。文章将介绍一种通过修改 Schema 结构,添加一个布尔字段来标识帖子是否为回复的方法,从而简化查询过程。 在处理具有自引用关系的 …

    2025年12月20日
    000
  • 在VSCode中高效查找并转换React项目未翻译文本的教程

    本教程旨在指导开发者如何在vscode中利用正则表达式,快速定位并批量转换react项目中尚未国际化的文本。文章将详细解析针对特定html标签(如“)的正则表达式,并提供替换方案,帮助将硬编码字符串封装为i18next的`t()`函数调用。同时,教程也将探讨该方法的局限性,并提出更全面的国际化文本…

    2025年12月20日
    000
  • 优化React Native中的API请求与状态管理:避免重复调用与冗余更新

    本文旨在解决React Native应用中因日期选择器频繁触发导致的API重复请求和状态冗余更新问题。通过引入React的`useEffect` Hook,我们将展示如何有效地管理组件副作用,确保API请求仅在关键依赖项(如选定日期)发生变化时执行,并优化相关状态的更新逻辑,从而提升应用性能与用户体…

    2025年12月20日
    000
  • 如何利用IndexedDB进行大规模的客户端数据存储?

    IndexedDB是浏览器中用于高效管理大规模结构化数据的客户端存储方案,支持索引、事务和异步操作。通过数据库、对象仓库、索引、事务和游标等核心概念,可实现数据的高效写入、查询与遍历。创建数据库时在onupgradeneeded中定义对象仓库及索引,使用事务进行读写操作,结合IDBKeyRange和…

    2025年12月20日
    000

发表回复

登录后才能评论
关注微信