微信小程序的日期区间选择组件的封装和使用

组件化开发是一种将大型软件系统分解为更小、更易于管理和复用的独立模块或组件的方法。这种方法在现代软件开发中越来越受到重视,尤其是在前端开发领域。微信小程序的日期区间选择组件的使用
在这里插入图片描述

wxml 代码

<view>
  <view bind:tap="chooseData">{{ rendunTime || '请选择开始时间和结束时间'}}</view>
  <sx-data-picker show="{{isShowData}}" bind:confirm="getDataSlot"></sx-data-picker>
</view>

js 代码

Page({
  data: {
    isShowData:false,
    rendunTime:""
  },
  chooseData(){
    this.setData({
      isShowData:!this.isShowData
    })
  },
  getDataSlot(e){
    let time = `${e.detail.start}${e.detail.end}`
    this.setData({
      rendunTime:time
    })
  }
})

微信小程序的日期区间选择组件的封装

wxml布局代码

<!-- 遮罩层的样式 -->
<view class="page" bindtouchmove="touchMove" hidden="{{!hideModal}}" wx:if="{{show}}">
  <!-- 内容视图样式 -->
  <view class="content" style="transform:translateY({{translateY}}px);" animation="{{animate}}">
    <view class="header" bindtouchstart="touchStart">
      <image class="headerFork" bindtap="hideModal" src="/static/images/close.png"></image>
      <view class="time" >
        <view class="time_text">
          <view>开始时间:{{startyear}}年{{startmonth}}月{{startday}}日</view>
        </view>
        <view class="item_time">
          <picker-view indicator-class="picker_active" mask-class="mask" value="{{startvalue}}" data-type="start" style="width: 100%; height: 200rpx;" bindchange="bindChange">
            <picker-view-column>
              <view class="timeText" wx:for="{{years}}" wx:key="index">{{item}}年</view>
            </picker-view-column>
            <picker-view-column>
              <view class="timeText" wx:for="{{months}}" wx:key="index" bindchange="monthChange">{{item}}月</view>
            </picker-view-column>
            <picker-view-column>
              <view class="timeText" wx:for="{{days}}" wx:key="index">{{item}}日</view>
            </picker-view-column>
          </picker-view>
        </view>
        <view class="time_text">
          <view>结束时间:{{endyear}}年{{endmonth}}月{{endday}}日</view>
        </view>
        <view class="item_time">
          <picker-view indicator-class="picker_active" mask-class="mask" style="width: 100%; height: 200rpx;" value="{{endvalue}}" data-type="end" bindchange="bindChange">
            <picker-view-column>
              <view class="timeText" wx:for="{{years}}" wx:key="index">{{item}}年</view>
            </picker-view-column>
            <picker-view-column>
              <view class="timeText" wx:for="{{months}}" wx:key="index">{{item}}月</view>
            </picker-view-column>
            <picker-view-column>
              <view class="timeText" wx:for="{{days}}" wx:key="index">{{item}}日</view>
            </picker-view-column>
          </picker-view>
        </view>
      </view>
    </view>
    <!-- 按钮 -->
    <view class="button" bindtap="confirm">
      <view class="view">确认</view>
    </view>
  </view>
</view>

wxss样式代码

.page {
  position: fixed;
  top: 0;
  left: 0;
  z-index: 1000;
  width: 100vw;
  height: 100vh;
  background: rgba(0, 0, 0, 0.5);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
}
 
.content {
  width: 100vw;
  background: rgba(255, 255, 255, 1);
  border-radius: 16rpx 16rpx 0rpx 0rpx;
}
 
.header {
  width: 100vw;
  padding: 24rpx 50rpx;
  box-sizing: border-box;
}
 
.header .headerFork {
  position: absolute;
  top: 26rpx;
  left: calc(100% - 60rpx);
  width: 36rpx;
  height: 36rpx;
  opacity: 0.3;
  border-radius: 50%;
}
 
.headerContent {
  width: 198rpx;
  height: 198rpx;
  border-radius: 8rpx;
}
 
.headerContent .headerContentImage {
  width: 100%;
  height: 100%;
  border-radius: 8rpx;
}
 
.header .money {
  font-size: 48rpx;
  font-family: Medium;
  font-weight: 500;
  color: #FA5151;
  margin-left: 24rpx;
}
 
.smallMoney {
  font-size: 30rpx;
}
 
.header>.headerNumber>.name {
  height: 30rpx;
  font-size: 30rpx;
  font-family: Medium;
  font-weight: 500;
  color: #181818;
  line-height: 30rpx;
}
 
.button {
  width: 100vw;
  padding: 32rpx 24rpx;
  border-top: 2rpx solid #f5f5f5;
  position: relative;
  z-index: 100;
}
 
.button .view {
  width: calc(100% - 48rpx);
  height: 80rpx;
  border-radius: 50rpx;
  line-height: 80rpx;
  text-align: center;
  font-size: 30rpx;
  font-family: Regular;
  font-weight: 400;
  color: #fff;
  background: #409eff;
  opacity: 1;
}
.timeText{
  font-size: 28rpx;
  line-height: 68rpx;
  font-family: Medium;
  font-weight: 500;
  color: #181818;
  text-align: center;
}
.time_text {
  text-align: center;
  margin-top: 32rpx;
  margin-bottom: 14rpx;
  font-size: 30rpx;
  font-family: Medium;
  font-weight: 500;
  color: #181818;
}

js 逻辑代码

 
let pageY = 0
const date = new Date()
const years = []
const months = []
const days = []
// 获取当前日期的年月日
var currentYear = new Date().getFullYear();
var currentMonth = new Date().getMonth() + 1;
var currentDate = new Date().getDate();
// 当前月份包含的天数
var maxDate = new Date(currentYear, currentMonth, 0).getDate();
// 所有的年份
for (let i = 1990; i <= date.getFullYear(); i++) {
  years.push(i)
}
// 所有的月份
for (let i = 1; i <= 12; i++) {
  months.push((i + "").padStart(2, '0'))
}
// 当前月份包含的所有天数
for (let i = 1; i <= maxDate; i++) {
  days.push((i + "").padStart(2, '0'))
}
 
Component({
  options: {
    styleIsolation: 'isolated', //样式隔离
  },
  /**
   * 组件的属性列表
   */
  properties: {
    show: {
      type: Boolean,
      value: false
    },
  },
  /**
   * 数据监听
   */
  observers: {
    'show': function (value) {
      if (value) {
        this.showModal()
      } else {
        this.hideModal()
      }
    }
  },
  /**
   * 组件的初始数据
   */
  data: {
    // 时间控件
    years: years,
    months: months,
    days: days,
    // 开始日期文字
    startyear: '',
    startmonth: '',
    startday: '',
    // 时间控件开始时间
    startvalue: [],
    // 结束日期文字
    endyear: '',
    endmonth: '',
    endday: '',
    // 时间控件结束时间
    endvalue: [],
    animate: '',
    hideModal: false, //模态框的状态  false-隐藏  true-显示
  },
  /**
   * 组件的方法列表
   */
  methods: {
    // 显示遮罩层
    showModal() {
      this.setData({
        hideModal: true, //点击之后是否显示
      })
      const animation = wx.createAnimation({
        duration: 500, //反应的时间
        timingFunction: 'ease', //动画效果
      })
      // 先显示背景再执行动画,translateY(0)偏移量为0代表显示默认高度
      setTimeout(() => {
        animation.translateY(0).step()
        this.setData({
          animate: animation.export()
        })
        this.timeShow()
      }, 0)
    },
    // 隐藏遮罩层
    hideModal() {
      const animation = wx.createAnimation({
        duration: 500,
        timingFunction: 'ease',
      })
      // 设置为100vh可以确保滚动到底部,可以按照自己的内容高度设置,能够滑到底部即可
      animation.translateY('100vh').step()
      this.setData({
        animate: animation.export(),
      })
      // 先执行动画,再隐藏组件
      setTimeout(() => {
        this.setData({
          hideModal: false
        })
        this.triggerEvent('hideModal', true)
      }, 300)
 
    },
    // 移动
    touchMove(e) {
      const clientY = e.changedTouches[0].clientY
      if (clientY - pageY > 0 && clientY - pageY > 50) {
        this.hideModal()
      }
    },
    // 触摸开始
    touchStart(e) {
      pageY = e.changedTouches[0].clientY
    },
    // 时间更改
    bindChange(e) {
      const val = e.detail.value;
      var newDays = [];
      var maxDate = new Date(this.data.years[val[0]], this.data.months[val[1]], 0).getDate();
      // 选择月份包含的所有天数
      for (let i = 1; i <= maxDate; i++) {
        newDays.push((i + "").padStart(2, '0'))
      }
      // 时间文字内容更改
      if (e.target.dataset.type == 'start') { //开始时间
        //判断月份是否发生改变---月份改变 对应的当月包含天数改变并且定位到1号
        if (this.data.startmonth != this.data.months[val[1]]) {
          this.setData({
            days: newDays,
            startvalue: [val[0], val[1], 0],
            startyear: this.data.years[val[0]],
            startmonth: this.data.months[val[1]],
            startday: days[0]
          })
        } else {
          this.setData({
            startyear: this.data.years[val[0]],
            startmonth: this.data.months[val[1]],
            startday: this.data.days[val[2]]
          })
        }
      } else { //结束时间
        //判断月份是否发生改变---月份改变 对应的当月包含天数改变并且定位到1号
        console.log(days[0])
        if (this.data.endmonth != this.data.months[val[1]]) {
          this.setData({
            days: newDays,
            endvalue: [val[0], val[1], 0],
            endyear: this.data.years[val[0]],
            endmonth: this.data.months[val[1]],
            endday: days[0]
          })
        } else {
          this.setData({
            days: newDays,
            endyear: this.data.years[val[0]],
            endmonth: this.data.months[val[1]],
            endday: this.data.days[val[2]]
          })
        }
      }
    },
    timeShow() {
      // 获取时间控件---默认的开始时间和结束时间
      var defaultYear = years.length - 1;
      var defaultMonth = currentMonth;
      var defaultDate = currentDate - 1;
      this.setData({
        // 开始日期文字
        startyear: currentYear,
        startmonth: currentMonth,
        startday: currentDate,
        // 时间控件开始时间
        startvalue: [defaultYear, defaultMonth, defaultDate],
        // 结束日期文字
        endyear: currentYear,
        endmonth: currentMonth,
        endday: currentDate,
        // 时间控件结束时间
        endvalue: [defaultYear, defaultMonth, defaultDate],
      })
    },
    // 确认按钮事件
    confirm() {
      let {
        startyear,
        startmonth,
        startday,
        endyear,
        endmonth,
        endday
      } = this.data
      let obj = {
        start: startyear + '-' + startmonth + '-' + startday, //开始时间
        end: endyear + '-' + endmonth + '-' + endday //结束时间
      }
      this.hideModal()
      this.triggerEvent('confirm', obj)
    },
  },
})

如果这篇文章对你有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢你的细心阅读,如果你发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902067.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【K8S系列】Kubernetes Pod节点CrashLoopBackOff 状态及解决方案详解【已解决】

在 Kubernetes 中&#xff0c;Pod 的状态为 CrashLoopBackOff 表示某个容器在启动后崩溃&#xff0c;Kubernetes 尝试重启该容器&#xff0c;但由于持续崩溃&#xff0c;重启的间隔时间逐渐增加。下面将详细介绍 CrashLoopBackOff 状态的原因、解决方案及相关命令的输出解释。 …

水轮发电机油压自动化控制系统解决方案介绍

在现代水电工程中&#xff0c;水轮机组油压自动化控制系统&#xff0c;不仅直接关系到水轮发电机组的安全稳定运行&#xff0c;还影响着整个水电站的生产效率和经济效益。 一、系统概述 国科JSF油压自动控制系统&#xff0c;适用于水轮发电机组调速器油压及主阀&#xff08;蝶…

论文笔记(五十一)Challenges for Monocular 6-D Object Pose Estimation in Robotics

Challenges for Monocular 6-D Object Pose Estimation in Robotics 文章概括摘要I. 介绍II. 正在进行的研究和常见数据集A. 数据集B. 正在进行的研究问题 III. 未来挑战A. 物体本体B. 可变形和关节物体C. 场景级一致性D. 基准现实性E. 环境影响F. 通用物体操控 IV. 结论 Estim…

HeterGCL 论文写作分析

HeterGCL 论文写作分析 这篇文章&#xff0c;由于理论证明较少&#xff0c;因此写作风格了polygcl是两种风格的。polygcl偏向理论的写作风格&#xff0c;而hetergcl就是实践派的风格 首先看标题&#xff0c;其的重点是Graph contrastive learning Framework。其重点是framewo…

C语言初阶:十.结构体基础

♥感谢您阅读本篇文章&#xff0c;文章内容为个人对所学内容的整理总结&#xff0c;欢迎大佬在评论区指点一二。♥ ♥个人主页&#xff1a;折枝寄北-CSDN博客折枝寄北擅长C语言初阶,等方面的知识,折枝寄北关注python,c,java,qt,c语言领域.https://blog.csdn.net/2303_80170533?…

QT仿QQ聊天项目,第一节,创建项目并布置编辑登录界面

目录 一&#xff0c;创建项目 二&#xff0c;编辑登录界面 1&#xff0c;登录界面整体构造 2&#xff0c;登录界面的宽高 3&#xff0c;登录界面使用到的控件 4&#xff0c;登录界面中的控件所在的位置和大小 &#xff08;1&#xff09;qq图标label位置和大小 &#xff0…

《计算机原理与系统结构》学习系列——处理器(中)

系列文章目录 目录 流水线数据通路与控制概述5个流水级指令周期与流水级 流水线性能流水线时钟周期的长度T和数量cycles流水线性能 流水线数据通路流水线寄存器流水线分析图形化流水线流水线控制 流水线数据通路与控制 概述 5个流水级 指令周期与流水级 单周期实现中&#x…

【JavaEE】【多线程】volatile,wait/notify

目录 一、volatile关键字1.1 内存可见性1.2 volatile解决内存可见性问题 二、wait和notify2.1 wait2.2 notify2.3 使用例子2.3.1 例子12.3.2 例子二 一、volatile关键字 volatile可以保证内存可见性&#xff0c;只能修饰变量。 1.1 内存可见性 在前面介绍线程不安全原因时介…

C语言[求x的y次方]

C语言——求x的y次方 这段 C 代码的目的是从用户输入获取两个整数 x 和 y &#xff0c;然后计算 x 的 y 次幂&#xff08;不过这里有个小错误&#xff0c;实际计算的是 x 的 (y - 1) 次幂&#xff0c;后面会详细说&#xff09;&#xff0c;最后输出结果。 代码如下: #include…

银河麒麟V10通过tigervnc实现远程桌面和windows系统连接

1、查看系统版本:uname -a Linux localhost.localdomain 4.19.90-89.16.v2401.ky10.x86_64 #1 SMP Sat Sep 14 13:09:47 CST 2024 x86_64 x86_64 x86_64 GNU/Linux 2、查看是否具有桌面环境:yum grouplist 安装VNC需要具有桌面环境 3.、安装tigervnc: yum install tigervnc…

Linux基础命令(五) 之 cat,head,tail,more,less,grep

目录 一&#xff0c;浏览普通文件内容 二&#xff0c;过滤文件内容显示--grep 参数及其作用 ​编辑 常见用法 一&#xff0c;浏览普通文件内容 注意&#xff1a;以上命令均可以结合管道符一起使用 二&#xff0c;过滤文件内容显示--grep 在指定的普通文件中查找并显示含有…

vue写个表格,让它滚动起来,没有用datav,有的时候结合会出错,一种简单的方法,直接用animation

表格样式就先不说了哈&#xff0c;这些简单内容&#xff0c;如果粉丝朋友还有什么问题&#xff0c;可以私信 好啦&#xff0c;首先&#xff0c;第一步 1.在目录的这个地方创建文件夹css&#xff0c;里面放两个文件 . 第一个文件里面内容 第二个文件里面内容 .drawCur{ curs…

VR在线展厅重塑展览新维度,引领沉浸式科技体验与漫游新时代

一、VR在线展厅开启数字展览新篇章 VR在线展厅将传统的实体展览空间转化为数字化的虚拟环境。参观用户只需使用手机、平板、电脑等设备就能瞬间穿越至虚拟展厅中&#xff0c;身临其境地浏览各类展品。这种前所未有的科技体验不仅让参观者感受到了数字技术的魅力&#xff0c;更极…

JS实现警灯效果红蓝闪烁

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>警灯效果红蓝闪烁</title&…

【WiFi7】 支持wifi7的手机

数据来源 Smartphones with WiFi 7 - list of all latest phones 2024 Motorola Moto X50 Ultra 6.7" 1220x2712 Snapdragon 8s Gen 3 16GB RAM 1024 GB 4500 mAh a/b/g/n/ac/6e/7 Sony Xperia 1 VI 6.5" 1080x2340 Snapdragon 8 Gen 3 12GB RAM 512 G…

web服务实验

http实验 先创建需要访问的web页面文件index.html 编辑vim /etc/nginx/conf.d/testip.conf 测试通过域名访问需要编辑/etc/hosts 如果通过windows的浏览器访问需要编辑下面的文件通过一管理员身份打开的记事本编辑 C:\Windows\System32\drivers\etc下的hosts文件 192.168.1…

Kubernetes运行大数据组件-设计思路

环境说明 在Kubernetes集群添加三个节点作为大数据测试服务节点&#xff1a; NAME STATUS ROLES AGE VERSION bigdata199056 Ready worker 2d3h v1.20.6 bigdata199057 Ready worker 2d5h v1.20.6 bigdata199058 Ready work…

Maven的依赖

一、依赖的基本配置 根元素project下的dependencies可以包含多个 dependence元素&#xff0c;以声明多个依赖。每个依赖都应 该包含以下元素&#xff1a; 1. groupId, artifactId, version : 依赖的基本坐标&#xff0c; 对于任何⼀个依赖来说&#xff0c;基本坐标是最…

前端聊天室页面开发(赛博朋克科技风,内含源码)

肝了一天&#xff0c;经过各种处理美化&#xff0c;肝出来了一个赛博朋克科技风的前端页面&#xff0c;用的原生三件套htmlcssjavascript开发的&#xff0c;本来想是加点功能调用一下gpt接口&#xff0c;但是基本都需要webscoket通信&#xff0c;可惜我js学的不是很深入&#x…

使用Vue.js构建响应式Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Vue.js构建响应式Web应用 1 引言 2 Vue.js简介 3 安装Vue CLI 4 创建Vue项目 5 设计应用结构 6 创建组件 7 使用…