npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

nick-custom-calendar-taro

v1.0.14

Published

一款基于taro3的自定义日历组件,支持周,月的展示

Downloads

6

Readme

custom-calendar-taro

NPM version NPM downloads MIT Licence

一款基于 taro3 的自定义日历组件,支持周,月的展示,组件改编自 zkytech 大佬的 taro-calendar-customizable,但是由于大佬的组件只支持 ts 开发,索性就自己改编了一下, 若有些许帮助,在下不胜荣幸,如有瑕疵,还请不吝赐教!

特性

  • 支持周,月视图
  • 支持 js 与 ts
  • 可定制样式
  • 支持类taroui的marks圆点标记
  • 可指定一周的起点
  • 支持范围选择
  • 支持滑动,切换动画

安装

yarn add custom-calendar-taro
npm install custom-calendar-taro

使用

import Taro from "@tarojs/taro";
import Calendar from "custom-calendar-taro";

const Index = () => {
  return (
    <Calendar
      marks={[
        { value: "2021-06-11", color: "red", markSize: "9px" },
        { value: "2021-06-12", color: "pink", markSize: "9px" },
        { value: "2021-06-13", color: "gray", markSize: "9px" },
        { value: "2021-06-14", color: "yellow", markSize: "9px" },
        { value: "2021-06-15", color: "darkblue", markSize: "9px" },
        { value: "2021-06-16", color: "pink", markSize: "9px" },
        { value: "2021-06-23", color: "green", markSize: "9px" },
      ]}
      extraInfo={[
        { value: "2021-06-21", text: "生日", color: "red" },
        { value: "2021-06-22", text: "休假", color: "darkblue" },
        { value: "2021-06-23", text: "会议", color: "gray" },
      ]}
      selectedDateColor="#346fc2"
      onDayClick={(item) => console.log(item)}
      onDayLongPress={(item) => console.log(item)}
    />
  );
};

export default Index;

样式定制

默认样式如下

周视图

月视图

因为业务的复杂多变,通常会有自定义的样式控制

import Taro, { FunctionComponent } from "@tarojs/taro";
import Calendar from "taro-calendar-customizable";

const Index: FunctionComponent = () => {
  return (
    <Calendar
      marks={[
        { value: "2021-06-11", color: "red", markSize: "9px" },
        { value: "2021-06-12", color: "pink", markSize: "9px" },
        { value: "2021-06-13", color: "gray", markSize: "9px" },
        { value: "2021-06-14", color: "yellow", markSize: "9px" },
        { value: "2021-06-15", color: "darkblue", markSize: "9px" },
        { value: "2021-06-16", color: "pink", markSize: "9px" },
        { value: "2021-06-23", color: "green", markSize: "9px" },
      ]}
      isMultiSelect
      selectedDateColor="#346fc2"
      onDayClick={(item) => console.log(item)}
      onDayLongPress={(item) => console.log(item)}
      headStyle={{
        backgroundColor: "RGBA(12,36,157,0.5)",
        borderTopLeftRadius: "10px",
        borderTopRightRadius: "10px",
        boxShadow: "0 0 5px RGBA(0,0,0,0.3)",
        width: "90vw",
        marginLeft: "5vw",
        zIndex: 2,
      }}
      bodyStyle={{
        backgroundColor: "lightblue",
        borderBottomLeftRadius: "10px",
        borderBottomRightRadius: "10px",
        boxShadow: "0 0 5px RGBA(0,0,0,0.3)",
        borderTop: "none",
        width: "90vw",
        marginLeft: "5vw",
        paddingBottom: "0.4rem",
      }}
    />
  );
};

export default Index;

详情如下两张图所示

周视图

月视图

同样可以使用 customStyleGenerator 来更精细化的定制

import Taro, { FunctionComponent } from "@tarojs/taro";
import Calendar from "taro-calendar-customizable";

const Index: FunctionComponent = () => {
  const customStyleGenerator = {
    extraInfoStyle: {
      position: "absolute",
      fontSize: "0.5rem",
      right: "-0.8rem",
      top: "0",
    },
    dateStyle: {
      marginTop: "0.6rem",
      borderRadius: "30%",
    },
    markStyle: {
      top: "auto",
      bottom: "0",
      right: "50%",
      transform: "translateX(50%)",
    },
  };
  return (
    <CustomCalendar
      view={type}
      marks={[
        { value: "2021-06-11", color: "red", markSize: "9px" },
        { value: "2021-06-12", color: "pink", markSize: "9px" },
        { value: "2021-06-13", color: "gray", markSize: "9px" },
        { value: "2021-06-14", color: "yellow", markSize: "9px" },
        { value: "2021-06-15", color: "darkblue", markSize: "9px" },
        { value: "2021-06-16", color: "pink", markSize: "9px" },
        { value: "2021-06-23", color: "green", markSize: "9px" },
      ]}
      extraInfo={[
        { value: "2021-06-21", text: "生日", color: "red" },
        { value: "2021-06-22", text: "休假", color: "darkblue" },
        { value: "2021-06-23", text: "会议", color: "gray" },
      ]}
      customStyleGenerator={() => customStyleGenerator}
      selectedDateColor="#346fc2"
      onDayClick={(item) => console.log(item)}
      onDayLongPress={(item) => console.log(item)}
    />
  );
};

export default Index;

详情如下两张图所示

周视图

月视图

至于其他的就看各位的审美了

自定义控制器

这里通过bindRef方法获取到了CustomCalendar的实例,通过调用内部方法goNext()以及goPrev()实现了翻页控制。

import React, { useRef, useState } from 'react'
import { View, Button } from '@tarojs/components'
import CustomCalendar from 'custom-calendar-taro'
import './index.scss'

const Index = () => {

  const [type, setType] = useState<'week' | 'month'>('week')
  // 组件节点
  const CalendarComponent: any = useRef(null);
  // 修改视图类型
  const viewHandle = () => {
    setType(type === 'week' ? 'month' : 'week')
  }
  // 设置选中的日期
  const setSelectDay = date => {
    console.log(date);
  }
  // 设置当前的视图
  const setCurrentView = date => {
    console.log(date);
  }
  // 向前
  const goPre = () => {
    CalendarComponent.current.goPre()
  }
  // 向后
  const goNext = () => {
    CalendarComponent.current.goNext()
  }
  return (
    <View className='index'>
      <CustomCalendar
        view={type}
        marks={[
          { value: '2021-06-11', color: 'red', markSize: '9px' },
          { value: '2021-06-12', color: 'pink', markSize: '9px' },
          { value: '2021-06-13', color: 'gray', markSize: '9px' },
          { value: '2021-06-14', color: 'yellow', markSize: '9px' },
          { value: '2021-06-15', color: 'darkblue', markSize: '9px' },
          { value: '2021-06-16', color: 'pink', markSize: '9px' },
          { value: '2021-06-17', color: 'green', markSize: '9px' },
        ]}
        extraInfo={[
          { value: '2021-06-21', text: '生日', color: 'red' },
          { value: '2021-06-22', text: '休假', color: 'darkblue' },
          { value: '2021-06-23', text: '会议', color: 'gray' },
        ]}
        bindRef={(ref) => (CalendarComponent.current
          = ref)}

        onCurrentViewChange={setCurrentView}
        onDayClick={(item) => setSelectDay(item.value)}
      />
      <View>
        <Button onClick={viewHandle}>切换周和月</Button>
        <Button onClick={goPre}>上一页</Button>
        <Button onClick={goNext}>下一页</Button>
      </View>
    </View>
  )
}

export default Index;

参数说明

| 参数 | 说明 | 类型 | 默认值 | | -------------- | -------------------------------------------------------------------------- | ---------------------------------------------------------------- | ---------------- | | view | 视图模式 | "week"|"month" | "month" | | selectedDate | 当前选中的时间,格式:YYYY-MM-DD | string | Date.now() | | currentView | 月视图时为当前视图显示的月份YYYY-MM,周视图下为当前显示的周内的某一天YYYY-MM-DD | string | 当前系统时间年月 | | minDate | 最小的可选时间,格式:YYYY-MM-DD | string | 1970-01-01 | | maxDate | 最大的可选时间,格式:YYYY-MM-DD | string | null | | isSwiper | 是否可以滑动 | boolean | true | | isVertical | 是否垂直滑动 | boolean | false | | isMultiSelect | 是否范围选择 | boolean | false | | marks | 需要标记的时间 | Array<{value:string,color:string,markSize:string}> | [] | | extraInfo | 额外信息 | Array<{value:string,text:string,color:string,fontSize:string}> | [] | | hideArrow | 是否隐藏箭头 | boolean | false | | hideController | 是否显示控制器 | false | boolean | | showDivider | 是否显示分割线 | boolean | false | | bindRef | 父组件通过 ref 可以调用内部方法,主要用于实现自定义控制器 | (ref:Calendar)=>any | - |

事件说明

| 参数 | 说明 | 类型 | | ------------------- | -------------------------------------- | ------------------------------ | | onClickPre | 点击左箭头 | () => any | | onClickNext | 点击右箭头 | () => any | | onDayClick | 点击日期时候触发 | (item:{value:string}) => any | | onDayLongPress | 长按日期时触发(长按事件与点击事件互斥) | (item:{value:string}) => any | | onCurrentViewChange | 月份/周 改变时触发 | (value: string) => any | | onSelectDate | 选中日期时候触发 | (value: SelectDate) => any |

样式定制参数

| 参数 | 说明 | 类型 | | -------------------- | -------------------------------- | ------------------------------------------------------------------------------------------ | | selectedDateColor | 选中日期的颜色 | string | | customStyleGenerator | 单元格样式生成器 | (dateInfo:StyleGeneratorParams ) => CustomStyles | | pickerTextGenerator | 日期选择器文本的生成器,参数为:当前视图中的任意一天 | (currentView:Date)=>string | | headStyle | head 整体样式 | CSSProperties | | headCellStyle | head 单元格样式 | CSSProperties | | bodyStyle | body 整体样式 | CSSProperties | | leftArrowStyle | 左箭头样式 | CSSProperties | | rightArrowStyle | 右箭头样式 | CSSProperties | | datePickerStyle | 日期选择器样式 | CSSProperties | | pickerRowStyle | 日期选择器&左右箭头 所在容器样式 | CSSProperties |

类型说明

StyleGeneratorParams

每个单元格包含的所有信息

| 参数 | 说明 | 类型 | | ------------ | ------------------------------------------------------------------------------- | ------------------------------------- | | date | 当前月的第几天 1 ~ 31 | number | | currentMonth | 是否是属于当前显示的月份(比如 7 月 31 日不属于 8 月,但是会显示在 8 月这一页) | boolean | | fullDateStr | 时间 YYYY-MM-DD | string | | selected | 是否被选中 | boolean | | marked | 是否标记 | boolean | | hasExtraInfo | 是否含有额外信息 | boolean | | multiSelect | 多选模式参数 | MultiSelectParam | | startDay | 指定周几为一行的起点,0 为周日,1 为周一 | number |

CustomStyles

样式生成器返回结果

| 参数 | 说明 | 类型 | | -------------- | -------------- | --------------- | | dateStyle | 日期样式 | CSSProperties | | markStyle | 标记样式 | CSSProperties | | containerStyle | 容器单元格样式 | CSSProperties | | extraInfoStyle | 额外信息样式 | CSSProperties |

MultiSelectParam

多选模式参数

| 参数 | 说明 | 类型 | | ----------------- | ---------------- | --------- | | multiSelected | 是否在选择范围内 | boolean | | multiSelectedStar | 是否是选择起点 | boolean | | multiSelectedEnd | 是否是选择终点 | boolean |