FamilyMemberStrip.vue 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <template>
  2. <view class="family-member-strip" v-if="members && members.length > 0">
  3. <scroll-view
  4. class="strip-scroll"
  5. scroll-x
  6. :scroll-with-animation="true"
  7. :enhanced="true"
  8. show-scrollbar="false"
  9. v-if="members.length >= 4"
  10. >
  11. <view class="strip-inner scroll-mode">
  12. <FamilyMemberCard
  13. v-for="member in members"
  14. :key="member.id"
  15. :member="member"
  16. :isSelected="member.id === selectedMemberId"
  17. :energyScore="getMemberEnergy(member)"
  18. @select="onSelect"
  19. />
  20. </view>
  21. </scroll-view>
  22. <view class="strip-inner center-mode" v-else>
  23. <FamilyMemberCard
  24. v-for="member in members"
  25. :key="member.id"
  26. :member="member"
  27. :isSelected="member.id === selectedMemberId"
  28. :energyScore="getMemberEnergy(member)"
  29. @select="onSelect"
  30. />
  31. </view>
  32. </view>
  33. </template>
  34. <script>
  35. import FamilyMemberCard from '@/components/FamilyMemberCard'
  36. export default {
  37. components: { FamilyMemberCard },
  38. props: {
  39. members: { type: Array, default: function() { return [] } },
  40. selectedMemberId: { type: Number, default: null },
  41. energyMap: { type: Object, default: function() { return {} } }
  42. },
  43. methods: {
  44. onSelect: function(member) {
  45. this.$emit('select', member)
  46. },
  47. getMemberEnergy: function(member) {
  48. if (!member || !this.energyMap) return null
  49. return this.energyMap[member.id] || this.energyMap[member.memberId] || null
  50. }
  51. }
  52. }
  53. </script>
  54. <style scoped>
  55. .family-member-strip {
  56. margin: 16rpx 0;
  57. padding: 0 30rpx;
  58. }
  59. .strip-scroll {
  60. width: 100%;
  61. white-space: nowrap;
  62. }
  63. .strip-inner {
  64. display: flex;
  65. flex-direction: row;
  66. }
  67. .strip-inner.scroll-mode {
  68. gap: 16rpx;
  69. }
  70. .strip-inner.center-mode {
  71. justify-content: center;
  72. gap: 24rpx;
  73. flex-wrap: wrap;
  74. }
  75. /* scroll-view 内的 FamilyMemberCard 需要 display: inline-flex 支持横向滚动 */
  76. .strip-scroll .strip-inner.scroll-mode {
  77. display: inline-flex;
  78. }
  79. </style>