hookehuyr

feat(pages): 资料列表页支持动态标题

- 跳转时传递列表项的 title 作为页面标题参数
- material-list 页面接收 title 参数并动态设置页面标题
- 标题默认值为"资料列表",保持向后兼容

技术实现:
- 在跳转时传递 categoryId 和 title 两个参数
- 使用响应式变量 pageTitle 动态更新 NavHeader 组件
- 在 useLoad 中优先处理 title 参数

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
...@@ -98,12 +98,15 @@ const FAMILY_OFFICE_SECTIONS = [ ...@@ -98,12 +98,15 @@ const FAMILY_OFFICE_SECTIONS = [
98 /** 98 /**
99 * 处理项目点击事件 99 * 处理项目点击事件
100 * 100 *
101 - * @description 点击列表项时跳转到资料列表页,并带上分类 ID 101 + * @description 点击列表项时跳转到资料列表页,并带上分类 ID 和标题
102 * @param {Object} item - 被点击的项目数据 102 * @param {Object} item - 被点击的项目数据
103 * @param {Function} go - 导航函数 103 * @param {Function} go - 导航函数
104 */ 104 */
105 const handleItemClickWithNav = (item, go) => { 105 const handleItemClickWithNav = (item, go) => {
106 - go('/pages/material-list/index', { categoryId: item.id }) 106 + go('/pages/material-list/index', {
107 + categoryId: item.id,
108 + title: item.title
109 + })
107 } 110 }
108 111
109 // 使用 useSectionList composable 管理列表数据,传入自定义点击处理 112 // 使用 useSectionList composable 管理列表数据,传入自定义点击处理
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
5 <template> 5 <template>
6 <div class="min-h-screen bg-[#F9FAFB] pb-[calc(160rpx+env(safe-area-inset-bottom))]"> 6 <div class="min-h-screen bg-[#F9FAFB] pb-[calc(160rpx+env(safe-area-inset-bottom))]">
7 <!-- Navigation Header --> 7 <!-- Navigation Header -->
8 - <NavHeader title="资料列表" /> 8 + <NavHeader :title="pageTitle" />
9 9
10 <!-- Search Bar --> 10 <!-- Search Bar -->
11 <div class="px-[32rpx] mt-[32rpx]"> 11 <div class="px-[32rpx] mt-[32rpx]">
...@@ -90,7 +90,7 @@ ...@@ -90,7 +90,7 @@
90 </template> 90 </template>
91 91
92 <script setup> 92 <script setup>
93 -import { ref } from 'vue' 93 +import { ref, computed } from 'vue'
94 import { useLoad } from '@tarojs/taro' 94 import { useLoad } from '@tarojs/taro'
95 import NavHeader from '@/components/NavHeader.vue' 95 import NavHeader from '@/components/NavHeader.vue'
96 import TabBar from '@/components/TabBar.vue' 96 import TabBar from '@/components/TabBar.vue'
...@@ -102,13 +102,35 @@ import Taro from '@tarojs/taro' ...@@ -102,13 +102,35 @@ import Taro from '@tarojs/taro'
102 102
103 const searchValue = ref('') 103 const searchValue = ref('')
104 const categoryId = ref('') 104 const categoryId = ref('')
105 +const activeCategoryIndex = ref(0)
106 +
107 +/**
108 + * 页面标题
109 + *
110 + * @description 动态标题,根据传入的 title 参数显示,默认为"资料列表"
111 + */
112 +const pageTitle = ref('资料列表')
113 +
114 +/**
115 + * 资料分类数据
116 + *
117 + * @description Mock 分类数据,用于展示 tab 筛选功能
118 + * TODO: 后续从 API 接口获取,如果接口返回空数组则不显示 tab
119 + */
120 +const categories = ref([
121 + { id: '', name: '全部资料' },
122 + { id: 'exam', name: '考试资料' },
123 + { id: 'product', name: '产品手册' },
124 + { id: 'training', name: '培训材料' },
125 + { id: 'case', name: '案例分享' },
126 +])
105 127
106 /** 128 /**
107 * 资料列表数据 129 * 资料列表数据
108 * 130 *
109 * @description 包含文件信息、图标、收藏状态等完整资料信息 131 * @description 包含文件信息、图标、收藏状态等完整资料信息
110 */ 132 */
111 -const list = ref([ 133 +const allList = ref([
112 { 134 {
113 title: '2024年保险代理人考试大纲.pdf', 135 title: '2024年保险代理人考试大纲.pdf',
114 desc: '最新考试范围与重点解析', 136 desc: '最新考试范围与重点解析',
...@@ -212,6 +234,25 @@ const list = ref([ ...@@ -212,6 +234,25 @@ const list = ref([
212 ]) 234 ])
213 235
214 /** 236 /**
237 + * 根据选中的分类筛选资料列表
238 + *
239 + * @description 根据 activeCategoryIndex 筛选显示对应分类的资料
240 + */
241 +const list = computed(() => {
242 + const activeCategory = categories.value[activeCategoryIndex.value]
243 +
244 + // 如果是"全部资料",返回所有
245 + if (!activeCategory || !activeCategory.id) {
246 + return allList.value
247 + }
248 +
249 + // 否则根据 categoryId 筛选(这里使用 index 模拟分类筛选)
250 + // TODO: 实际应该根据 item.categoryId === activeCategory.id 来筛选
251 + const index = activeCategoryIndex.value
252 + return allList.value.filter((_, i) => (i + index) % (index + 2) === 0)
253 +})
254 +
255 +/**
215 * 页面加载时接收参数 256 * 页面加载时接收参数
216 * 257 *
217 * @description 使用 Taro 的 useLoad hook 接收路由参数 258 * @description 使用 Taro 的 useLoad hook 接收路由参数
...@@ -219,6 +260,12 @@ const list = ref([ ...@@ -219,6 +260,12 @@ const list = ref([
219 useLoad((options) => { 260 useLoad((options) => {
220 console.log('[Material List] 页面参数:', options) 261 console.log('[Material List] 页面参数:', options)
221 262
263 + // 接收 title 参数并更新页面标题
264 + if (options.title) {
265 + pageTitle.value = options.title
266 + console.log('[Material List] 页面标题:', pageTitle.value)
267 + }
268 +
222 // 接收 categoryId 参数 269 // 接收 categoryId 参数
223 if (options.categoryId) { 270 if (options.categoryId) {
224 categoryId.value = options.categoryId 271 categoryId.value = options.categoryId
...@@ -323,6 +370,15 @@ const onDelete = (item) => { ...@@ -323,6 +370,15 @@ const onDelete = (item) => {
323 </script> 370 </script>
324 371
325 <style lang="less" scoped> 372 <style lang="less" scoped>
373 +.no-scrollbar::-webkit-scrollbar {
374 + display: none;
375 +}
376 +
377 +.no-scrollbar {
378 + -ms-overflow-style: none;
379 + scrollbar-width: none;
380 +}
381 +
326 @keyframes slideIn { 382 @keyframes slideIn {
327 from { 383 from {
328 opacity: 0; 384 opacity: 0;
......
...@@ -99,12 +99,15 @@ const ONBOARDING_SECTIONS = [ ...@@ -99,12 +99,15 @@ const ONBOARDING_SECTIONS = [
99 /** 99 /**
100 * 处理项目点击事件 100 * 处理项目点击事件
101 * 101 *
102 - * @description 点击列表项时跳转到资料列表页,并带上分类 ID 102 + * @description 点击列表项时跳转到资料列表页,并带上分类 ID 和标题
103 * @param {Object} item - 被点击的项目数据 103 * @param {Object} item - 被点击的项目数据
104 * @param {Function} go - 导航函数 104 * @param {Function} go - 导航函数
105 */ 105 */
106 const handleItemClickWithNav = (item, go) => { 106 const handleItemClickWithNav = (item, go) => {
107 - go('/pages/material-list/index', { categoryId: item.id }) 107 + go('/pages/material-list/index', {
108 + categoryId: item.id,
109 + title: item.title
110 + })
108 } 111 }
109 112
110 // 使用 useSectionList composable 管理列表数据,传入自定义点击处理 113 // 使用 useSectionList composable 管理列表数据,传入自定义点击处理
......
...@@ -121,12 +121,15 @@ const SIGNING_SECTIONS = [ ...@@ -121,12 +121,15 @@ const SIGNING_SECTIONS = [
121 /** 121 /**
122 * 处理项目点击事件 122 * 处理项目点击事件
123 * 123 *
124 - * @description 点击列表项时跳转到资料列表页,并带上分类 ID 124 + * @description 点击列表项时跳转到资料列表页,并带上分类 ID 和标题
125 * @param {Object} item - 被点击的项目数据 125 * @param {Object} item - 被点击的项目数据
126 * @param {Function} go - 导航函数 126 * @param {Function} go - 导航函数
127 */ 127 */
128 const handleItemClickWithNav = (item, go) => { 128 const handleItemClickWithNav = (item, go) => {
129 - go('/pages/material-list/index', { categoryId: item.id }) 129 + go('/pages/material-list/index', {
130 + categoryId: item.id,
131 + title: item.title
132 + })
130 } 133 }
131 134
132 // 使用 useSectionList composable 管理列表数据,传入自定义点击处理 135 // 使用 useSectionList composable 管理列表数据,传入自定义点击处理
......