TaskItem.vue 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. <template>
  2. <view class="task-item" @click="handleClick">
  3. <view class="task-item-left">
  4. <text class="task-item-name">{{ task.title }}</text>
  5. <text class="task-item-deadline" v-if="task.deadline">⏰ {{ task.deadline }}</text>
  6. </view>
  7. <view class="task-item-right">
  8. <text class="task-item-points" v-if="task.points">+{{ task.points }}⭐</text>
  9. <text class="task-item-action" @click.stop="handleAction">去完成</text>
  10. </view>
  11. </view>
  12. </template>
  13. <script>
  14. export default {
  15. props: {
  16. task: { type: Object, required: true }
  17. },
  18. methods: {
  19. handleClick() {
  20. this.$emit('click', this.task)
  21. },
  22. handleAction() {
  23. this.$emit('action', this.task)
  24. }
  25. }
  26. }
  27. </script>
  28. <style scoped>
  29. .task-item {
  30. display: flex;
  31. justify-content: space-between;
  32. align-items: center;
  33. padding: 20rpx 0;
  34. border-bottom: 1rpx solid #f0f0f0;
  35. }
  36. .task-item:last-child { border-bottom: none; }
  37. .task-item-left { flex: 1; min-width: 0; }
  38. .task-item-name { font-size: 26rpx; color: #333; display: block; }
  39. .task-item-deadline { font-size: 22rpx; color: #999; margin-top: 4rpx; display: block; }
  40. .task-item-right {
  41. display: flex;
  42. align-items: center;
  43. gap: 16rpx;
  44. margin-left: 16rpx;
  45. flex-shrink: 0;
  46. }
  47. .task-item-points { font-size: 24rpx; font-weight: 600; color: #F97316; }
  48. .task-item-action {
  49. font-size: 24rpx;
  50. color: #5B9BD5;
  51. padding: 8rpx 16rpx;
  52. border: 2rpx solid #5B9BD5;
  53. border-radius: 20rpx;
  54. }
  55. </style>