新闻中心

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

2025-10-16
浏览次数:
返回列表

避免重复请求和更新: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内部的函数才会执行。

察言观数AskTable 察言观数AskTable

企业级AI数据表格智能体平台

察言观数AskTable 78 查看详情 察言观数AskTable
   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 (
       <DatePicker
           onSelectedChange={(value) => 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 (
         <View>
            <Text style={styles.subtitle}>Select Date</Text>
            <Text>Selected Date is {selectedDate}</Text>
            <DatePicker
            {/* This was imported from "react-native-modern-datepicker" */}
              onSelectedChange={(value) => setDate(value)}
              options={{
                backgroundColor: "#090C08",
                textHeaderColor: "#FFA25B",
                textDefaultColor: "#F6E7C1",
                selectedTextColor: "#fff",
                mainColor: "#F4722B",
                textSecondaryColor: "#D6C7A1",
                borderColor: "rgba(122, 146, 165, 0.1)",
              }}
              current="2025-06-01"
              mode="calendar"
              minimumDate={startDate}
              maximumDate={endDate}
              minuteInterval={30}
              style={{ borderRadius: 10 }}
            />
          </View>

          {/* List of selectable hours */}
          {openHours && openHours.length > 0 ? (
            <>
              <Text style={styles.subtitle}>Select Hours</Text>
              <View style={styles.hoursContainer}>
                {openHours.map((hour) => (
                  <TouchableOpacity
                    key={hour}
                    style={[
                      styles.hourCard,
                      hour === selectedStartHour || hour === selectedEndHour
                        ? styles.selectedHourCard
                        : null,
                    ]}
                    onPress={() => handleHourPress(hour)}
                  >
                    <Text>{hour}:00</Text>
                  </TouchableOpacity>
                ))}
              </View>
            </>
          ) : (
            <Text>Loading open hours...</Text>
          )}
        </View>
);

注意事项

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

总结

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

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


# 如何实现  # 动态网站建设例子  # 惠农宁夏网站关键词推广  # HR网站建设工程  # 重庆优化网站哪家好  # 推广五金商品网站排名  # 快速短视频营销推广  # 梧州网站优化方案分析  # 深州seo代理  # 青海网站建设规划图纸  # 公司的网站优化方法  # 加载  # 有何不同  # 是一个  # react  # 服务端  # 回调  # 自定义  # 并在  # 时才  # 选择器  # lsp  # 应用开发  # ios  # ai  # axios  # app 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 小红书网页版入口链接分享 小红书官网直接进  Django表单提交验证失败后保持字段值不刷新  Win11怎么关闭快速启动_Win11彻底关机设置教程  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口  怎样在Excel中做仪表盘_Excel仪表盘设计与关键指标展示方法  Lar*el的路由模型绑定怎么用_Lar*el Route Model Binding简化控制器逻辑  Golang如何使用new_Go new分配内存机制讲解  C++指针和引用有什么区别_C++内存管理核心概念深度解析  c++如何使用std::memory_order控制原子操作顺序_c++ C++11内存模型详解  Yandex搜索引擎官方地址 俄罗斯网络世界的主要入口  b站如何看历史记录_b站观看历史找回方法  Golang切片为何属于引用类型_Golang slice底层结构与引用语义说明  C++20的source_location是什么_C++在编译期获取源码位置信息用于日志和断言  使用Python高效删除Word宏并转换DOCM为DOCX格式  精准捕获:如何在页面中监听除特定元素外的所有点击事件  HTML转PPT成品工具有哪些?HTML网页转PPT成品工具大全  win11 arm版怎么安装 M1/M2 Mac虚拟机安装ARM win11的方法  Promise错误处理:在catch后终止链式then执行的策略  C++如何实现一个装饰器模式_C++设计模式之动态地给对象添加额外职责  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  如何使用纯J*aScript判断Input元素是否在特定类容器内  Python异步编程实践:使用Binance API构建实时交易数据流  蛙漫安全无毒 官方认证的绿色入口  c++如何实现一个简单的软件渲染器_c++从零开始的3D图形学  J*aScript:在map操作中高效处理空数组  优化Log4j2控制台输出性能:解决异步日志瓶颈  c++ dfs和bfs代码 c++深度广度优先搜索算法  Golang如何通过reflect操作map_Golang reflect map操作与遍历技巧  Golang如何安装Swagger工具_GoSwagger文档生成环境  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  QQ邮箱官方网页版登录 QQ邮箱个人邮箱快速访问  京东京造J1和网易云音乐氧气真无线有什么不同_国产电商蓝牙耳机音质对比  必由学官网快捷入口 必由学网页版在线学习平台  高德地图总提示网络异常怎么办 高德地图离线导航设置与网络排查方法  Win10双系统截图高效法 截屏快捷键速记【技巧】  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  win11怎么查看应用耗电情况 Win11电池设置查看应用能耗排行榜【优化】  UC浏览器网页版登录入口官网 电脑版网址入口  Win10文件资源管理器“此电脑”分组怎么关 Win10恢复经典视图【技巧】  快速CSGO开箱网站指南 CSGO开箱平台推荐  AO3中文官网链接_AO3网页版稳定镜像站  CSS实现侧边栏导航项全宽圆角悬停背景效果  composer的"require-dev"部分是用来做什么的?  Linux如何排查内存不足OOME问题_LinuxOOM分析教程  AO3官方镜像站点汇总 AO3同人作品网页版直达链接  MinIO大规模对象列表性能瓶颈深度解析与外部元数据管理策略  Excel中VLOOKUP的第四个参数是干什么用的_Excel VLOOKUP第四参数作用解析  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  AO3网页版最新入口合集 Archive of Our Own在线访问指南 

搜索