基于angular实现模拟微信小程序开发之swiper组件
凌雪 2018-10-10 来源 :网络 阅读 1048 评论 0

摘要:本文将带你了解基于angular实现模拟微信小程序开发之swiper组件,希望本文对大家学微信有所帮助。

本文将带你了解基于angular实现模拟微信小程序开发之swiper组件,希望本文对大家学微信有所帮助。


这段时间的主业是完成一个家政类小程序,终于是过审核发布了。不得不说微信的这个小程序生态还是颇有想法的,抛开他现有的一些问题不说,其提供的组件系统乍一看还是蛮酷的。比如其提供的一个叫swiper的视图组件,就可以在写界面的时候省不少时间和代码,轮播图片跟可滑动列表都可以用。导致现在回来写angular项目时也想整一个这样的组件出来,本文就将使用angular的组件能力和服务能力完成这么一个比较通用,耦合度较低的swiper出来。首先要选择使用的技术,要实现的是与界面打交道的东西,自然是实现成一个组件,最终要实现的效果是写下这样的代码就可以完成一个可以滑动的视图来:<swipers><swiper>视图1</swiper><swiper>视图2</swiper></swipers>然后要把最基本的组件定义写出来,显然这里要定义两个组件。第一个是父级组件,选择器名字就叫ytm-swipers,目前做的事情仅仅是做一个外壳定义基本样式,使用时的子标签都会插入在ng-content标签中。   1 @Component({
     2       selector: 'ytm-swipers',
     3       template: `
     4         <div>
     5             <ng-content></ng-content>
     6         </div>
     7         `,
     8       styles: [`
     9         .view-body{height: 100%;width:   100%;overflow: hidden;position: relative;}
    10     `]
    11   })第二个就是子视图了,在父级组件下,每个子组件都会沾满父级组件,只有当前的子组件会显示,当切换视图时实际做的就是更改这些子组件的显示方式,说的最简单的话,这个子组件还是仅仅用来加一个子外壳,给外壳添加基本样式,实际的页面内容原封不动放在ng-content标签中。   1 @Component({
     2       selector: 'swiper',
     3       template: `
     4         <div   *ngIf="swiper.displayList.indexOf(childId) >= 0"
     5         [ngClass]="{'active':   swiper.displayList[0] === childId,
     6         'prev': swiper.displayList[2] ===   childId, 'next': swiper.displayList[1] === childId}">
     7               <ng-content></ng-content>
     8         </div>
     9       `,
    10     styles: [`
    11         .view-child{
    12             height: 100%;width:   100%;position: absolute;top: 0;
    13             transition: 0.5s   linear;background: #fff;
    14             overflow-x:   hidden;
    15         }
    16         .view-child.active{left:   0;z-index: 9;}
    17         .view-child.next{left:   100%;z-index: 7;}
    18         .view-child.prev{left:   -100%;z-index: 8;}
    19     `]
    20 })下一步是要让这两个父子组件完成心灵的沟通,讲道理其实可以直接使用ElementRef强行取到DOM来操作,不过这里使用的是组件内服务。和普通的服务使用上没差别,不过其provider是声明在某个组件里的,所以此服务只有在此组件以及子组件中可以注入使用。组件内服务用到的变量包括:   changing变量保证同时只能进行一个切换,保证切换完成才能进行下一个切换;swiperList装填所有的视图的id,这个id在视图初始化的时候生成;displayList数组只会有三个成员,装填的依次是当前视图在swiperList中的索引,下一个视图的索引,上一个视图的索引;current变量用户指示当前显示的视图的id。实际视图中的显示的控制就是使用ngClass指令来根据displayList和视图id附加相应的类,当前视图会正好显示,前一视图会在左边刚好遮挡,后一视图会在右边刚好遮挡。同时服务还要提供几个方法:Add用于添加制定id的视图,Next用于切换到下一个视图(左滑时调用),Prev用于切换到前一个视图(右滑时调用),再来一个Skip用于直接切换到指定id的视图。在子视图中注入此服务,需要在子视图初始化时生成一个id并Add到视图列表中:1   export class YTMSwiperViewComponent {
    2     public childId: number;
    3     constructor(@Optional() @Host()   public swiper: SwiperService) {
    4         this.childId =   this.swiper.swiperList.length;
    5           this.swiper.Add(this.swiper.swiperList.length);
    6     }
    7 }这个id其实就是已有列表的索引累加,且一旦有新视图被初始化,都会添加到列表中(支持动态加入很酷,虽然不知道会有什么隐藏问题发生)。父组件中首先必须要配置一个provider声明服务:   1 @Component({
     2       selector: 'ytm-swipers',
     3       template: `
     4         <div>
     5             <ng-content></ng-content>
     6         </div>
     7         `,
     8       styles: [`
     9         .view-body{height: 100%;width:   100%;overflow: hidden;position: relative;}
    10     `],
    11     providers:   [SwiperService]
    12   })然后就是要监听手势滑动事件,做出相应的切换。以及传入一个current变量,每当此变量更新时都要切换到对应id的视图去,实际使用效果就是:<ytm-swipers   [current]="1">...</ytm-swipers>可以将视图切换到id喂1的视图也就是第二个视图。父组件实现此外代码中还添加了一个回调函数,可以再视图完成切换时执行传入的回调,这个使用的是angular的EventEmitter能力。以上就是全部实现了,实际的使用示例像这样:   1 <ytm-swipers [current]="0"   (onSwiped)="切换回调($event)">
     2       <swiper>
     3         视图1
     4       </swiper>
     5       <swiper>
     6         视图2
     7       </swiper>
     8       <swiper>
     9         视图3
    10     </swiper>
    11   </ytm-swipers>视图的切换有了两种方式,一是手势滑动,不过没有写实时拖动,仅仅是判断左右滑做出反应罢了,二是更新[current]节点的值。整个组件的实现没有使用到angular一些比较底层的能力,仅仅是玩弄css样式以及组件嵌套并通过服务交互,以及Input、Output与外界交互。相比之下ionic的那些组件就厉害深奥多了,笔者还有很长的路要走。    

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之微信频道!

本文由 @凌雪 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程