0

0

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

霞舞

霞舞

发布时间:2025-10-14 12:05:22

|

136人浏览过

|

来源于php中文网

原创

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

代码解释:

京点点
京点点

京东AIGC内容生成平台

下载
  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 (
     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 应用的性能和用户体验。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

231

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

436

2024.03.01

if什么意思
if什么意思

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

745

2023.08.22

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

3019

2024.08.14

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

43

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

84

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

24

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

35

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

16

2026.01.15

热门下载

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

精品课程

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

共58课时 | 3.7万人学习

国外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号