Timeline 时间线自定义节点为Checkbox

需求:实现一个全选、单选功能

效果图:

代码:

<template>
  <div class="demo-box">
    <el-checkbox v-model="checkAll" @change="handleCheckAllChange">全选
    </el-checkbox>
    <el-timeline>
      <el-timeline-item timestamp="" placement="top" v-for="(item,index) in activities" :key="index">
        <template #dot>
          <el-checkbox v-model="item.checked" :checked="true" :value="item.id" @change="checkOne"/>
        </template>
        <div>
          <div class="time-tag">
            <div>
              <span>{{ item.timestamp }}</span>
            </div>
          </div>
          <div class="reason-detail">
            {{ item.content }}
          </div>
        </div>
      </el-timeline-item>
    </el-timeline>
  </div>
</template>
<script setup>
import {ref, onMounted, computed} from 'vue';

const checkAll = computed(() => {
  if (activities.value.length > 0) {
    let boolArr = []
    for (let item of activities.value) {
      boolArr.push(item.checked)
    }
    return !boolArr.includes(false)
  } else {
    return false
  }
})
//选中的数据
const checkedList = ref([])
//模拟接口数据
const activities = ref([
  {
    content: 'Custom icon',
    timestamp: '2018-04-12 20:46',
    size: 'large',
    type: 'primary',
  },
  {
    content: 'Custom color',
    timestamp: '2018-04-03 20:46',
    color: '#0bbd87',
  },
  {
    content: 'Custom size',
    timestamp: '2018-04-03 20:46',
    size: 'large',
  },
  {
    content: 'Custom hollow',
    timestamp: '2018-04-03 20:46',
    type: 'primary',
    hollow: true,
  },
  {
    content: 'Default node',
    timestamp: '2018-04-03 20:46',
  },
])

const getData = () => {
  //实际上在这请求接口获取数据,获取到activities时进行下一步
  //。。。。。。。。。。。。。。

  //将获取到的数据每一项添加一个checked属性
  for (let item of activities.value) {
    item.checked = false
  }
}

//全选
const handleCheckAllChange = (val) => {
  for (let item of activities.value) {
    item.checked = val
  }
  if (val) {
    for (let item of activities.value) {
      checkedList.value.push(item)
    }
  } else {
    checkedList.value = []
  }

  console.log(checkedList.value)
}

//单选
const checkOne = () => {
  checkedList.value = []
  for (let item of activities.value) {
    if (item.checked) {
      checkedList.value.push(item)
    }
  }
  console.log(checkedList.value)
}

onMounted(() => {
  getData()
})

</script>
<style scoped lang="less">
::v-deep(.el-timeline-item__tail) {
  left: 6px;
  margin-top: 10px;
}

::v-deep(.el-timeline-item__timestamp.is-top) {
  margin-bottom: 3px;
}
</style>

注意事项:

1、全选checkbox绑定的值不能写死,要通过计算属性操作activities的checked属性来判断

2、要特别修改el-timeline的样式,否则竖线会对不齐

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值