vue组件 时间过滤

效果图:👇
时间过滤组件.png

可以动态设置默认时间、el-picker的size、label。查询按钮是父组件中的,它们都在el-form中。因为最近做的项目用el-form比较多,也可以不在哈哈哈哈哈哈

组件中一定需要默认值的,我把它写成一个公共、获取时间的方法,别的地方用时也很方便~
utils文件夹中的utils.js内容 ↓

// 获取时间
export function getTime() {
    // 时间戳 ---- 三天前、一周前
    let stamp3 = new Date().getTime() - 24 * 3600 * 1000 * 3;
    let stamp7 = new Date().getTime() - 24 * 3600 * 1000 * 7;

    let year1 = new Date().getFullYear();
    let month = new Date().getMonth();
    let month1 = new Date().getMonth() + 1;
    let day1 = new Date().getDate();

    let year3 = new Date(stamp3).getFullYear();
    let month3 = new Date(stamp3).getMonth() + 1;
    let day3 = new Date(stamp3).getDate();

    let year7 = new Date(stamp7).getFullYear();
    let month7 = new Date(stamp7).getMonth() + 1;
    let day7 = new Date(stamp7).getDate();
    // 这块儿一定有更好用的方法。。可是我不会。。。。用了同一个函数
    month1 = addZero(month1);
    day1 = addZero(day1);
    month3 = addZero(month3);
    day3 = addZero(day3);
    month7 = addZero(month7);
    day7 = addZero(day7);
    // 当天
    let currentDay = `${year1}-${month1}-${day1}`;
    // 三天前
    let threeDaysAgo = `${year3}-${month3}-${day3}`;
    // 一周前
    let sevenDaysAgo = `${year7}-${month7}-${day7}`;
    // 一个月前
    let oneMonthAgo = `${year1}-${month}-${day1}`;

    return {
        currentDay,
        threeDaysAgo,
        sevenDaysAgo,
        oneMonthAgo
    }
}
// 补零儿
export function addZero(value) {
    if (value <= 9) {
        return `0${value}`
    } else {
        return value;
    }
}

timeFilter.vue内容 ↓

<template>
  <div class="container-timefilter">
        <!-- pickerLabel为动态label。。。。 -->
        <span class="title-label">{{pickerLabel}}</span>
        <el-date-picker
          v-model="startTime"
          placeholder="开始日期"
          format="yyyy-MM-dd"
          value-format="yyyy-MM-dd"
          :size="size"
          @change="onChangeStart"
          :picker-options="pickerOptions"
        ></el-date-picker>
        -
        <el-date-picker
          v-model="endTime"
          placeholder="结束日期"
          format="yyyy-MM-dd"
          value-format="yyyy-MM-dd"
          :size="size"
          @change="onChangeEnd"
          :picker-options="pickerOptions"
        ></el-date-picker>
        <!-- change是picker框的值发生改变时触发的方法 -->
  </div>
</template>

<script>
// 这是一个获取时间的方法  当天日期,三天前日期,一周前日期,一个月前日期
import {getTime} from "@/utils/utils";

export default {
  props: {
    startTime: {
      type: String,
      default: getTime().threeDaysAgo
    },
    endTime: {
      type: String,
      default: getTime().currentDay
    },
    pickerLabel: {
      type: String,
      default: "日期:"
    },
    size: {
      type: String,
      default: "mini"
    },
    // 这俩是picker的设置,将当天后的日期设置为禁用
    pickerOptions: {}
  },
  methods: {
    // 下面俩方法差不多意思,即,起始日期不得晚于结束日期
    onChangeStart(e) {
      let startTimeStamp = new Date(e).getTime();
      let endTimeStamp = new Date(this.endTime).getTime()
      if(startTimeStamp > endTimeStamp) {
        this.$message("起始日期不得晚于结束日期")
      }
      // 在picker内的值发生改变时,需要用到组件通信中,子传父的方法。
      // 具体方法看官网。。我可说不清哈哈哈哈哈哈
      this.$emit("start",e)
    },
    onChangeEnd(e) {
      let startTimeStamp = new Date(this.startTime).getTime();
      let endTimeStamp = new Date(e).getTime();
      if(startTimeStamp > endTimeStamp) {
        this.$message("结束日期不得早于起始日期");
      }
      this.$emit("end",e)
    }
  },
};
</script>

<style lang="scss" scoped>
.el-input {
    width: 140px;
}
// label的样式设置,与elementui的label字体设置为一样的
.title-label {
  color: #606266;
  font-size: 14px;
  font-weight: bold;
}
</style>

父组件.vue ↓

<template>
  <div class="container">
    <el-form inline size="mini">
      <el-form-item>
        <time-filter
          :pickerOptions="pickerOptions"
          :startTime="startTime"
          :endTime="endTime"
          @start="changeStart"
          @end="changeEnd"
        />
      </el-form-item>
      <el-form-item>
        <el-button @click="handleFilter" type="primary">查询</el-button>
      </el-form-item>
    </el-form>

  </div>
</template>

<script>
import TimeFilter from "@/components/TimeFilter";
import { getTime } from "@/utils/utils";

export default {
  components: {
    TimeFilter,
  },
  data() {
    return {
      pickerOptions: {
        disabledDate(time) {
          return time.getTime() > Date.now();
        },
      },
      startTime: getTime().oneMonthAgo,
      endTime: getTime().currentDay,
    };
  },
  methods: {
    handleFilter() {
      if (
        new Date(this.startTime).getTime() > new Date(this.endTime).getTime()
      ) {
        this.$message("结束日期不得早于起始日期");
        return;
      }

      console.log(this.startTime,"startTime");
      console.log(this.endTime,"endTime")
    },
    //   timeFilter
    changeStart(v) {
      this.startTime = v;
    },
    changeEnd(v) {
      this.endTime = v;
    },
  },
};
</script>

<style lang="scss" scoped>
.container {
  padding: 20px;
}
</style>

组件通信太烦了(哭。。。。)
爸特感觉一个时间检索搞完好像思路清晰了很多。冒昧总结一下大概就是 👇
父中用    :名称1        @名称2    
子中用    props接名称1    this.$emit("名称2",value)

emmm写得有亿点点乱。。。。我脑子是清楚的哈哈哈哈哈哈哈哈哈哈哈哈吧?

tada~一个时间过滤的组件就完成啦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容