index.vue 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <template>
  2. <view class="yd-page-container">
  3. <!-- 顶部导航栏 -->
  4. <wd-navbar
  5. title="常见问题"
  6. left-arrow
  7. placeholder
  8. safe-area-inset-top
  9. fixed
  10. @click-left="handleBack"
  11. />
  12. <!-- 搜索框 -->
  13. <wd-search
  14. v-model="searchValue"
  15. placeholder="请输入你想咨询的问题"
  16. placeholder-left
  17. hide-cancel
  18. light
  19. />
  20. <!-- FAQ Tabs -->
  21. <wd-tabs v-model="activeTab" auto-line-width>
  22. <wd-tab
  23. v-for="(category, index) in faqList"
  24. :key="index"
  25. :title="category.title"
  26. :name="index"
  27. >
  28. <view class="min-h-[calc(100vh-300rpx)] bg-white">
  29. <wd-collapse v-model="activeNames" custom-class="faq-collapse">
  30. <wd-collapse-item
  31. v-for="(item, idx) in filteredList(category.childList)"
  32. :key="idx"
  33. :name="`${index}-${idx}`"
  34. >
  35. <template #title>
  36. <view class="flex items-center">
  37. <wd-icon name="edit-outline" size="18px" color="#1890ff" class="mr-16rpx" />
  38. <text>{{ item.title }}</text>
  39. </view>
  40. </template>
  41. <view class="text-28rpx text-gray-500 leading-relaxed">
  42. {{ item.content }}
  43. </view>
  44. </wd-collapse-item>
  45. </wd-collapse>
  46. </view>
  47. </wd-tab>
  48. </wd-tabs>
  49. </view>
  50. </template>
  51. <script lang="ts" setup>
  52. import type { FaqItem } from './data'
  53. import { ref } from 'vue'
  54. import { navigateBackPlus } from '@/utils'
  55. import { faqList } from './data'
  56. definePage({
  57. style: {
  58. navigationBarTitleText: '',
  59. navigationStyle: 'custom',
  60. },
  61. })
  62. const activeTab = ref<number>(0) // 当前选中的 Tab
  63. const searchValue = ref('') // 搜索关键词
  64. const activeNames = ref<string[]>([]) // 展开的问题
  65. /** 过滤问题列表 */
  66. function filteredList(list: FaqItem[]) {
  67. if (!searchValue.value) {
  68. return list
  69. }
  70. return list.filter(item =>
  71. item.title.includes(searchValue.value) || item.content.includes(searchValue.value),
  72. )
  73. }
  74. /** 返回上一页 */
  75. function handleBack() {
  76. navigateBackPlus('/pages/user/index')
  77. }
  78. </script>
  79. <style lang="scss" scoped>
  80. :deep(.faq-collapse) {
  81. background: #fff;
  82. .wd-collapse-item__header {
  83. padding: 24rpx;
  84. }
  85. .wd-collapse-item__wrapper {
  86. background: #f9fafb;
  87. }
  88. }
  89. </style>