index.tsx 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import { forwardRef, useEffect, useRef, useState } from 'react'
  2. import Taro, { useShareAppMessage } from '@tarojs/taro'
  3. import { useDidHide, useDidShow } from '@tarojs/taro'
  4. import { observer, inject } from 'mobx-react'
  5. import { ScrollView, View } from '@tarojs/components'
  6. import './index.less'
  7. //==========components组件引用========================
  8. import TopNavBar from '@src/components/TopNavBar/index'
  9. import BookboxRowBig from '@src/components/PupPetry/BookBox/BookboxRowBig'
  10. import BookTypeTabs from '@src/components/PupPetry/BookTypeTabs'
  11. import Empty from '@src/components/Empty'
  12. import { Store } from '@src/app'
  13. import useApi from '@src/Hook/useApi'
  14. import { getBookCategoryList } from '@src/server/classify'
  15. import { share } from '@src/utils'
  16. interface Props {
  17. store: Store;
  18. }
  19. const Index = forwardRef((props: Props) => {
  20. const { classifyStore, indexStore } = props.store
  21. const { getBookPageList } = useApi()
  22. const [pageShow, setPageShow] = useState(false)//防止小程序切换页面组件不会被真实卸载,阻止不必要的操作
  23. const [open, setOpen] = useState(false)
  24. const [showEmpty, setShowEmpty] = useState(false)
  25. const [isSetOpen, setIsSetOpen] = useState(true)
  26. const [filterHeight, setFilterHeight] = useState(0)
  27. const timeRef = useRef<any>()
  28. // 获取分类列表
  29. useEffect(() => {
  30. if (pageShow) {
  31. console.log("获取分类列表")
  32. let { workDirection } = classifyStore
  33. getBookCategoryList(workDirection).then((res: any) => {
  34. if (res?.data?.code === 200) {
  35. classifyStore.setData({ classifyData: res?.data?.data })
  36. }
  37. })
  38. }
  39. }, [classifyStore.workDirection, pageShow]); // Dependency array, runs effect only once on mount and unmount
  40. //获取书籍列表
  41. useEffect(() => {
  42. if (pageShow) {
  43. console.log("获取书籍列表")
  44. let { workDirection } = classifyStore
  45. let { categoryId } = classifyStore
  46. categoryId.id != 0 && classifyStore.categoryId && getList({ workDirection, categoryId: categoryId.id, pageNum: 1, pageSize: 10, type: 'class' }).then((res: any) => {
  47. if (res?.data?.data?.total === 0) {
  48. setShowEmpty(true)
  49. } else {
  50. setShowEmpty(false)
  51. }
  52. })
  53. }
  54. }, [classifyStore.workDirection, classifyStore.categoryId, pageShow])
  55. // 使用 useDidShow 代替 onShow
  56. useDidShow(() => {
  57. setPageShow(true)
  58. });
  59. // 使用 useDidHide 如果需要在页面隐藏时做一些处理
  60. useDidHide(() => {
  61. // setPageShow(false)
  62. });
  63. //下拉加载
  64. const load = () => {
  65. return new Promise((resolve, reject) => {
  66. let { size, total, records } = classifyStore.bookList
  67. let pageSize = size + 10
  68. let { workDirection } = classifyStore
  69. let { categoryId } = classifyStore
  70. if (records?.length >= total) {
  71. Taro.showToast({
  72. title: '没有更多了~~',
  73. duration: 2000,
  74. icon: 'none'
  75. })
  76. reject()
  77. return
  78. } else {
  79. getList({ workDirection, categoryId: categoryId.id, pageNum: 1, pageSize, type: 'class' }).then((res: any) => {
  80. if (res?.data?.data?.total === 0) {
  81. setShowEmpty(true)
  82. } else {
  83. console.log("isSetOpen", isSetOpen)
  84. setShowEmpty(false)
  85. }
  86. resolve(true)
  87. })
  88. }
  89. })
  90. }
  91. const getList = async (params) => {
  92. return getBookPageList(params)
  93. }
  94. // 分享
  95. useShareAppMessage(async () => {
  96. // 获取当前页面栈
  97. const pages = Taro.getCurrentPages()
  98. // 获取栈顶的页面,即当前页面
  99. const currentPage = pages[pages.length - 1]
  100. // 获取页面的路径和参数
  101. const route = currentPage.route // 页面路径
  102. if (route) {
  103. let shareInfo = await share({ pagePath: route })
  104. let { sharePicUrl, shareTitles, pageName, pagePath } = shareInfo
  105. return {
  106. title: shareTitles || app.appInfo?.appName + '-' + pageName,
  107. path: pagePath || undefined,
  108. imageUrl: sharePicUrl || undefined
  109. }
  110. }
  111. return {}
  112. })
  113. const callBacn = (b) => {
  114. Taro.createSelectorQuery()
  115. .select('.classList') // 选择器,用于选择要获取信息的元素
  116. .boundingClientRect() // 获取节点的布局信息
  117. .exec((res) => {
  118. if (res[0]) {
  119. const height = res[0].height; // 获取元素的高度
  120. setFilterHeight(height + indexStore.navHeight);
  121. } else {
  122. console.log("未找到指定元素");
  123. }
  124. });
  125. setOpen(b)
  126. }
  127. useEffect(() => {
  128. callBacn(false)
  129. }, [])
  130. return (
  131. <View className='index'>
  132. {classifyStore?.classifyData?.length > 0 && <View style={{ background: "#fff" }} className='classList' onClick={() => { setIsSetOpen(false) }}>
  133. <BookTypeTabs open={open} onCallback={callBacn} typeValue={classifyStore?.classifyData} typeTabIndex={classifyStore.categoryId} workDirection={classifyStore.workDirection} ></BookTypeTabs>
  134. </View>}
  135. <View>
  136. </View>
  137. <View onTouchStart={() => {
  138. setIsSetOpen(true)
  139. }} >
  140. <ScrollView
  141. lowerThreshold={filterHeight}
  142. // refresherTriggered={this.state.isShow}
  143. style={{ height: `calc(100vh - ${filterHeight + 10}px)` }}
  144. onScrollToLower={load}
  145. onScroll={(evt: any) => {
  146. let top = evt.detail.scrollTop
  147. if(timeRef.current){
  148. clearTimeout(timeRef.current)
  149. }
  150. timeRef.current=setTimeout(()=>{
  151. if (isSetOpen) {
  152. if (top > 100 && open) {
  153. callBacn(false)
  154. }
  155. if (top < 100 && !open) {
  156. callBacn(true)
  157. }
  158. }
  159. },100)
  160. }}
  161. className="scrollview"
  162. scrollY={true}
  163. refresherDefaultStyle="black"
  164. // scrollWithAnimation={true}
  165. >
  166. <View className='w row for_top1 pd_btm'>
  167. {
  168. classifyStore?.bookList?.records?.length > 0 && classifyStore?.bookList?.records?.map((item, index) => {
  169. return <>
  170. <View key={item.bookId} ><BookboxRowBig {...item} /></View>
  171. </>
  172. })
  173. }
  174. {
  175. showEmpty && <Empty />
  176. }
  177. </View>
  178. </ScrollView>
  179. </View>
  180. </View>
  181. );
  182. });
  183. export default TopNavBar(inject('store')(observer(Index)), {
  184. tab: true,
  185. tabVal: [{ value: 0, text: "男生" }, { value: 1, text: "女生" }],
  186. backgroundColor: '#fff',
  187. color: "#333",
  188. search: false,
  189. });