【uniapp手写组件】分页面板

uniapp分页面板组件:

<template>
  <div class="tab-container">
    <div class="tab-nav">
      <div
        v-for="(tab, index) in tabs"
        :key="index"
        :class="{
          'tab-nav-item': true,
          'active': activeIndex === index
        }"
        @click="handleTabClick(index)"
      >
        {{tab.title}}
      </div>
    </div>
    <div class="tab-contents">
      <div
        v-for="(tab, index) in tabs"
        :key="index"
        :class="{
          'tab-content': true,
          'active': activeIndex === index
        }"
      >
        <slot :name="tab.name"></slot>
      </div>
    </div>
  </div>
</template>

<script>
export default {
  name: 'TabContainer',
  props: {
    tabs: {
      type: Array,
      required: true
    },
    defaultActiveIndex: {
      type: Number,
      default: 0
    }
  },
  data () {
    return {
      activeIndex: this.defaultActiveIndex
    }
  },
  methods: {
    handleTabClick (index) {
      this.activeIndex = index
    }
  }
}
</script>

<style>
.tab-container {
  display: flex;
  flex-direction: column;
}

.tab-nav {
  display: flex;
  background-color: #f0f0f0;
}

.tab-nav-item {
  padding: 10px;
  cursor: pointer;
}

.tab-nav-item.active {
  color: white;
  background-color: #333;
}

.tab-contents {
  display: flex;
}

.tab-content {
  flex: 1;
  display: none;
}

.tab-content.active {
  display: flex;
}
</style>

使用方法:

在需要使用分页面板的页面中,先引入组件:

<template>
  <div class="page">
    <TabContainer :tabs="tabs">
      <div slot="tab0">
        这是第一个页面
      </div>
      <div slot="tab1">
        这是第二个页面
      </div>
      <div slot="tab2">
        这是第三个页面
      </div>
    </TabContainer>
  </div>
</template>

<script>
import TabContainer from '@/components/TabContainer.vue'

export default {
  name: 'MyPage',
  components: {
    TabContainer
  },
  data () {
    return {
      tabs: [
        {
          title: '页面1',
          name: 'tab0'
        },
        {
          title: '页面2',
          name: 'tab1'
        },
        {
          title: '页面3',
          name: 'tab2'
        }
      ]
    }
  }
}
</script>

这个例子中,页面中有三个分页面板,分别对应三个不同的页面,使用 slot 标签,将分页面板中的每一个页面传递进去。在 tabs 属性中配置每个页面对应的标题和名称。

### UniApp 中实现自定义 Swiper 组件的方法 在 UniApp 开发中,Swiper 是一种常见的交互形式,用于展示轮播图或其他滑动内容。通过自定义 Swiper 组件,可以满足更复杂的需求并提升用户体验。 #### 1. 原理概述 Swiper 的核心原理基于触控事件监听和 DOM 节点操作。当用户触发触摸屏幕的动作时,程序会捕获 `touchstart`、`touchmove` 和 `touchend` 等事件,并根据这些事件计算手指移动的距离以及调整页面显示的内容[^1]。 #### 2. 自定义 Swiper 的基本结构 以下是构建一个基础的自定义 Swiper 组件的关键部分: - **HTML 结构** 需要创建容器节点(`.swiper-container`),内部包含多个子项(`.swiper-slide`)。每个子项代表一个可滑动的视图。 - **CSS 样式** 使用 Flexbox 或绝对定位布局来控制 Swiper 容器及其子项的位置关系。例如设置 `.swiper-container` 的宽度为固定值,而 `.swiper-slide` 则占据整个父级区域。 - **JavaScript 功能** 编写逻辑处理用户的触碰行为,记录初始坐标、偏移量等数据;并通过动态改变样式属性完成平滑过渡效果。 ```html <template> <view class="swiper-container"> <view v-for="(item, index) in items" :key="index" class="swiper-slide">{{ item }}</view> </view> </template> <style scoped> .swiper-container { display: flex; overflow-x: scroll; width: 100%; } .swiper-slide { min-width: 100vw; text-align: center; } </style> <script> export default { data() { return { startX: 0, moveX: 0, items: ['Slide 1', 'Slide 2', 'Slide 3'] }; }, methods: { handleTouchStart(e) { this.startX = e.touches[0].pageX; }, handleTouchMove(e) { const currentX = e.touches[0].pageX; this.moveX += (currentX - this.startX); this.$el.style.transform = `translateX(${this.moveX}px)`; this.startX = currentX; } } }; </script> ``` 上述代码展示了如何利用 Vue.js 数据绑定机制配合原生 JavaScript 实现简单的水平方向滚动功能。 #### 3. 进一步增强体验 为了使组件更加完善,还可以加入以下特性: - 添加分页指示器以提示当前所在位置; - 支持循环播放模式让首尾相连形成无缝衔接的效果; - 设置自动定时切换选项减少手动干预频率。 关于分页指示器的具体做法,请参阅相关内容说明[^3]。 #### 4. 左侧菜单栏与主界面联动设计 如果希望结合实际应用场景制作带导航条目的多面板布局,则需额外注意两者之间的同步更新策略。比如可以通过监听特定条件变化主动通知另一方重新渲染相应状态[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值