template.uvue 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. <template>
  2. <!-- #ifdef APP -->
  3. <scroll-view style="flex: 1;" enable-back-to-top="true">
  4. <!-- #endif -->
  5. <view class="uni-container" :class="isDarkMode ? 'theme-dark' : 'theme-light'">
  6. <view v-if="!hasLeftWin" class="uni-header-logo">
  7. <image class="uni-header-image" src="/static/templateIndex.png"></image>
  8. </view>
  9. <view v-if="!hasLeftWin" class="uni-text-box">
  10. <text class="hello-text">以下是部分模板示例,更多模板见插件市场:</text>
  11. <u-link href="https://ext.dcloud.net.cn" :text="'https://ext.dcloud.net.cn'" :inWhiteList="true"></u-link>
  12. </view>
  13. <view class="uni-panel" v-for="(item, index) in list" :key="item.id">
  14. <view hover-class="is--active" class="uni-panel-h" @click="triggerCollapse(index, item)">
  15. <text class="uni-panel-text"
  16. :class="item.enable == false || item.open == true ? 'text-disabled' : '',item.url == leftWinActive && item.pages.length == 0 ? 'left-win-active' : ''">{{ item.name }}</text>
  17. <image :src="
  18. item.pages.length > 0
  19. ? item.open
  20. ? arrowUpIcon
  21. : arrowDownIcon
  22. : arrowRightIcon
  23. " class="uni-icon-size">
  24. </image>
  25. </view>
  26. <view v-if="item.open">
  27. <view style="padding-left: 18px;" class="uni-navigate-item"
  28. :hover-class="page.enable == false ? '' : 'is--active'" v-for="(page, key) in item.pages" :key="key"
  29. @click="goDetailPage(page)">
  30. <text class="uni-navigate-text"
  31. :class="{'left-win-active': leftWinActive === page.url && hasLeftWin,'text-disabled' : page.enable == false}">{{ page.name }}</text>
  32. <image :src="arrowRightIcon" class="uni-icon-size"></image>
  33. </view>
  34. </view>
  35. </view>
  36. </view>
  37. <!-- #ifdef APP -->
  38. </scroll-view>
  39. <!-- #endif -->
  40. </template>
  41. <script lang="uts">
  42. type Page = {
  43. name : string
  44. enable ?: boolean
  45. url : string
  46. }
  47. type ListItem = {
  48. id : string
  49. name : string
  50. open : boolean
  51. pages : Page[]
  52. url ?: string
  53. enable ?: boolean
  54. }
  55. import { state } from '@/store/index.uts'
  56. export default {
  57. data() {
  58. return {
  59. list: [
  60. {
  61. id: 'slider-100',
  62. url: 'slider-100',
  63. name: 'slider-100',
  64. open: false,
  65. pages: [] as Page[],
  66. },
  67. {
  68. id: 'long-list',
  69. url: 'long-list',
  70. name: '左右滑动长列表',
  71. open: false,
  72. enable: true,
  73. pages: [
  74. // #ifdef WEB
  75. {
  76. name: '顶部banner长列表(嵌套滚动)',
  77. url: 'long-list2'
  78. },
  79. // #endif
  80. // #ifdef APP
  81. {
  82. name: '顶部banner长列表(嵌套滚动)',
  83. url: 'long-list-nested'
  84. },
  85. // #endif
  86. // #ifdef APP-IOS || APP-ANDROID
  87. {
  88. name: '顶部banner瀑布流长列表(嵌套滚动)',
  89. url: 'long-waterflow-nested'
  90. },
  91. // #endif
  92. {
  93. name: 'Android顶部搜索框随时下移长列表',
  94. url: 'long-list'
  95. }
  96. ] as Page[],
  97. },
  98. {
  99. id: 'list-news',
  100. url: 'list-news',
  101. name: '列表到详情(吸顶)',
  102. open: false,
  103. pages: [] as Page[],
  104. },
  105. {
  106. id: 'long-list-batch',
  107. url: 'long-list-batch',
  108. name: '分批加载长列表',
  109. open: false,
  110. pages: [] as Page[],
  111. },
  112. {
  113. id: 'swiper-list',
  114. url: 'swiper-list',
  115. name: 'swiper-list',
  116. open: false,
  117. pages: [
  118. {
  119. name: '下划线样式',
  120. url: 'swiper-list'
  121. },
  122. {
  123. name: '字体放大样式',
  124. url: 'swiper-list2'
  125. },
  126. ] as Page[],
  127. },
  128. {
  129. id: 'scroll-fold-nav',
  130. url: 'scroll-fold-nav',
  131. name: '随滚动折叠的导航栏',
  132. open: false,
  133. pages: [] as Page[],
  134. },
  135. // #ifdef APP
  136. {
  137. id: 'custom-refresher',
  138. url: 'custom-refresher',
  139. name: '自定义下拉刷新',
  140. open: false,
  141. pages: [] as Page[],
  142. },
  143. {
  144. id: 'pull-zoom-image',
  145. url: 'pull-zoom-image',
  146. name: '下拉缩放顶部封面图',
  147. open: false,
  148. pages: [] as Page[],
  149. },
  150. {
  151. id: 'scroll-sticky',
  152. url: 'scroll-sticky',
  153. name: 'scroll-view自定义滚动吸顶',
  154. open: false,
  155. pages: [] as Page[],
  156. },
  157. // #endif
  158. {
  159. id: 'swiper-vertical-video',
  160. url: 'swiper-vertical-video',
  161. name: '竖滑视频',
  162. open: false,
  163. pages: [] as Page[],
  164. },
  165. {
  166. id: 'half-screen',
  167. url: 'half-screen',
  168. name: '半屏弹窗',
  169. open: false,
  170. pages: [] as Page[],
  171. },
  172. {
  173. id: 'drop-card',
  174. url: 'drop-card',
  175. name: '划走式卡片',
  176. open: false,
  177. pages: [] as Page[],
  178. },
  179. {
  180. id: 'navbar-lite',
  181. url: 'navbar-lite',
  182. name: '自定义导航栏',
  183. open: false,
  184. pages: [] as Page[],
  185. },
  186. {
  187. id: 'custom-tab-bar',
  188. url: 'custom-tab-bar',
  189. name: '自定义TabBar',
  190. open: false,
  191. enable: true,
  192. pages: [] as Page[],
  193. },
  194. // #ifdef APP
  195. {
  196. id: 'calendar',
  197. url: 'calendar',
  198. name: '日历',
  199. open: false,
  200. pages: [] as Page[],
  201. },
  202. // #endif
  203. // #ifdef APP || WEB
  204. {
  205. id: 'schema',
  206. url: 'schema',
  207. name: '打开外部链接',
  208. open: false,
  209. pages: [] as Page[],
  210. },
  211. // #endif
  212. // #ifdef WEB
  213. {
  214. id: 'browser-element',
  215. url: 'browser-element',
  216. name: '如何使用浏览器 element',
  217. open: false,
  218. pages: [] as Page[],
  219. },
  220. // #endif
  221. // #ifdef MP
  222. {
  223. id: 'vant',
  224. url: 'vant',
  225. name: '微信自定义组件示例',
  226. open: false,
  227. pages: [] as Page[],
  228. },
  229. {
  230. id: 'WXS',
  231. url: 'WXS',
  232. name: 'WXS',
  233. open: false,
  234. pages: [] as Page[],
  235. },
  236. // #endif
  237. ] as ListItem[],
  238. arrowUpIcon: '/static/icons/arrow-up.png',
  239. arrowDownIcon: '/static/icons/arrow-down.png',
  240. arrowRightIcon: '/static/icons/arrow-right.png'
  241. }
  242. },
  243. computed: {
  244. hasLeftWin() : boolean {
  245. return !state.noMatchLeftWindow
  246. },
  247. leftWinActive() : string {
  248. return state.leftWinActive.split('/')[3]
  249. },
  250. isDarkMode() : boolean {
  251. return state.isDarkMode
  252. },
  253. netless() : boolean {
  254. return state.netless
  255. }
  256. },
  257. // #ifdef APP-HARMONY
  258. watch: {
  259. 'netless': {
  260. immediate: true,
  261. handler(netless) {
  262. if (netless) {
  263. this.list = this.list.filter(item => {
  264. return !['list-news'].includes(item.id)
  265. })
  266. }
  267. }
  268. }
  269. },
  270. // #endif
  271. methods: {
  272. triggerCollapse(index : number, item : ListItem) {
  273. if (item.pages.length == 0) {
  274. const page : Page = {
  275. name: item.name,
  276. enable: item.enable,
  277. url: item.url!,
  278. }
  279. this.goDetailPage(page)
  280. return
  281. }
  282. for (var i = 0; i < this.list.length; ++i) {
  283. if (index == i) {
  284. this.list[i].open = !this.list[i].open
  285. } else {
  286. this.list[i].open = false
  287. }
  288. }
  289. },
  290. goDetailPage(e : Page) {
  291. if (e.enable == false) {
  292. uni.showToast({
  293. icon: 'none',
  294. title: '暂不支持',
  295. })
  296. return
  297. }
  298. const url =
  299. e.url.indexOf('platform') > -1
  300. ? e.url
  301. : `/pages/template/${e.url}/${e.url}`
  302. if (this.hasLeftWin) {
  303. uni.reLaunch({ url })
  304. } else {
  305. uni.navigateTo({ url })
  306. }
  307. }
  308. },
  309. // #ifdef WEB
  310. watch: {
  311. $route: {
  312. immediate: true,
  313. handler(newRoute) {
  314. if (newRoute.matched.length) {
  315. let path = newRoute.path.split('/')[3]
  316. for (const item of this.list) {
  317. if (Array.isArray(item.pages)) {
  318. for (const page of item.pages) {
  319. if (page.url && page.url === path) {
  320. item.open = true
  321. }
  322. }
  323. }
  324. }
  325. }
  326. }
  327. }
  328. },
  329. // #endif
  330. }
  331. </script>
  332. <style>
  333. .uni-panel-h {
  334. padding: 12px 18px;
  335. }
  336. </style>