0

0

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

聖光之護

聖光之護

发布时间:2025-10-16 12:58:16

|

604人浏览过

|

来源于php中文网

原创

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

本文旨在解决React Native应用中使用日期选择器时,`getOpenHours`函数被频繁调用以及`openHours`数组被重复更新的问题。通过引入`useEffect`钩子,监听日期变化,并优化数据更新逻辑,有效避免不必要的网络请求和状态更新,提升应用性能和用户体验。

在React Native应用开发中,日期选择器是一个常用的组件。然而,不当的使用方式可能导致性能问题,例如重复的网络请求和状态更新。以下将介绍如何使用useEffect钩子来优化日期选择器的使用,避免这些问题。

问题分析

原始代码中,handleDateChange函数在日期选择器每次值改变时都会被调用,导致getOpeningHours函数被频繁执行,从而发起多次网络请求。此外,由于状态更新的时机不当,openHours数组可能会被重复设置相同的值。

解决方案

核心思想是利用useEffect钩子来监听日期的变化,并在日期真正发生改变时才执行getOpeningHours函数。

  1. 状态管理优化

首先,引入一个状态变量date来存储选中的日期,并使用setDate函数来更新该状态。

   const [date, setDate] = useState();
  1. 使用useEffect监听日期变化

使用useEffect钩子监听date状态的变化。只有当date状态发生改变时,useEffect内部的函数才会执行。

Decktopus AI
Decktopus AI

AI在线生成高质量演示文稿

下载
   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();

           if(openHours && openHours.length !== 0){
               setOpenHours(openHours);
               setSelectedStartHour(null);
               setSelectedEndHour(null);
               setStartHour(null);
               setEndHour(null);
           }
       }

   }, [date])

这段代码的逻辑如下:

  • 当date状态发生改变时,useEffect被触发。
  • 首先进行非空判断if (date),确保只有在date有值时才执行后续操作。
  • 将日期格式化,并创建Date对象。
  • 定义一个内部的async函数getOpeningHours,用于发起网络请求获取开放时间。
  • 调用getOpeningHours函数。
  • 在获取到openHours后,更新相关状态变量,例如openHours,selectedStartHour,selectedEndHour,startHour和endHour。
  1. 更新日期选择器回调

在日期选择器的onSelectedChange回调中,只需要更新date状态即可。

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

现在,日期选择器每次值改变时,只会更新date状态,而useEffect会负责监听date的变化,并在日期真正发生改变时才执行getOpeningHours函数。

完整代码示例

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();

  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();

          if(openHours && openHours.length !== 0){
              setOpenHours(openHours);
              setSelectedStartHour(null);
              setSelectedEndHour(null);
              setStartHour(null);
              setEndHour(null);
          }
      }

  }, [date])

return (
         
            Select Date
            Selected Date is {selectedDate}
             setDate(value)}
              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...
          )}
        
);

注意事项

  • 确保正确引入useEffect钩子。
  • useEffect的依赖数组中必须包含所有需要在依赖项发生改变时触发的变量,这里是date。
  • 在useEffect内部,可以使用async函数来处理异步操作。

总结

通过使用useEffect钩子,可以有效地避免日期选择器导致的重复请求和更新问题,从而提升React Native应用的性能和用户体验。这种方法不仅适用于日期选择器,还可以应用于其他需要监听状态变化并执行副作用的场景。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

765

2023.08.22

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

10

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

28

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

21

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

20

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP特殊符号教程合集
PHP特殊符号教程合集

本专题整合了PHP特殊符号相关处理方法,阅读专题下面的文章了解更多详细内容。

11

2026.01.22

PHP探针相关教程合集
PHP探针相关教程合集

本专题整合了PHP探针相关教程,阅读专题下面的文章了解更多详细内容。

8

2026.01.22

菜鸟裹裹入口以及教程汇总
菜鸟裹裹入口以及教程汇总

本专题整合了菜鸟裹裹入口地址及教程分享,阅读专题下面的文章了解更多详细内容。

52

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 4万人学习

国外Web开发全栈课程全集
国外Web开发全栈课程全集

共12课时 | 1.0万人学习

React核心原理新老生命周期精讲
React核心原理新老生命周期精讲

共12课时 | 1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号