更新记录

1.0.8(2024-09-04) 下载此版本

文档更新 新增参数

1.0.7(2024-09-03) 下载此版本

修复宽度bug

1.0.6(2024-08-23) 下载此版本

修复底部按钮样式问题

查看更多

平台兼容性

HbuilderX/cli最低兼容版本
3.1.0

uni-app

Vue2 Vue3
?
app-vue app-nvue app-android app-ios app-harmony
? ? ? ? ?
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
? ? ? ? ? ? ? ? ?
微信小程序 支付宝小程序 百度小程序 字节小程序 QQ小程序 钉钉小程序 快手小程序 飞书小程序 京东小程序
? ? ? ? ? ? ? ? ?
快应用-华为 快应用-联盟
? ?

uni-app x

app-android app-ios
? ?
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
? ? ? ? ? ? ? ? ?

r-calendar

r-calendar 日历, 日历组件用于选择日期或日期区间。

在线示例 完整文档 完整文档

示例

<template>
  <r-config-provider :themeName="themeName">
    <page-header title="日历"></page-header>
    <view style="padding: 20rpx 0">
      <r-cell-group inset>
        <r-cell
          title="滚动切换"
          is-link
          :value="data.date0"
          @click="
            open({
              changeField: 'date0',
            })
          "
        />
        <r-cell
          title="年月切换"
          is-link
          :value="data.date1"
          @click="
            open({
              switchMode: 'year-month',
              changeField: 'date1',
            })
          "
        />

        <r-cell
          title="月切换"
          is-link
          :value="data.date2"
          @click="
            open({
              switchMode: 'month',
              changeField: 'date2',
            })
          "
        />
        <r-cell
          title="单个日期"
          is-link
          :value="data.date3"
          @click="
            open({
              switchMode: 'month',
              type: 'single',
              changeField: 'date3',
            })
          "
        />

        <r-cell
          title="多个日期"
          is-link
          :value="data.date4"
          @click="
            open({
              switchMode: 'month',
              type: 'multiple',
              changeField: 'date4',
            })
          "
        />

        <r-cell
          title="选择日期区间"
          is-link
          :value="data.date5"
          @click="
            open({
              switchMode: 'month',
              type: 'range',
              changeField: 'date5',
            })
          "
        />

        <r-cell
          title="快捷选择"
          is-link
          :value="data.date6"
          @click="
            open({
              switchMode: 'month',
              showConfirm: false,
              changeField: 'date6',
            })
          "
        />

        <r-cell
          title="自定义颜色"
          is-link
          :value="data.date7"
          @click="
            open({
              switchMode: 'month',

              type: 'range',
              color: '#ee0a24',
              changeField: 'date7',
            })
          "
        />
        <r-cell
          title="自定义按钮文字"
          is-link
          :value="data.date8"
          @click="
            open({
              switchMode: 'month',

              type: 'range',
              color: '#ee0a24',
              confirmText: '完成',
              confirmDisabledText: '请选择结束时间',
              changeField: 'date8',
            })
          "
        />

        <r-cell
          title="日期区间最大范围"
          is-link
          :value="data.date9"
          @click="
            open({
              switchMode: 'month',

              type: 'range',

              maxRange: '3',
              changeField: 'date9',
            })
          "
        />

        <r-cell
          title="自定义周起始日"
          is-link
          :value="data.date10"
          @click="
            open({
              switchMode: 'month',

              type: 'range',
              firstDayOfWeek: 1,
              changeField: 'date10',
            })
          "
        />

        <r-cell title="单独使用">
          <template #value>
            <r-switch v-model:value="flag"></r-switch>
          </template>
        </r-cell>
      </r-cell-group>
      <r-divider content-position="left" v-if="flag">单独使用 </r-divider>
      <r-calendar v-if="flag"></r-calendar>
    </view>

    <r-popup
      v-model:show="show"
      round
      position="bottom"
      closeable
      destroy
      @click-close-icon="show = false"
      safeAreaInsetBottom
      :customStyle="{
        padding: 0,
      }"
    >
      <!-- switch-mode="year-month" -->
      <!-- :show="show" -->
      <view style="padding-bottom: 20px">
        <r-calendar
          :switch-mode="switchMode"
          :type="type"
          :color="color"
          :showConfirm="showConfirm"
          :confirmText="confirmText"
          :confirmDisabledText="confirmDisabledText"
          :maxRange="maxRange"
          :firstDayOfWeek="firstDayOfWeek"
          :defaultDate="defaultDate[changeField]"
          @confirm="onConfirm"
        ></r-calendar>
      </view>
    </r-popup>
  </r-config-provider>
</template>

<script setup>
import { dayjs } from "@/uni_modules/r-utils/js_sdk/index.js";
import { ref } from "vue";
import useTheme from "@/hooks/useTheme";
const { themeName } = useTheme();
const show = ref(false);
const switchMode = ref("none");
const type = ref("single");
const showConfirm = ref(true);
const color = ref("#1989fa");
const confirmText = ref("");
const confirmDisabledText = ref("");
const maxRange = ref(null);
const firstDayOfWeek = ref(0);
const flag = ref(false);
const data = ref({});
const defaultDate = ref({});
const changeField = ref("");

const formatter = (day) => {
  const month = dayjs(day.date).month() + 1;
  const date = dayjs(day.date).date();

  if (month === 5) {
    if (date === 1) {
      day.topInfo = "劳动节";
    } else if (date === 4) {
      day.topInfo = "青年节";
    } else if (date === 11) {
      day.text = "今天";
    }
  } else if (month === 7) {
    if (date === 1) {
      day.topInfo = "建党节";
    }
  } else if (month === 8) {
    if (date === 1) {
      day.topInfo = "建军节";
    }
  } else if (month === 10) {
    if (date === 1) {
      day.topInfo = "国庆节";
    }
  }

  if (day.type === "start") {
    day.bottomInfo = "入住";
  } else if (day.type === "end") {
    day.bottomInfo = "离店";
  }

  return day;
};

const open = (e) => {
  show.value = true;
  switchMode.value = e.switchMode || "none";
  type.value = e.type || "single";
  showConfirm.value = e.showConfirm !== false;
  color.value = e.color || "#1989fa";
  confirmDisabledText.value = e.confirmDisabledText || "确定";
  confirmText.value = e.confirmText || "确定";
  maxRange.value = e.maxRange || null;
  firstDayOfWeek.value = e.firstDayOfWeek || 0;
  changeField.value = e.changeField || "";
};
const onConfirm = (value) => {
  show.value = false;
  if (changeField.value) {
    if (type.value === "multiple") {
      defaultDate.value[changeField.value] = value.map((t) =>
        dayjs(t).valueOf()
      );
      value = value.map((i) => dayjs(i).format("YYYY-MM-DD")).join(",");
    } else if (type.value === "range") {
      defaultDate.value[changeField.value] = value.map((t) =>
        dayjs(t).valueOf()
      );
      value = value.map((i) => dayjs(i).format("YYYY-MM-DD")).join("~");
    } else {
      defaultDate.value[changeField.value] = dayjs(value).valueOf();
      value = dayjs(value).format("YYYY-MM-DD");
    }

    data.value[changeField.value] = value;
  }
};
</script>

API

Props

参数 说明 类型 默认值 可选值
type 选择类型:single 表示选择单个日期,multiple 表示选择多个日期,range 表示选择日期区间 String single single multiple range
switchMode 切换模式:none 平铺展示所有月份,不展示切换按钮,month 支持按月切换,展示上个月/下个月按钮,year-month 支持按年切换,也支持按月切换,展示上一年/下一年,上个月/下个月按钮 String none none month year-month
title 日历标题 String 日期选择 -
color 主题色,对底部按钮和选中日期生效 String #1989fa
minDate 可选择的最小日期(时间戳) Number 当前时间的时间戳
maxDate 可选择的最大日期(时间戳) Number 当前时间六个月后的时间戳
defaultDate 默认选中的日期,type 为 multiple 或 range 时为数组,传入 null 表示默认不选择 Number | Array null
rowHeight 日期行高(px) Number 64
contentHeight 日期内容的高度(px) 仅 switchMode=none 时生效 Number 400
formatter 日期格式化函数 Function e=>e
formatMonthTitle 标题格式化函数 Function (year, month) => year+'年'+'month'+'月'
componentWidth 组件宽度 1.0.7新增 String 100vw
lazyRender 是否只渲染可视区域的内容 Boolean true
showMark 是否显示月份背景水印 Boolean true
showTitle 是否展示日历标题 Boolean true
showSubtitle 是否展示日历副标题(年月) Boolean true
showConfirm 是否展示确认按钮 Boolean true
readonly 是否为只读状态,只读状态下不能选择日期 Boolean false
confirmText 确认按钮的文字 String 确定
confirmDisabledText 确认按钮处于禁用状态时的文字 String 确定
firstDayOfWeek 设置周起始日 0-6 Number 0
weekdays 星期的文案 Array ["日", "一", "二", "三", "四", "五", "六"]
themeName r-theme 主题名称 String default
maxRange 日期区间最多可选天数 当 Calendar 的 type 为 range 或 multiple 时,支持 String |Number -
rangePrompt 范围选择超过最多可选天数时的提示文案 当 Calendar 的 type 为 range 或 multiple 时,支持 Function (num) => '最多选择'+ num + '天'
showRangePrompt 范围选择超过最多可选天数时,是否展示提示文案 当 Calendar 的 type 为 range 时,支持 Boolean true
allowSameDay 是否允许日期范围的起止时间为同一天 当 Calendar 的 type 为 range 时,支持 Boolean false

Day 数据结构

日历中的每个日期都对应一个 Day 对象,通过formatter属性可以自定义 Day 对象的内容
键名 说明 类型
date 日期对应的 dayjs 对象 Object
type 日期类型,可选值为 selectedstartmiddleenddisabled String
text 中间显示的文字 String
topInfo 上方的提示信息 String
bottomInfo 下方的提示信息 String
className 额外类名 String

Events

名称 说明 参数
select 点击并选中任意日期时触发 value
confirm 日期选择完成后触发,若 show-confirmtrue,则点击确认按钮后触发 value
unselect 当日历组件的 typemultiple 时,取消选中日期时触发 value
overRange 范围选择超过最多可选天数时触发 -
clickSubtitle 点击日历副标题时触发 event
clickDisabledDate 点击禁用日期时触发 value
panelChange 日历面板切换时触发 {date}

Slots

名称 说明 参数
title 自定义标题 -
subtitle 自定义日历副标题 {text,date}
monthTitle 自定义每个月份的小标题 {text,date}
footer 自定义底部区域内容 -
confirmText 自定义确认按钮的内容 {disabled}
prevMonth 自定义上个月按钮 {disabled}
prevYear 自定义上一年按钮 {disabled}
nextMonth 自定义下个月按钮 {disabled}
nextYear 自定义下一年按钮 {disabled}

更多组件,请前往rainui

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问