react自定义hook

102 阅读2分钟

自定义 Hooks 和普通函数有什么区别?

  1. 自定义 hooks可以看做是 React Hooks 的之外的自由延伸。本质上还是 JavaScript 函数。主要用途是实现逻辑重用。
  2. 与普通函数的区别
  • 名字应该始终以 use 开头。
  • 在自定义 Hook 中调用其他 Hook。

创建自定义hook

  1. 需求:
  • 日期选择器,需要设置可选日期范围,超出1天~10天的范围不可选择。
  • 选择某个日期之后,需要计算跟当天日期相差的天数,并回显到页面上。
  1. 可复用逻辑
  • 日期选择器的可选限制
  • 时间发生变化的回调函数
  • 相差天数变量。
  1. 代码
    /**
     * @description 时间选择器的限制和相差天数
     */
    import React, { useState, useCallback, useMemo } from 'react';
    import moment from 'moment';

    const useDateRange = (textButton) => {
      // 相差天数
      let [dayDiff, setDayDiff] = useState(0);
      /**
       * 可选时间范围 1~10
       */
      const disabledDate = useCallback(current => {
        const startTimer = moment()
          .add(+1, 'days')
          .startOf('day');
        const endTimer = moment()
          .add(+10, 'days')
          .endOf('day');
        return current && (current < startTimer || current > endTimer);
      }, []);
      // 测试
      const onOpenChange = useCallback(open => {
        console.log(open,'open3')
        textButton()
       },[])
      /**
       * 时间选择器选择操作 获取相差天数
       */
      const dateChange = useCallback(dates => {
        let nowDate = new Date();
        let startData = moment(nowDate).format('YYYY-MM-DD');
        let endData = moment(dates).format('YYYY-MM-DD');
        dayDiff = moment(endData).diff(moment(startData), 'day');
        setDayDiff(dayDiff);
      }, []);

      return { dayDiff, disabledDate, dateChange, onOpenChange };
    };
    export default useDateRange;

使用 useDateRange

    /**
     * @description 日期选择页
     */
    import React from 'react';
    import { DatePicker } from 'antd';
    import useDateRange from './hooks/useDateRange';

    const ChangeDatePage = () => {
      // 测试方法
      const textButton = () => {
        console.log('first')
      }
      // 使用自定义 Hook
      const { disabledDate, dateChange, dayDiff } = useDateRange(textButton);
    
      return (
        <div>
          <DatePicker disabledDate={disabledDate} onChange={dateChange} onOpenChange={onOpenChange}/>
          <div className="mt20">选择的日期与今天相差: {dayDiff} 天</div>
        </div>
      );
    };

    export default ChangeDatePage;

总结

在转载的文章中,自己尝试了添加组件onOpenChange方法,和函数组件重复利用很类似,但功能上使用了react本身的hook,对于逻辑拆分功能更强

自己往自定义hook传了一个textButton方法,需要声明到使用前,有类似触发按钮后弹窗的需求

转载:juejin.cn/post/717014…