刘铭 發表於 2019-9-30 16:58:00

uni-app实现滑动切换效果

<p>在对于uni-app框架了解之后,今天就实现一个滚动切换tab效果,这个很常见的一个效果,最后封装成一个组件,便于以后使用,写这个需要引入uni官方提供的uni.css样式,用到了写好的样式,就不需要自己写了</p>
<p><img src="https://img2018.cnblogs.com/blog/1188378/201909/1188378-20190930161608998-8025192.gif"></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;这种切换无论是在app端还是小程序或者H5页面都是很常见的功能。对于这种功能,为单独封装成功组件,方便每个页面都能用到,</p>
<p><strong>tab顶部导航栏</strong></p>
<p>页面布局,使用uni-app提供的scroll-view组件。</p>
<div class="cnblogs_code">
<pre>&lt;template&gt;
    &lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">uni-tab-bar</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
      &lt;scroll-view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">uni-swiper-tab</span><span style="color: rgba(128, 0, 0, 1)">"</span> scroll-x&gt;
            &lt;block v-<span style="color: rgba(0, 0, 255, 1)">for</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">(tab,index) in tabBars</span><span style="color: rgba(128, 0, 0, 1)">"</span> :key=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tab.id</span><span style="color: rgba(128, 0, 0, 1)">"</span> :style=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">scrollStyle</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                &lt;<span style="color: rgba(0, 0, 0, 1)">view
                  </span><span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">swiper-tab-list</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                  :</span><span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{'active' : tabIndex==index}</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                  @tap</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tabtap(index)</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
                  :style</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">scrollItemStyle</span><span style="color: rgba(128, 0, 0, 1)">"</span>
                &gt;<span style="color: rgba(0, 0, 0, 1)">
                  {{tab.name}} {{tab.num</span>?tab.num:<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">}}
                </span>&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">swiper-tab-line</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/view&gt;
                &lt;/view&gt;
            &lt;/block&gt;
      &lt;/scroll-view&gt;
    &lt;/view&gt;
&lt;/template&gt;</pre>
</div>
<p>这个页面相当于封装一个组件,便于其他他们调用使用,tabIndex这个是tab内容,tabIndex对应的索引值,表示第几个。scrollStyle父级样式设置,scrollItemStyle每一个tab内容样式设置</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">&lt;script&gt;
        export default {
                props:{
                        tabBars:Array,
                        tabIndex:Number,
                        scrollStyle:{
                                type:String,
                                default:""
                        },
                        scrollItemStyle:{
                                type:String,
                                default:""
                        }
                },
                methods:{
                        //点击切换导航
                        tabtap(index){
                                // this.tabIndex = index;
                                this.$emit('tabtap',index)
                        }
                }
        }
&lt;/script&gt; </pre>
</div>
<p>样式</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">&lt;style scoped &gt;
.uni-swiper-tab{
                border-bottom: 1upx solid #EEEEEE;
        }
        .swiper-tab-list{
                color: #969696;
                font-weight: bold;
        }
        .uni-tab-bar .active{
                color: #343434;
        }
        .active .swiper-tab-line{
                border-bottom: 6upx solid #FEDE33;
                width: 70upx;
                margin: auto;
                border-top: 6upx solid #FEDE33;
                border-radius: 20upx;
        }
&lt;/style&gt;</pre>
</div>
<p>tabtap点击切换效果,自定义一个tabtap事件,传递给父级,和vue语法一样</p>
<p><strong>在父级组件</strong></p>
<p>1.第一步先引入上面封装好的组件,</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">import swiperTabHead from "../../components/index/swiper-tab-head.vue";
注册组件
components:{
   swiperTabHead,
   }
</pre>
</div>
<p>2.使用组件</p>
<div class="cnblogs_code">
<pre>&lt;swiperTabHead :tabBars=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tabBars</span><span style="color: rgba(128, 0, 0, 1)">"</span> :tabIndex=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tabIndex</span><span style="color: rgba(128, 0, 0, 1)">"</span> @tabtap=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tabtap</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;&lt;/swiperTabHead&gt;</pre>
</div>
<p>3.在data定义好数据</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;"> export default {
   data(){
         tabIndex:0,// 选中的
        tabBars:[
          { name:"关注",id:"guanzhu" },
          { name:"推荐",id:"tuijian" },
          { name:"体育",id:"tiyu" },
          { name:"热点",id:"redian"},
          { name:"财经",id:"caijing" },
          { name:"娱乐",id:"yule"    },
       ]                                    
    }
}   
</pre>
</div>
<p>4.在方法中使用传过来的事件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">接受子组件传过来的值点击切换导航</span>
<span style="color: rgba(0, 0, 0, 1)">            tabtap(index){
                </span><span style="color: rgba(0, 0, 255, 1)">this</span>.tabIndex =<span style="color: rgba(0, 0, 0, 1)"> index;
            },</span></pre>
</div>
<p><strong>切换内容,直接在父组件写</strong></p>
<div class="cnblogs_code">
<pre>&lt;view <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">uni-tab-bar</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
            &lt;swiper <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">swiper-box</span><span style="color: rgba(128, 0, 0, 1)">"</span> :style=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">{height:swiperheight+'px'}</span><span style="color: rgba(128, 0, 0, 1)">"</span> :current=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tabIndex</span><span style="color: rgba(128, 0, 0, 1)">"</span> @change=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">tabChange</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                &lt;swiper-item v-<span style="color: rgba(0, 0, 255, 1)">for</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">(items,index) in newslist</span><span style="color: rgba(128, 0, 0, 1)">"</span> :key=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">index</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                  &lt;scroll-view scroll-y <span style="color: rgba(0, 0, 255, 1)">class</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">list</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                        &lt;template v-<span style="color: rgba(0, 0, 255, 1)">if</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">items.list.length &gt; 0</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                            &lt;!-- 图文列表 --&gt;
                            &lt;block v-<span style="color: rgba(0, 0, 255, 1)">for</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">(item,index1) in items.list</span><span style="color: rgba(128, 0, 0, 1)">"</span> :key=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">index1</span><span style="color: rgba(128, 0, 0, 1)">"</span>&gt;
                              &lt;view&gt;{{item}}&lt;/view&gt;
                            &lt;/block&gt;
                        &lt;/template&gt;
                  &lt;/scroll-view&gt;
                &lt;/swiper-item&gt;
            &lt;/swiper&gt;
      &lt;/view&gt;</pre>
</div>
<p>5.也是需要在data定义一下内容,newslist是循环遍历的tab内容的内容,大概数据结构就是这样的,swiperheight这个是需要动态计算可视区域内容的高度</p>
<div class="cnblogs_code">
<pre>swiperheight:<span style="color: rgba(128, 0, 128, 1)">500</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">高度</span>
<span style="color: rgba(0, 0, 0, 1)">newslist:[
   {
   list:[
       数据内天
       ]
   },
   {},
   {},
   {},
   {},
   {}
]</span></pre>
</div>
<p>6.在methods方法中写手动切换的效果</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">//滑动切换导航
tabChange(e){
   this.tabIndex = e.detail.current;<br>},
</pre>
</div>
<p> 7.动态计算高度,upx2x是吧px转换成upx,调用这个api,需要在onLoad生命周期写</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">onLoad() {
   uni.getSystemInfo({
        success:(res)=&gt;{
                let height = res.windowHeight-uni.upx2px(100)
                this.swiperheight = height;
        }
    })<br>},
</pre>
</div>
<p>  以上就是用uni-app实现的一个tab切换的效果,可以使用任何平台,已经测试几个平台,都没有问题,</p><br><br>
来源:https://www.cnblogs.com/zhoulifeng/p/11613430.html
頁: [1]
查看完整版本: uni-app实现滑动切换效果