要求

在一个页面上左右滑动切换不同的内容
image.png

思路

1:将每个页面制作为一个对应的组件
2:通过轮播图组件显示这些组件

  1. // 你要做切换的vue文件中
  2. // 使用轮播图组件
  3. <swiper>
  4. <swiper-item>
  5. <aaaa :aaa='aaaa'></aaaa> // 页面1
  6. </swiper-item>
  7. <swiper-item>
  8. <bbbb></bbbb> // // 页面2
  9. </swiper-item>
  10. </swiper>

问题

swiper 组件的高度不会被内容撑开,而且不能给一个固定的高度,因为不同的设备高度是不同的
所以怎样才能完整的显示页面的内容?

1:动态获取设备的可使用窗口的高度

  1. // 在App.vue中
  2. <script>
  3. // 省略其他
  4. // 在生命周期 onLaunch 初始化显目时获取设备的可使用高度转为2倍(使用rpx嘚) 并存储到vuex中
  5. onLaunch: function() {
  6. console.log('App Launch')
  7. uni.getSystemInfo({
  8. success: (res)=> {
  9. this.$u.vuex('heights',res.windowHeight*2)
  10. }
  11. })
  12. },
  13. </script>

2:为swiper 设置高度

  1. // swiper 的高度 = 设备的可使用高度 - 页面内其他组件的高度
  2. // 建议除swiper以外其他组件使用固定高度 即其他组件是固定不动的
  3. <div class="bock" ref="bock" @click="hoInfo">123</div> // 高度为100rpx
  4. <swiper :style="{height:(heights-100)+'px'}">
  5. // 省略其他....

在这里设置完成后,你的页面还不能上下滚动,是静止的

3: 为组件添加 scroll-view 组件

  1. // 在组件中
  2. <template>
  3. <view class="box1">
  4. // 在内容的外层包裹 scroll-view 组件 并且设置高度与swiper相同
  5. // 如果高度不相同则有可能出现两个滚动条
  6. <scroll-view scroll-y=true :style="{height:(heights-100)+'px'}">
  7. {{aaa.a}}
  8. <view v-for="it in 60" :key='it'>
  9. {{it}} +++++++
  10. </view>
  11. </scroll-view>
  12. </view>
  13. </template>

注意:上述在组件中拿到的高度都是在vuex中拿到的,这里是对vuex进行了配置使其可以在页面中直接拿到对应的值
vuex的配置

封装为组件

  1. <!-- 页面左右切换 -->
  2. <template>
  3. <view>
  4. <swiper :style="{height:(heights-fixedHeight)+'px'}">
  5. <swiper-item v-for="(item,i) in showPage" :key="i">
  6. <!-- 只支持 H5 和 App -->
  7. <component :is="item" ></component>
  8. </swiper-item>
  9. </swiper>
  10. </view>
  11. </template>
  12. <script>
  13. export default {
  14. name:"page-switching",
  15. data() {
  16. return {
  17. };
  18. },
  19. props:{
  20. // 传入高度差
  21. fixedHeight:{
  22. type:Number,
  23. default:0
  24. },
  25. // 传入页面
  26. showPage:{
  27. type:Array,
  28. required:true
  29. }
  30. }
  31. </script>
  32. <style>
  33. </style>

使用组件

  1. <page-switching :fixedHeight='100' :showPage='showPage'></page-switching>
  2. // 省略其他
  3. // 引入你要显示的页面
  4. import aaaa from '@/components/aaaa/aaaa.vue'
  5. import bbbb from '@/components/bbbb/bbbb.vue'
  6. data() {
  7. return {
  8. // 页面定义为数组 通过自定义属性传递出去
  9. showPage:[aaaa,bbbb]
  10. }
  11. },