FamilyMemberStrip.vue 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. @select="onSelect"
  18. />
  19. </view>
  20. </scroll-view>
  21. <view class="strip-inner center-mode" v-else>
  22. <FamilyMemberCard
  23. v-for="member in members"
  24. :key="member.id"
  25. :member="member"
  26. :isSelected="member.id === selectedMemberId"
  27. @select="onSelect"
  28. />
  29. </view>
  30. </view>
  31. </template>
  32. <script>
  33. import FamilyMemberCard from '@/components/FamilyMemberCard'
  34. export default {
  35. components: { FamilyMemberCard },
  36. props: {
  37. members: { type: Array, default: function() { return [] } },
  38. selectedMemberId: { type: Number, default: null }
  39. },
  40. methods: {
  41. onSelect: function(member) {
  42. this.$emit('select', member)
  43. }
  44. }
  45. }
  46. </script>
  47. <style scoped>
  48. .family-member-strip {
  49. margin: 16rpx 0;
  50. padding: 0 30rpx;
  51. }
  52. .strip-scroll {
  53. width: 100%;
  54. white-space: nowrap;
  55. }
  56. .strip-inner {
  57. display: flex;
  58. flex-direction: row;
  59. }
  60. .strip-inner.scroll-mode {
  61. gap: 16rpx;
  62. }
  63. .strip-inner.center-mode {
  64. justify-content: center;
  65. gap: 24rpx;
  66. flex-wrap: wrap;
  67. }
  68. /* scroll-view 内的 FamilyMemberCard 需要 display: inline-flex 支持横向滚动 */
  69. .strip-scroll .strip-inner.scroll-mode {
  70. display: inline-flex;
  71. }
  72. </style>