新闻中心

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

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

优化 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]);

代码解释:

秀脸FacePlay 秀脸FacePlay

一款集成AI换脸、照片跳舞等多种AI特效玩法的App

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

更新日期选择器组件

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

return (
    <DatePicker
        onSelectedChange={(value) => 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 (
    <View>
      <Text style={styles.subtitle}>Select Date</Text>
      <Text>Selected Date is {date}</Text> {/*  显示 date 状态 */}
      <DatePicker
        onSelectedChange={(value) => setDate(value)} // 更新 date 状态
        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 }}
      />

      {/* 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>
  );
};

注意事项

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

总结

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

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


# npm  # react  # 回调  # 选择器  # lsp  # 组件渲染  # ios  # ai  # axios  # 回调函数  # app  # 常州网站建设靠谱吗  # 创新互联网营销推广服务  # 安阳哪里网站推广好做点  # 松原网站建设有哪些  # 邮箱营销网站推广  # SEO重庆拍照公园晚上  # 如何将网站推广上google  # 纯棉童装网站推广  # 精准价关键词排名象客  # ip模拟seo  # 有何不同  # 如何实现  # 正确地  # 服务端  # 时才  # 只在  # 自定义  # 才会 


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


相关推荐: Excel Power Pivot如何处理XML数据源 构建高级数据模型  Bilibili动漫最新防封地址发布-Bilibili动漫2025年最稳正版入口推荐  c++中的std::launder有什么实际用途_c++对象生命周期与指针优化  汽水音乐在线版入口_汽水音乐网页播放手册  CSS子选择器:如何区分并样式化嵌套列表的子层级  火锅吃太多会怎样 火锅吃太多会上火吗  J*aScript中针对特定容器内图片动画的实现教程  2026春节假期时间安排 2026春节假日查询  Go语言中Map值调用指针接收器方法的限制与应对  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  高德地图怎么看全景照片_高德地图全景照片浏览教程  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  Sublime Text怎么设置垂直标尺_Sublime配置Rulers规范代码长度  C++如何实现单例模式_C++设计模式之线程安全的单例写法  Win10双系统截图高效法 截屏快捷键速记【技巧】  Go Martini框架:动态服务解码后的图片内容  一加手机电池耗电快怎么办_一加手机电池耗电快的解决方法  Mac怎么锁定备忘录_Mac备忘录加密设置教程  SteamMachine定价或为699美元 大家想入手吗?  极兔快递快件信息查询系统 极兔快递官网运单号追踪  fishbowl官网免费版 fishbowl养鱼网站入口  58动漫网在线官方网 58动漫网正版动漫入口网址  微信网页版官方快速登录入口 微信网页版网页版账号直达  如何仅使用CSS更改登录界面背景图像图标的颜色  深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量  TikTok评论显示延迟如何处理 TikTok评论刷新优化方法  Golang如何优化CPU绑定任务分配策略_Golang CPU任务分配优化实践  jQuery Mask 插件中实现电话号码固定前导零的教程  在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析  lar*el怎么安全地存储和获取配置文件中的敏感信息_lar*el敏感信息安全存储方法  LINUX下如何进行磁盘分区_fdisk与parted工具在LINUX中的使用对比  PDF怎么合并PDF并保持格式_PDF合并文件保持排版教程  解决移动端滚动问题的overflow属性应用指南  包子漫画官方网站阅读入口-包子漫画在线漫画官网直达链接  如何在Promise链中优雅地中断后续then执行  谷歌浏览器怎么给标签页静音_Chrome标签静音快捷操作  HTML元素状态管理:根据DIV内容动态启用/禁用按钮  解决 MongoDB 聚合查询中对象数组 _id 匹配问题  mysql如何设置表访问权限_mysql表访问权限配置  必由学官方登录入口 必由学教师学生账号快速访问  UC浏览器官网入口2025最新 UC浏览器网页版正式地址  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  J*aScript生成器_j*ascript异步迭代  从J*aScript对象中精确提取指定属性的教程  Word2013如何插入视频和音频媒体_Word2013媒体插入的多媒体支持  Golang如何实现简单的Web表单_Golang表单提交与验证处理方法  C++如何连接MySQL数据库_C++使用Connector/C++操作MySQL数据库教程  Win10系统怎么查看已安装更新_Win10卸载有问题的更新补丁  J*aScript动态修改指定div内所有a标签样式指南  ArrayList与LinkedList操作复杂度详解:遍历与修改 

搜索