9433cfb9创建于 2025年12月31日历史提交
<template>
  <!-- #ifdef APP -->
  <scroll-view style="flex: 1;" enable-back-to-top="true">
  <!-- #endif -->
    <view class="uni-container" :class="isDarkMode ? 'theme-dark' : 'theme-light'">
      <view v-if="!hasLeftWin" class="uni-header-logo">
        <image class="uni-header-image" src="/static/templateIndex.png"></image>
      </view>
      <view v-if="!hasLeftWin" class="uni-text-box">
        <text class="hello-text">以下是部分模板示例,更多模板见插件市场:</text>
        <u-link href="https://ext.dcloud.net.cn" :text="'https://ext.dcloud.net.cn'" :inWhiteList="true"></u-link>
      </view>
      <view class="uni-panel" v-for="(item, index) in list" :key="item.id">
        <view hover-class="is--active" class="uni-panel-h" @click="triggerCollapse(index, item)">
          <text class="uni-panel-text"
            :class="item.enable == false || item.open == true ? 'text-disabled' : '',item.url == leftWinActive && item.pages.length == 0 ? 'left-win-active' : ''">{{ item.name }}</text>
          <image :src="
              item.pages.length > 0
                ? item.open
                  ? arrowUpIcon
                  : arrowDownIcon
                : arrowRightIcon
            " class="uni-icon-size">
          </image>
        </view>
        <view v-if="item.open">
          <view style="padding-left: 18px;" class="uni-navigate-item"
            :hover-class="page.enable == false ? '' : 'is--active'" v-for="(page, key) in item.pages" :key="key"
            @click="goDetailPage(page)">
            <text class="uni-navigate-text"
              :class="{'left-win-active': leftWinActive === page.url  && hasLeftWin,'text-disabled' : page.enable == false}">{{ page.name }}</text>
            <image :src="arrowRightIcon" class="uni-icon-size"></image>
          </view>
        </view>
      </view>
    </view>
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
</template>

<script lang="uts">
  type Page = {
    name : string
    enable ?: boolean
    url : string
  }

  type ListItem = {
    id : string
    name : string
    open : boolean
    pages : Page[]
    url ?: string
    enable ?: boolean
  }
  import { state } from '@/store/index.uts'
  export default {
    data() {
      return {
        list: [
          {
            id: 'slider-100',
            url: 'slider-100',
            name: 'slider-100',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'long-list',
            url: 'long-list',
            name: '左右滑动长列表',
            open: false,
            enable: true,
            pages: [
              // #ifdef WEB
              {
                name: '顶部banner长列表(嵌套滚动)',
                url: 'long-list2'
              },
              // #endif
              // #ifdef APP
              {
                name: '顶部banner长列表(嵌套滚动)',
                url: 'long-list-nested'
              },
              // #endif
              // #ifdef APP-IOS || APP-ANDROID
              {
                name: '顶部banner瀑布流长列表(嵌套滚动)',
                url: 'long-waterflow-nested'
              },
              // #endif
              {
                name: '顶部搜索框随时下移长列表',
                url: 'long-list'
              }
            ] as Page[],
          },
          {
            id: 'list-news',
            url: 'list-news',
            name: '列表到详情(吸顶)',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'long-list-batch',
            url: 'long-list-batch',
            name: '分批加载长列表',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'custom-long-list',
            url: 'custom-long-list',
            name: '回收复用长列表',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'swiper-list',
            url: 'swiper-list',
            name: 'swiper-list',
            open: false,
            pages: [
              {
                name: '下划线样式',
                url: 'swiper-list'
              },
              {
                name: '字体放大样式',
                url: 'swiper-list2'
              },
            ] as Page[],
          },
          {
            id: 'scroll-fold-nav',
            url: 'scroll-fold-nav',
            name: '随滚动折叠的导航栏',
            open: false,
            pages: [] as Page[],
          },
          // #ifdef APP
          {
            id: 'custom-refresher',
            url: 'custom-refresher',
            name: '自定义下拉刷新',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'pull-zoom-image',
            url: 'pull-zoom-image',
            name: '下拉缩放顶部封面图',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'scroll-sticky',
            url: 'scroll-sticky',
            name: 'scroll-view自定义滚动吸顶',
            open: false,
            pages: [] as Page[],
          },
          // #endif
          {
            id: 'swiper-vertical-video',
            url: 'swiper-vertical-video',
            name: '竖滑视频',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'half-screen',
            url: 'half-screen',
            name: '半屏弹窗',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'drop-card',
            url: 'drop-card',
            name: '划走式卡片',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'navbar-lite',
            url: 'navbar-lite',
            name: '自定义导航栏',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'nav-transparent',
            url: 'nav-transparent',
            name: '自定义透明渐变导航栏',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'custom-tab-bar',
            url: 'custom-tab-bar',
            name: '自定义TabBar',
            open: false,
            enable: true,
            pages: [] as Page[],
          },
          // #ifdef APP
          {
            id: 'calendar',
            url: 'calendar',
            name: '日历',
            open: false,
            pages: [] as Page[],
          },
          // #endif
          // #ifdef APP || WEB
          {
            id: 'schema',
            url: 'schema',
            name: '打开外部链接',
            open: false,
            pages: [] as Page[],
          },
          // #endif
          // #ifdef WEB
          {
            id: 'browser-element',
            url: 'browser-element',
            name: '如何使用浏览器 element',
            open: false,
            pages: [] as Page[],
          },
          // #endif
          // #ifdef MP
          {
            id: 'vant',
            url: 'vant',
            name: '微信自定义组件示例',
            open: false,
            pages: [] as Page[],
          },
          {
            id: 'WXS',
            url: 'WXS',
            name: 'WXS',
            open: false,
            pages: [] as Page[],
          },
          // #endif
          {
            id: 'about',
            url: 'about',
            name: '关于',
            open: false,
            pages: [] as Page[],
          }
        ] as ListItem[],
        arrowUpIcon: '/static/icons/arrow-up.png',
        arrowDownIcon: '/static/icons/arrow-down.png',
        arrowRightIcon: '/static/icons/arrow-right.png'
      }
    },
    computed: {
      hasLeftWin() : boolean {
        return !state.noMatchLeftWindow
      },
      leftWinActive() : string {
        return state.leftWinActive.split('/')[3]
      },
      isDarkMode() : boolean {
        return state.isDarkMode
      },
      netless() : boolean {
        return state.netless
      }
    },
    // #ifdef APP-HARMONY
    watch: {
      'netless': {
        immediate: true,
        handler(netless) {
          if (netless) {
            this.list = this.list.filter(item => {
              return !['list-news'].includes(item.id)
            })
          }
        }
      }
    },
    // #endif
    methods: {
      triggerCollapse(index : number, item : ListItem) {
        if (item.pages.length == 0) {
          const page : Page = {
            name: item.name,
            enable: item.enable,
            url: item.url!,
          }
          this.goDetailPage(page)
          return
        }
        for (var i = 0; i < this.list.length; ++i) {
          if (index == i) {
            this.list[i].open = !this.list[i].open
          } else {
            this.list[i].open = false
          }
        }
      },
      goDetailPage(e : Page) {
        if (e.enable == false) {
          uni.showToast({
            icon: 'none',
            title: '暂不支持',
          })
          return
        }
        const url =
          e.url.indexOf('platform') > -1
            ? e.url
            : `/pages/template/${e.url}/${e.url}`
        if (this.hasLeftWin) {
          uni.reLaunch({ url })
        } else {
          uni.navigateTo({ url })
        }
      }
    },
    // #ifdef WEB
    watch: {
      $route: {
        immediate: true,
        handler(newRoute) {
          if (newRoute.matched.length) {
            let path = newRoute.path.split('/')[3]
            for (const item of this.list) {
              if (Array.isArray(item.pages)) {
                for (const page of item.pages) {
                  if (page.url && page.url === path) {
                    item.open = true
                  }
                }
              }
            }
          }
        }
      }
    },
    // #endif
  }
</script>

<style>
  .uni-panel-h {
    padding: 12px 18px;
  }
</style>