zoukankan      html  css  js  c++  java
  • Vue组件--时间下拉框(年和月分开)

    可以传入nowdata(当前显示的时间),mindata(最早时间),maxdata(最晚时间),如果不传,默认显示 ‘请选择’ ,最早时间为1970年01月,最晚为2099年12月。

    其中传入的格式必须为字符串形式的年+月,当月份小于10时,需要前面添加0,如‘201701’。

    当月份选择框改变时会传给父组件一个 timechange事件,参数为年+月,如‘201711’。

    使用方法:

    <spread-yearmonth :nowdata="nowdata" :mindata="mindata" :maxdata="maxdata" @timechange="changeTime"></spread-yearmonth>

    组件具体代码:

      1 /**
      2  * Created by Administrator on 2017/11/21.
      3  */
      4 var temp =
      5     "<div>" +
      6         "<select v-model='yearContent.year' @change='yearChange'>" +
      7             "<option value=''>请选择</option>" +
      8             "<option v-for='n in yearContent.yearData' :value='n'>{{n}}</option>" +
      9         "</select>" +
     10         "<span>年</span>" +
     11         "<select v-model='monthContent.month' @change='monthChange'>" +
     12             "<option value=''>请选择</option>" +
     13             "<option v-for='m in monthContent.monthData' :value='m'>{{m}}</option>" +
     14         "</select>" +
     15         "<span>月</span>" +
     16     "</div>";
     17 Vue.component('spread-yearmonth',{
     18     props: ['nowdata','mindata','maxdata'],
     19     template: temp,
     20     data: function () {
     21         return {
     22             yearContent: {
     23                 year: '',
     24                 yearData: [],
     25                 min_year: '',
     26                 max_year: ''
     27             },
     28             monthContent: {
     29                 month: '',
     30                 monthData: [],
     31                 min_month: '',
     32                 max_month: ''
     33             },
     34             static: {
     35                 isFirst: true
     36             }
     37         }
     38     },
     39     created: function () {
     40         var vm = this;
     41 
     42         vm.yearContent.min_year = !!vm.mindata ? vm.sliceData(vm.mindata).year : 1970 ;
     43         vm.monthContent.min_month = !!vm.mindata ? vm.sliceData(vm.mindata).month : 1 ;
     44 
     45         vm.yearContent.max_year = !!vm.maxdata ? vm.sliceData(vm.maxdata).year : 2099 ;
     46         vm.monthContent.max_month = !!vm.maxdata ? vm.sliceData(vm.maxdata).month : 12 ;
     47 
     48         vm.yearContent.year = !!vm.nowdata ? vm.sliceData(vm.nowdata).year : '' ;
     49         vm.monthContent.month = !!vm.nowdata ? vm.sliceData(vm.nowdata).month : '' ;
     50 
     51 
     52         if (vm.yearContent.min_year > vm.yearContent.max_year || (vm.yearContent.min_year == vm.yearContent.max_year && vm.monthContent.min_month > vm.monthContent.max_month)){
     53             alert('最早时间不得晚于最晚时间');
     54             return;
     55         }
     56 
     57         if (!!vm.nowdata && Number(vm.nowdata) < Number(vm.yearContent.min_year+''+vm.monthContent.min_month) || Number(vm.nowdata) > Number(vm.yearContent.max_year+''+vm.monthContent.max_month)){
     58             alert('当前时间不在可显示时间的区间内');
     59             vm.yearContent.year = '';
     60             vm.monthContent.month = '';
     61             return;
     62         }
     63 
     64         for (var i = 0 ; i <= vm.yearContent.max_year - vm.yearContent.min_year ; i++){
     65             vm.yearContent.yearData.push(Number(vm.yearContent.min_year) + i);
     66         }
     67 
     68         if (vm.monthContent.month){
     69             vm.yearChange();
     70         }
     71 
     72 
     73 
     74     },
     75     methods: {
     76         sliceData: function (data) {
     77             if (data && data.length == 6){
     78                 var year = data.slice(0,4);
     79                 var month = data.slice(4);
     80                 return {year: year, month: month};
     81             }
     82         },
     83         yearChange: function () {
     84             var vm = this;
     85 
     86             vm.monthContent.monthData = [];
     87 
     88             if (!vm.static.isFirst){
     89                 vm.monthContent.month = '';
     90             }
     91             vm.static.isFirst = false;
     92 
     93             var min = vm.yearContent.year == vm.yearContent.min_year ? vm.monthContent.min_month : 1;
     94             var max = vm.yearContent.year == vm.yearContent.max_year ? vm.monthContent.max_month : 12;
     95             for (var i = 0 ; i <= max - min ; i++){
     96                 vm.monthContent.monthData.push(Number(min) + i < 10 ? '0' + (Number(min) + i) : Number(min) + i);
     97             }
     98 
     99         },
    100         monthChange: function () {
    101             var vm = this;
    102             vm.$emit('timechange',vm.yearContent.year + '' + vm.monthContent.month);
    103         }
    104     }
    105 });

    使用的页面代码为:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3 <head>
     4     <meta charset="UTF-8">
     5     <title>Title</title>
     6 </head>
     7 <body>
     8     <div id="app">
     9         <spread-yearmonth :nowdata="nowdata" :mindata="mindata" :maxdata="maxdata" @timechange="changeTime"></spread-yearmonth>
    10     </div>
    11 </body>
    12 </html>
    13 <script src="js/vue.js"></script>
    14 <script src="js/yearMonth.js"></script>
    15 <script>
    16     new Vue({
    17         el: "#app",
    18         data: {
    19             nowdata: '',
    20             mindata: '',
    21             maxdata: ''
    22         },
    23         created: function () {
    24             var vm = this;
    25             var d = new Date(),
    26                 y = d.getFullYear(),
    27                 m = d.getMonth() + 1;
    28             vm.nowdata = y + '' + m;
    29         },
    30         methods: {
    31             changeTime: function (time) {
    32                 console.log(time);
    33             }
    34         }
    35     })
    36 </script>

    最终页面效果为:

  • 相关阅读:
    NOIP201208同余方程
    NOIP模拟赛 最佳组合
    NOIP模拟赛 拓展
    CF1253E Antenna Coverage(DP)
    LOJ6033「雅礼集训 2017 Day2」棋盘游戏 (博弈论,二分图,匈牙利算法)
    CF582E Boolean Function(DP,状态压缩,FMT)
    CF750G New Year and Binary Tree Paths(DP)
    Codeforces Round 596 题解
    AGC008E Next or Nextnext(组合计数,神奇思路)
    ARC082E ConvexScore(神奇思路)
  • 原文地址:https://www.cnblogs.com/liyuly/p/7884698.html
Copyright © 2011-2022 走看看