vue+iview实现日历日期选择(多月份多选)

文章展示了一个使用Vue.js框架构建的日期选择组件,该组件允许用户在多个月份中选择特定日期。组件包括一个Modal对话框,内含Tabs控件,每个Tab代表一个月,用户可以通过点击日期卡片来选择或取消选择日期。选定的日期会存储在一个数组中,供后续处理使用。
摘要由CSDN通过智能技术生成

需求分析

选择本年某月某天(可多选不同月份,不同日期)

实现效果

在这里插入图片描述
在这里插入图片描述

HTML代码

<Modal
      v-model="showYearTaskTime"
      :mask-closable="false"
      title="生成任务日期"
      @on-ok="exportYearData"
      width="900"
      @on-cancel="cancelAddPeopleCard"
    >
      <div class="selectTitle">选择日期(月)</div>
      <Tabs v-model="tabName" @on-click="changeNum">
        <TabPane
          v-for="(item, index) in tabDatas"
          :label="item.label"
          :name="item.name"
          :key="index"
        >
          <div class="addPeopleCardStyle">
            <div
              @click="chooseTemplate(index, item)"
              class="onePeopleCard"
              v-for="(item, index) in yearMonthTaskTime"
              :key="index"
              :class="{ clickOnePeopleCard: selectedYear.indexOf(item.value) != -1 }"
            >
              {{ item.label }}
            </div>
          </div>
        </TabPane>
  </Tabs>
</Modal>

JS代码

showYearTaskTime: false,
      tabDatas: [
        {
          label: '1月',
          name: '01',
        },
        {
          label: '2月',
          name: '02',
        },
        {
          label: '3月',
          name: '003',
        },
        {
          label: '4月',
          name: '04',
        },
        {
          label: '5月',
          name: '05',
        },
        {
          label: '6月',
          name: '06',
        },
        {
          label: '7月',
          name: '07',
        },
        {
          label: '8月',
          name: '08',
        },
        {
          label: '9月',
          name: '09',
        },
        {
          label: '10月',
          name: '10',
        },
        {
          label: '11月',
          name: '11',
        },
        {
          label: '12月',
          name: '12',
        },
      ],
tabName: '01',
yearMonthTaskTime: [],
setYearList: [],
yearTaskDate: [],
selectedYear: [],
//弹框
getYearTaskTime() {
      this.showYearTaskTime = true
      this.selectedYear = []
      this.form.taskDate = ''
},
//切换tab获取当月日期
changeNum() {
      this.getDaysInMonth(this.tabName)
},
//获取本月日期
getDaysInMonth(month) {
      var date = new Date()
      var year = date.getFullYear()
      month = parseInt(month, 10)
      var temp = new Date(year, month, 0)
      let n = +temp.getDate()
      let dataTimes = []
      for (var i = 1; i < n + 1; i++) {
        const m = month < 10 ? '0' + month : month
        const d = i < 10 ? '0' + i : i
        dataTimes.push({
          value: m + '-' + d,
          label: i,
        })
      }
      this.yearMonthTaskTime = dataTimes
},
//选择日期
chooseTemplate(index, item) {
      if (this.selectedYear.indexOf(item.value) !== -1) {
        // 匹配到数据, 取消
        this.selectedYear.splice(this.selectedYear.indexOf(item.value), 1)
      } else {
        // 匹配不到, 添加到数组中
        this.selectedYear.push(item.value)
      }
},
//根据接口接收数据类型处理数据(按需)
exportYearData() {
      this.form.taskDate = this.selectedYear.toString()
},

CSS代码

.addPeopleCardStyle {
  width: 100%;
  display: flex;
  flex-wrap: wrap;
}
.onePeopleCard {
  width: 76px;
  height: 32px;
  line-height: 30px;
  text-align: center;
  background-color: #ffffff;
  border-radius: 5px;
  color: #17181d;
  font-size: 0.14rem;
  border: 1px solid #dcdcdc;
  opacity: 1;
  border-radius: 4px;
  margin-bottom: 10px;
  margin-left: 10px;
}
.onePeopleCard:hover {
  cursor: pointer;
}
.clickOnePeopleCard {
  width: 76px;
  height: 32px;
  line-height: 30px;
  text-align: center;
  background: rgba(18, 141, 255, 0.1);
  border: 1px solid #128dff;
  border-radius: 5px;
  color: #128dff;
  font-size: 0.14rem;
  margin-bottom: 10px;
  margin-left: 10px;
  opacity: 1;
  border-radius: 4px;
}
.clickOnePeopleCard:hover {
  cursor: pointer;
}``

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过在子组件的表格列定义中使用`scoped-slot`来自定义渲染日期选择器,然后在父组件中传递一个日期选择器的`props`给子组件,在子组件中使用该`props`来控制日期选择器的显示和隐藏。 以下是一个简单的示例代码: 在父组件中: ``` <template> <div> <DatePicker v-model="selectedDate" /> <Table :data="tableData"> <Table-column prop="name" label="姓名" /> <Table-column prop="age" label="年龄" /> <Table-column label="生日"> <template slot-scope="{row}"> <Date-Picker v-show="row.showDatePicker" v-model="row.birthday" type="date" @on-ok="hideDatePicker(row)" /> <div v-else @click="showDatePicker(row)">{{ row.birthday }}</div> </template> </Table-column> </Table> </div> </template> <script> import { DatePicker, Table } from "iview"; export default { components: { DatePicker, Table }, data() { return { selectedDate: null, tableData: [ { name: "张三", age: 20, birthday: "1999-01-01", showDatePicker: false }, { name: "李四", age: 22, birthday: "1997-06-15", showDatePicker: false }, { name: "王五", age: 25, birthday: "1994-11-30", showDatePicker: false } ] }; }, methods: { showDatePicker(row) { row.showDatePicker = true; }, hideDatePicker(row) { row.showDatePicker = false; } } }; </script> ``` 在子组件中: ``` <template> <div> <Table :data="tableData"> <Table-column prop="name" label="姓名" /> <Table-column label="生日"> <template slot-scope="{row}"> <Date-Picker v-model="row.birthday" type="date" /> </template> </Table-column> </Table> </div> </template> <script> import { DatePicker, Table } from "iview"; export default { components: { DatePicker, Table }, props: { datePickerProps: Object }, data() { return { tableData: [ { name: "张三", birthday: "1999-01-01" }, { name: "李四", birthday: "1997-06-15" }, { name: "王五", birthday: "1994-11-30" } ] }; } }; </script> ``` 在父组件中使用子组件时,传递日期选择器的`props`: ``` <template> <div> <DatePicker v-model="selectedDate" /> <ChildComponent :datePickerProps="datePickerProps" /> </div> </template> <script> import ChildComponent from "./components/ChildComponent.vue"; export default { components: { ChildComponent }, data() { return { selectedDate: null, datePickerProps: { type: "date" } }; } }; </script> ``` 这样就可以在子组件的表格列中渲染日期选择器,并且可以根据`props`来控制日期选择器的显示和隐藏了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值