vant 时间选择器--开始时间和结束时间实例


Posted in Javascript onNovember 04, 2020

我就废话不多说了,大家还是直接看代码吧~

<template>
  <div class="linesMigrate">
    <div class="conditionDiv">
      <div class="singleCondition" :style="conditonStyle2" @click="showPopupDateChooseStart">
        <div class="dateValueDiv" v-if="allDateStart">{{dateFormatterStart}}</div>
        <div class="dateValueDiv" v-if="!allDateStart" :style="{ fontSize:'0.72rem' }">{{dateFormatterStart}}</div>
      </div>
      <div class="singleCondition" :style="conditonStyle2" @click="showPopupDateChoose">
        <div class="dateValueDiv" v-if="allDate">{{dateFormatter}}</div>
        <div class="dateValueDiv" v-if="!allDate" :style="{ fontSize:'0.72rem' }">{{dateFormatter}}</div>
      </div>
    </div>
    <!-- 选开始时间 -->
    <van-popup
        v-model="showDateChooseStart"
        position="bottom"
        :close-on-click-overlay="false"
        :style="{ height: '22rem',position: 'absolute',bottom:'3rem' }"
        :overlay-style="{ position: 'absolute', bottom: '3rem', top: 'auto', background: 'rgba(0, 0, 0, 0.298039215686275)' }">
      <div class="popupDate" :style="bgDateImgStyle">
      <img alt="..." src="../../assets/icon/downArrow.png" @click="closeDatePopStart" :style="{ marginBottom: '16%',width:'10%',marginTop:'7.7%',opacity:0 }" />
      <van-datetime-picker
          :show-toolbar="false"
          v-model="dateChooseStart"
          type="date"
          :min-date="minDateStart"
          :max-date="maxDateStart"
      />
        <div class="chooseTodayDiv" @click="chooseDateStart">选择最近一周</div>
      </div>
    </van-popup>
    <!-- 选结束时间 最近一天 -->
    <van-popup
        v-model="showDateChoose"
        position="bottom"
        :close-on-click-overlay="false"
        :style="{ height: '22rem',position: 'absolute',bottom:'3rem' }"
        :overlay-style="{ position: 'absolute', bottom: '3rem', top: 'auto', background: 'rgba(0, 0, 0, 0.298039215686275)' }">
      <div class="popupDate" :style="bgDateImgStyle">
      <img alt="..." src="../../assets/icon/downArrow.png" @click="closeDatePop" :style="{ marginBottom: '16%',width:'10%',marginTop:'7.7%',opacity:0 }" />
      <van-datetime-picker
          :show-toolbar="false"
          v-model="dateChoose"
          type="date"
          :min-date="minDate"
          :max-date="maxDate"
      />
        <div class="chooseTodayDiv" @click="chooseDateToday">选择最新一天</div>
      </div>
    </van-popup>
 

    <Loading :isShow="loadingState" />
  </div>
</template>
 

<script>
  import Loading from '../../components/common/loading.vue';// 引入公共的loading组件
  import Vue from 'vue';
  import { Popup } from 'vant';
  import { DatetimePicker } from 'vant';
  
  Vue.use(DatetimePicker);
  Vue.use(Popup);
 

  export default {
    name: 'lines',
    mounted() {
      // 获取数据
      this.loadingState=false;
      this.initRequest();
    },
    data() {
      return {
        // 时间选择背景样式数据
        conditonStyle2: {
          background: "url(" + require("../../assets/img/migrate2.png") + ") no-repeat center",
          backgroundSize: "contain"
        },
        // 日期组件弹出层展示与否的标志 --开始时间
        showDateChooseStart:false,
         // 日期组件弹出层展示与否的标志
        showDateChoose:false,
        
        // 弹出层背景图片
        bgDateImgStyle: {
          background: "url(" + require("../../assets/img/migratePopBackDate.png") + ") no-repeat",
          backgroundSize: "contain"
        },
        // 标准化未经处理的时间格式
        dateChoose: new Date(),
        dateChooseStart: new Date(),
        // 处理过格式的日期数据
        dateFormatter:"日期",
        allDate:true,
        dateFormatterStart:"日期",
        allDateStart:true,
 

        minDateStart: new Date(2019,8,1), // 开始时间最小2019/9/01
        maxDateStart: new Date(), // 开始时间最大 当前时间
        minDate: new Date(), //最小时间必须 》开始的最大时间maxDateStart 
        maxDate: new Date(), // 开始时间最大 当前时间
 

        // 控制加载中状态的标志
        loadingState:true
      };
    },
    methods: {
      // 初始的请求方法
      async initRequest(){
        this.chooseDateToday();
        this.chooseDateStart();
      },
      // 展示日期弹出层--开始时间
      showPopupDateChooseStart() {
        this.showDateChooseStart = true;
      },
      // 展示日期弹出层 --结束时间
      showPopupDateChoose() {
        // 设置结束时间的最小值
        this.minDate = this.dateChooseStart;
        this.showDateChoose = true;
      },
      
      // 关闭日期弹出层 ---开始时间
      closeDatePopStart(){
        this.showDateChooseStart = false;
        this.dateFormatterStart=this.dateTransfor(this.dateChooseStart,"yyyy-MM-dd");
 

        // 设置结束时间的最小值
        this.minDate = this.dateChooseStart;
 

        this.allDateStart=false;
        // this.loadingState=true;
      },
      // 关闭日期弹出层 --结束时间
      closeDatePop(){
        this.showDateChoose = false;
        this.dateFormatter=this.dateTransfor(this.dateChoose,"yyyy-MM-dd");
 

        // 设置开始时间的最大值
        this.maxDateStart = this.dateChoose;
 

        this.allDate=false;
        // this.loadingState=true;
      },
      
      // 日期格式转换函数
      dateTransfor(date,format){
        var o = {
          "M+" : date.getMonth()+1,         //月份
          "d+" : date.getDate(),          //日
          "h+" : date.getHours(),          //小时
          "m+" : date.getMinutes(),         //分
          "s+" : date.getSeconds(),         //秒
          "q+" : Math.floor((date.getMonth()+3)/3), //季度
          "S" : date.getMilliseconds()       //毫秒
        };
        if(/(y+)/.test(format)) {
          format=format.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length));
        }
        for(let k in o) {
          if(new RegExp("("+ k +")").test(format)){
            format = format.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));
          }
        }
        return format;
      },
      // 选择时间函数 -- 七天前
      chooseDateStart(){
        let yesToday=new Date();
        yesToday.setDate(yesToday.getDate()-7);
        this.dateChooseStart=yesToday;
        this.dateFormatterStart=this.dateTransfor(this.dateChooseStart,"yyyy-MM-dd");
      },
      // 选择时间函数 -- 今日
      chooseDateToday(){
        this.dateChoose= new Date();
        this.dateFormatter=this.dateTransfor(this.dateChoose,"yyyy-MM-dd");
      },
      // 选择时间函数 i=0今日
      chooseDate(i){
        let yesToday=new Date();
        yesToday.setDate(yesToday.getDate()-i);
        return this.dateTransfor(yesToday,"yyyy-MM-dd");
      },
 

    },
    components: {
      Loading
    }
  };
</script>
<style scoped>
  /*覆盖原有弹出层样式*/
  .van-popup {
    position: absolute;
    background: transparent;
    /*bottom: 3.01rem;*/
  }
  /*覆盖日期组件原有样式*/
  .van-picker{
    position: relative;
    background-color: #fff;
    user-select: none;
    width: 100%;
  }
 
  /*筛选条件们的div样式*/
  .conditionDiv{
    display: flex;
    justify-content: center;
    width: 100%;
    height: 3.7%;
    margin-top: 4%;
  }
  /*单个筛选条件的样式*/
  .singleCondition{
    width: 27%;
    margin-left: 2%;
    margin-right: 2%;
    /*border: 1px solid #451da4;*/
    height: 100%;
    /*padding-right: 5%;*/
    color: #fff;
    display: flex;
    justify-content: center;
    align-items: center;
    /*flex-direction: column;*/
    font-size: 0.72rem;
  }
  /*日期组件的div,由于其背景用icon而非整个背景图,因此样式上不同*/
  .singleDateDiv{
    width: 23%;
    margin-left: 2%;
    margin-right: 2%;
    /*border: 1px solid #451da4;*/
    height: 100%;
    color: #fff;
    padding-right: 5%;
    display: flex;
    justify-content: flex-start;
  }
  /*日期的值位置样式*/
  .dateValueDiv{
    display: flex;
    justify-content: center;
    flex-direction: column;
    font-size: 0.72rem;
    width: 82%;
  }
  /*日期弹出层中选择今天div样式*/
  .chooseTodayDiv{
    box-sizing: border-box;
    z-index: 2;
    display: flex;
    justify-content: center;
    align-items: center;
    position: absolute;
    bottom: 0;
    color: red;
    height: 3rem;
    width: 90%;
    background: #fff;
    border-top: 1px solid lightgrey;
    font-size: 0.875rem;
  }
  
  /*日期弹窗*/
  .popupDate {
    border-radius: 2px;
    background: #fff;
    height: 100%;
    width: 90%;
    margin: 0 auto;
  }
 

</style>
<style>
  /*覆盖原有的选择器样式*/
  .van-picker-column{
    font-size: 0.9rem;
  }
</style>

补充知识:Vant库的使用,及日期组件的一些注意点

Vant库对于开发商城类项目,真的是非常nice,会让你情不自禁爱上它。Vant库支持按需加载、为移动端商城设计的风格,非常完美。但是,本人在实际开发中,也遇到了一些小问题,折腾了老半天,最终得以解决。

下面先说说在vue中使用Vant库的流程及一些注意事项,以及遇到的坑和解决办法。

首先送上官网传送门:www.youzanyun.com/zanui/vant#…,具体的api可自行查阅使用。

第一步,安装:

cnpm i vant -S

第二步,引入组件:

关于怎么引入Vant组件,有全局引入(非常不推荐)和按需引入两种方式

这里演示按需引入的方式,因为官网说的稍微有些复杂,对于一些刚接触的小伙伴,可能会造成一些误解(PS:我在刚开始接触的时候这里就蹲了两个坑,简直欲哭无泪呀~)。直接说怎么用吧:

为了方便我们按需引入组件,这里还需要安装一个插件

cnpm i babel-plugin-import -D

安装好该插件好,还需要在.babelrc文件中plugins那里进行一个简单的配置,这里附上完整的plugins部分内容。这里我们在plugins数组中插入了import那个数组,其他内容是原来就有的。

"plugins": [  
  "transform-vue-jsx",   
  "transform-runtime",  
  ["import", {   
    "libraryName": "vant",   
    "libraryDirectory": "es",   
    "style": true  
  }]
]

完成好配置后,在main.js中按需引入你需要的组件。例如这里引入Vant的button组件:

import { Button } from 'vant'; // 在mian.js中通过import导入组件,多个组件直接在{,,,}加入即可
Vue.use(Button); //让vue加载该组件如果还需要用其他组件,可以这样写Vue.use(Button).use().user();
<van-button type="default">默认按钮</van-button> // 在template中使用组件

这里提一点,如果是类似Toast这种组件,只需要在main.js中引入就好:

import { Toast } from 'vant';
 
// 然后在你需要的页面直接这样使用就好
// 只要引入后,vant就会自动把Toast组件挂在vue的原型上Vue.prototype.$Toast = Toast;
this.$Toast('message');

可以看到,这里button组件以及正常导入使用了。Vant中还有更多适合实际开发的功能更丰富的组件,小伙伴们自行查阅官方文档使用吧。

附官网API文档传送门:www.youzanyun.com/zanui/vant#…

最后,在说一个关于Vant日期组件使用时所遇到的一个大坑。

Vant日期组件的官网api没有给出关于事件函数的使用demo,到时小编在使用时不小心迈进了一个大坑。

就是change或者confirm事件时,怎么都获取不到回调参数,即在点击确定时回去不到返回的选中时间,总是提示undefined或者null。下面是小编错误的写法,大家不要踩坑:

<!--这是html部门-->
<van-datetime-picker   
  v-model="currentDate"   
  type="datetime"   
  @confirm="confirm()"   
  @change="change()" />
 
// 这是对应的方法
methods: {
  confirm(val) {
    console.log(val)
  },
  change(e) {
    console.log(e.getValues())
  }
}

乍一看,是按照文档上说的方式使用的呀,可是不仅confirm没有返回选中的日期时间,change事件的各种回调方式也使用不了。

但是吧,如果你要打印1,又可以打印出来,说明接口走这个方法了。

到底怎么回事呢,选中的时间怎么就出不来呢?小编差点都要怀疑是不是这个Vant组件有问题了!

说重点:后来小编终于找到了解决办法:

原来是这里出了问题,@confirm="confirm()" @change="change()"

这里多加了一对括号,正确的写法是

<!--这是html部分-->
<van-datetime-picker   
  v-model="currentDate"   
  type="datetime"   
  @confirm="confirm"   
  @change="change" 
/>
 
// 这是对应的方法
methods: {
  confirm(val) {
    console.log(val) // 打印出了时间
  },
  change(e) {
    console.log(e.getValues()) // 打印出了选中的时间,是个数组
  }
}

到这,问题圆满解决了!

以上这篇vant 时间选择器--开始时间和结束时间实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery下通过replace字符串替换实现大小图片切换
May 22 Javascript
解析js如何获取当前url中的参数值并复制给input
Jun 23 Javascript
通过正则表达式实现表单验证是否为中文
Feb 18 Javascript
jquery中checkbox使用方法简单实例演示
Nov 24 Javascript
由简入繁实现Jquery树状结构的方法(推荐)
Jun 10 Javascript
Vue调试神器vue-devtools安装方法
Dec 12 Javascript
layui点击按钮添加可编辑的一行方法
Aug 15 Javascript
vue webpack重写cookie路径的方法
Jul 10 Javascript
微信小程序跳转到其他网页(外部链接)的实现方法
Sep 20 Javascript
JS控制下拉列表左右选择实例代码
May 08 Javascript
微信小程序实现导航栏和内容上下联动功能代码
Jun 29 Javascript
JS removeAttribute()方法实现删除元素的某个属性
Jan 11 Javascript
Vue绑定用户接口实现代码示例
Nov 04 #Javascript
vant picker+popup 自定义三级联动案例
Nov 04 #Javascript
解决vue-pdf查看pdf文件及打印乱码的问题
Nov 04 #Javascript
vantUI 获得piker选中值的自定义ID操作
Nov 04 #Javascript
浅谈vant组件Picker 选择器选单选问题
Nov 04 #Javascript
vue项目打包后请求地址错误/打包后跨域操作
Nov 04 #Javascript
原生JavaScript实现贪吃蛇游戏
Nov 04 #Javascript
You might like
从零开始学YII2框架(五)快速生成代码工具 Gii 的使用
2014/08/20 PHP
php常用字符串处理函数实例分析
2014/11/22 PHP
php实现汉字验证码和算式验证码的方法
2015/03/07 PHP
php头像上传预览实例代码
2017/05/02 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
PHP chr()函数讲解
2019/02/11 PHP
PHP设计模式之抽象工厂模式实例分析
2019/03/25 PHP
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
基于JavaScript实现文字超出部分隐藏
2016/02/29 Javascript
Node.js实现数据推送
2016/04/14 Javascript
nodejs中向HTTP响应传送进程的输出
2017/03/19 NodeJs
微信小程序实现多选删除列表数据功能示例
2019/01/15 Javascript
微信小程序实现上传word、txt、Excel、PPT等文件功能
2019/05/23 Javascript
使用typescript构建Vue应用的实现
2019/08/26 Javascript
JavaScript实现无限轮播效果
2020/11/19 Javascript
多版本Python共存的配置方法
2017/05/22 Python
对numpy中数组元素的统一赋值实例
2018/04/04 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
浅析python redis的连接及相关操作
2019/11/07 Python
python3实现绘制二维点图
2019/12/04 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
python实现引用其他路径包里面的模块
2020/03/09 Python
基于Python3读写INI配置文件过程解析
2020/07/23 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
web页面录屏实现
2019/02/12 HTML / CSS
localStorage、sessionStorage使用总结
2017/11/17 HTML / CSS
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
C语言笔试题回忆
2015/04/02 面试题
仓库班组长岗位职责
2013/12/12 职场文书
体育馆的标语
2014/06/24 职场文书
中专毕业生的自荐书
2014/07/01 职场文书
保险公司演讲稿
2014/09/02 职场文书
2015年秋季运动会前导词
2015/07/20 职场文书
2016学校先进党组织事迹材料
2016/02/29 职场文书
提取视频中的音频 Python只需要三行代码!
2021/05/10 Python