微信小程序组件开发之可视化电影选座功能

目录
  • 一. 简介
    • 1. 组件数据
  • 2. 组件页面布局
    • 1. 标识区构成
    • 2.座位区构成
      • 2.1 电影屏幕:
      • 2.2 电影厅介绍:
      • 2.3 座位区域:
    • 3. 组件业务逻辑
  • 总结

一. 简介

想必很多人都有陪男女朋友去看电影的经历吧,是不是在每次选座的时候你都要征求女盆友或男盆友的意见,什么?不征求?!那你完了!

目前市场上许多的电影购票app和小程序中,为了让观众老爷们在线上更好地选择自己心怡的位置,方便可视化的选座数据必不可少,在此, 让我们一起来看看这个好用的可视化选座组件吧!

视图效果如下:

如果各位看官老爷感兴趣的话,请继续往下看!

1. 组件数据

首先呢,我们需要给该组件传入两个数据,以便显示组件时使用,一个是电影厅的厅号,一个就是座位的数组,如下:

厅号:大写数字字符串

座位数据:数组点阵,左右的空白用0表示,普通座位用1表示,优选座位用2表示,已经被其他观众选择的座位用3表示,初始数据如下:

组件的 js文件中需声明传过来的数据,与页面声明方式不同,组件的properties中声明数据需要写出数据类型。

  properties: {
    seatings: Array,
    hallNumber: String
  },

2. 组件页面布局

页面中有能动的,也有不能动的,当然还有自己能动的;这个组件呢,顶部的标识区属于静态部分和座位区是可移动的并且可以双指缩放,具体结构如下:

1. 标识区构成

这个区域主要是起提示作用,提示座位的信息,包括了普通区和优选区,当然,代码直接可以偷取座位区域中的座位的WXSS样式,用signs_normal和seat_Excellent类名实现。 当然,谁不喜欢c位呢~

    <view class="signs_normal">
      <view class="seatNormal"></view> <text>普通区</text>
    </view>
    <view class="signs_excellent">
      <view class="seatExcellent"></view> <text>优选区</text>
    </view>
  </view>

2.座位区构成

这个部分我们分为了三个小部分:屏幕,电影厅介绍和座位区, 听我细细道来!

2.1 电影屏幕:

为实现荧幕弧形效果,俺们可以通过遮盖法实现,非常好用! 先通过长方形盒子构建荧幕长宽,再用一个椭圆形大饼的边缘显示在长方形盒子里,其他部分用overflow: hidden属性遮盖,再调整背景颜色和边框颜色即可实现荧幕效果

html如下:

<view class="visual_screen">
   <view class="screen"></view>
</view>

wxss如下:

.visual_screen {
  height: 30rpx;
  width: 100%;
  display: flex;
  justify-content: center;
  overflow: hidden;
  margin-bottom: 10rpx;
}
.screen {
  margin-top: 0;
  padding: 0;
  height: 30vw;
  width: 100vw;
  box-sizing: border-box;
  border: 15rpx solid #c9cdd3;
  border-radius: 50%;
}

2.2 电影厅介绍:

这部分相对来说较为简单,直接插入传输过来的数据,微调样式即可

wxml:

wxml:
<view class="visual_title">{{hallNumber}}号厅-(请佩戴口罩、1.3米以上儿童购票)</view>
wxss:
.visual_title {
  font-size: 23rpx;
  width: 100%;
  height: 20rpx;
  text-align: center;
  color: #6d6d6d;
  margin-bottom: 30rpx;
}

2.3 座位区域:

基础结构:

基础单位 :由于设定座位的宽度为基本单位vw,便于统一单位和机型配适,所以我这里将高度也以vw为单位进行设计

座位样式 : 我们通过之前传输过来的座位数组可知,我们的座位形式有五种,分别是:seatNormal(普通座位)、seatExcellent(优选座位)、seatNone(空白座位)、seatChosen(不可选座位)和selected(当前已选座位),这里座位的基础样式是一样的可以统一,再单独写各自独特的样式。其中空白座位只要设置边框颜色为透明就可以达到效果。

.seatNormal, .seatExcellent, .seatNone, .seatChosen {
  height: 4vw;
  width: 4vw;
  margin: 1vw;
  border-radius: 8rpx;
  box-sizing: border-box;
}
.seatNormal {
  border: 1rpx solid #63c0c0;
}
.seatChosen {
  border: 1rpx solid red;
  background-color: red;
}
.selected {
  border: 1rpx solid #05ca90;
  background-color: #05ca90;
}
.seatExcellent {
  border: 1rpx solid #f18e14;
}
.seatNone {
  border: 1rpx solid rgba(0, 0, 0, 0);
}

推荐 好用的样式:在wxss中我们用到了一个非常好用的样式 “box-sizing: border-box;”,这个样式为元素设定的宽度和高度决定了元素的边框盒。就是说,为元素指定的任何内边距和边框都将在已设定的宽度和高度内进行绘制,通过从已设定的宽度和高度分别减去边框和内边距才能得到内容的宽度和高度,便于控制元素大小。

总体布局 :座位区域使用的是弹性布局display:flex,并使用flex-wrap: wrap,让座位填满后自动换行,大盒子包住一个盒子,让里面的盒子弹性居中,达到整体居中的效果。

.visual_seatings {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 43vw;
}
.visual_seating {
  width: 90%;
  height: 43vw;
  display: flex;
  flex-wrap: wrap;
}

可移动可缩放区域: 由于方便座位选择,我们设定座位区域可移动,并可通过双指缩放的,所以我们需要用到微信小程序的一个API:movable-areamovable-view

movable-area: 这个区域必须设置width和height属性,不设置则默认为10px,同时,当movable-view小于movable-area时,movable-view的移动范围是在movable-area内, 当movable-view大于movable-area时,movable-view的移动范围必须包含movable-area(x轴方向和y轴方向分开考虑)。

movable-view: 标签属性设定移动方向全方位direction="all"; 支持双指缩放scale="{{true}}";最大最小缩放倍数scale-min="0.3"和scale-max="1.5";如果想绑定触发条件还可以添加绑定方法,拖动绑定事件:bindchange,缩放绑定事件bindscale等等

little tips:  由于movable-view区域在放大时, 所处的x, y坐标不变会导致view区域会超出area区域. 为了view可移动区域不遮挡上方元素, 所以可采取减少放大倍数上限并可在上方添加一些空白区域, 增加页面美观性.

详细用法参考微信小程序官网手册:
developers.weixin.qq.com/miniprogram

3. 组件业务逻辑

座位数据输出 : 上回说到,座位数据是由数组存储的,里面不同的座位用不同的数字表现, 所以我们在输出数据时需要作判断. 这里通过block标签对数组数据循环输出, 然后判断数组数据, 输出不同的格式.

选择座位 : 要做到在用户点击某个座位时, 那个座位样式改变并记录座位数据. 首先, 需要传输在循环时的下标数据wx:for="{{seatings}}" wx:key="Index" data-index="index", 每个座位的view中绑定selected事件, 在js文件selected方法中收到下标数据;

我们需要用到已选择座位的总数(限制为六个)和下标数组(储存已点击的座位)两个数据, 所以我们在data中声明selectedIndex: [ ], selectedNum: 0, methods方法中声明方法;

selected方法逻辑 : 先保存下标index, 判断下标数组中是否存在该元素(使用数组的indexOf()方法), 若存在,则表明之前已选择现在再次点击取消, 需删除将改下标从下标数组在删除,总已选择座位数减一 ; 否则不存在则判断已选择总数是否小于6,小于则将该数据插入数组中, 总已选择座位数加一, 不小于提示最多选择六张票;

这个时候,我们就有了下表数据啦,就可进行更多更复杂的业务操作啦!!

tip : 由于数组没有移除某个元素的方法 , 所以另外声明remove()方法, 先获取元素下标再删除.

selected(e) {
      let index = e.currentTarget.dataset.index;
      if(this.data.selectedIndex.indexOf(index) != -1){
        let selectedIndex =  this.remove(this.data.selectedIndex, index);
        let selectedNum = this.data.selectedNum - 1;
        this.setData({
          selectedIndex,
          selectedNum
        })
      }else{
        if(this.data.selectedNum < 6){
        let selectedNum = this.data.selectedNum + 1;
        let selectedIndex = this.data.selectedIndex.concat(index);
            this.setData({
              selectedIndex,
              selectedNum
            })
        }else{
            wx.showToast({
              title: '最多选择六张票',
              })
            }
        }
    },
    remove(arr, ele) {
      var index = arr.indexOf(ele);
      if (index > -1) {
      arr.splice(index, 1);
        }
        return arr;
      }

已选样式改变 : 在座位view中, 我们用到了三元运算符进行数据判断: class="{{tools.indexOf(selectedIndex, index)?'selected': ''}}" 若前面的结果为true即数组中存在这个数据的下标, 则添加selected类名, 座位样式改变; 否则添加空类名.

tips : 由于数组的indexOf方法在wxml中失效, 所以我们需要在pages同级目录下util文件夹中声明一个indexOf函数供三元运算调用,自己动手丰衣足食! 使用时只需通过 wxs src="../../util/indexof.wxs" module="tools" 进行声明, 就可使用 tools.indexOf 方法,效果和数组自带的indexOf方法是一样一样的~

// indexOf方法
function indexOf(arr, value) {
  if (arr.indexOf(value) < 0) {
      return false;
  } else {
      return true;
  }
}
module.exports.indexOf = indexOf;

具体组件源码如有需要的话,请在gitee中获取哦!
gitee.com/jensmith/so

总结

到此这篇关于微信小程序组件开发之可视化电影选座功能的文章就介绍到这了,更多相关小程序可视化电影选座内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 微信小程序组件开发之可视化电影选座功能

    目录 一. 简介 1. 组件数据 2. 组件页面布局 1. 标识区构成 2.座位区构成 2.1 电影屏幕: 2.2 电影厅介绍: 2.3 座位区域: 3. 组件业务逻辑 总结 一. 简介 想必很多人都有陪男女朋友去看电影的经历吧,是不是在每次选座的时候你都要征求女盆友或男盆友的意见,什么?不征求?!那你完了! 目前市场上许多的电影购票app和小程序中,为了让观众老爷们在线上更好地选择自己心怡的位置,方便可视化的选座数据必不可少,在此, 让我们一起来看看这个好用的可视化选座组件吧! 视图效果如下:

  • VUE 组件转换为微信小程序组件的方法

    简介: 首先我们介绍一下本文的关键点:抽象语法树,它是以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构. 通过操作这棵树,可以精确的定位到声明.赋值.运算语句,从而实现对代码的优化.变更等操作. 本文通过对 VUE 组件的 JavaScript .CSS模块进行转换,比如 JavaScript模块,包括外层对象,生命周期钩子函数,赋值语句,组件的内部数据,组件的对外属性等等来实现把一个 VUE 组件转换为 一个小程序组件. AST 抽象语法树,似乎我们平时并不会接触到.

  • 微信小程序云开发详细教程

    微信小程序云开发之初体验,供大家参考,具体内容如下 小程序云开发是微信最近推出的新的一项能力,它弱化了后端以及运维的概念,开发者无需搭建服务器,使用微信平台提供的api即可完成核心的业务开发. 目前提供三大基础能力支持: 云函数:在云端运行的代码,微信私有协议天然鉴权,开发者只需编写自身业务逻辑代码 数据库:既可在小程序前端操作,也能在云函数中读写的 JSON 数据库,免费2G容量 存储:可在小程序前端上传/下载云端文件,在云开发控制台可视化管理,免费5G容量 上手体验 打开微信开发者工具,新建

  • 我要点爆”微信小程序云开发之项目建立与我的页面功能实现

    开发环境搭建 使用自己的AppID新建小程序项目,后端服务选择小程序·云开发,点击新建,完成项目新建. 新建成功后跳转到开发者工具界面 新建后,微信端为我们提供了一个参考的模板程序,这里我们自己来创建各个所需的文件与代码,所以删除所有不需要的文件,删除cloudfunctions.miniprogram/images.miniprogram/pages文件下所有文件,同时也删除style文件和删除app.json中原始的页面配置. 此时编译下方控制台会报"VM8100:5 appJSON[&qu

  • 微信小程序的开发范式BeautyWe.js入门详解

    一个简单的介绍 BeautyWe.js 是什么? 它是一套专注于微信小程序的企业级开发范式,它的愿景是: 让企业级的微信小程序项目中的代码,更加简单.漂亮. 为什么要这样命名呢? Write beautiful code for wechat mini program by the beautiful we! 「We」 既是我们的 We,也是微信的 We,Both beautiful! 那么它有什么卖点呢? 专注于微信小程序环境,写原汁原味的微信小程序代码. 由于只专注于微信小程序,它的源码也很

  • 微信小程序canvas开发水果老虎机的思路详解

    在这个超长假期中,无聊...,所以动手做一个早就计划要做的小玩意, 水果老虎机 ,嗯,这是一个小程序而不是小游戏... 使用结构还是canvas? 使用模板结构(view)生成水果盘的好处一是用户可自定义产出 n x n 的定制化老虎机,二是容易通过算法样式生成布局,三是通过 wx.selectQueryAll 的方法能够很方便的抓到定位数据.但,问题是动画性能过于孱弱,如图构建一个 7x7 的水果盘,动画性能估计会惨不忍睹,而且纯粹模板结构无论使用 animation 动画方法还是 css 的

  • 详解Linux 下开发微信小程序安装开发工具

    详解Linux 下开发微信小程序安装开发工具 1. git clone https://github.com/yuan1994/wechat_web_devtools 然后创建一个文件夹 mkdir /opt/tencent/ 移动文件 mv ./wechat_web_devtools /opt/tencent 修改用户组 chown -R root:root /opt/tencent/wechat_web_devtools 启动测试工具 /opt/tencent/wechat_web_devt

  • 微信小程序 Linux开发环境设置详解

    微信小程序 Linux开发环境 微信小程序开发工具是用nw.js实现的,这玩意本来就可以跨平台的.搞不懂为什么微信只出了windows和mac版.今天我捣腾了一下,可以在linux下开发微信小程序了.以ubuntu为例: 首先要安装nwjs sdk环境,因为需要devtool的支援, 一定要安装sdk版本. 下载nwjs sdk压缩包之后解压放到你喜欢的位置,并且设置环境变量,nw可执行文件加入到path变量中. 接下来要去提取微信小程序开发工具的package.nw文件,这是nwjs的项目包文

  • 微信小程序组件 contact-button(客服会话按钮)详解及实例代码

    微信小程序组件 contact-button contact-button 客服会话按钮,用于在页面上显示一个客服会话按钮,用户点击该按钮后会进入客服会话. 属性名 类型 默认值 说明 size Number 18 会话按钮大小,有效值 18-27,单位:px type String default-dark 会话按钮的样式类型,有效值 default-dark, default-light session-from String   用户从该按钮进入会话时,开发者将收到带上本参数的事件推送.本

  • 微信小程序组件 marquee实例详解

    微信小程序组件 marquee实例详解 1. marquee标签 html是有marquee标签的,可以实现跑马灯效果,但小程序没有,所以要实现.这里考虑使用css3的animation实现. html的marquee是这样使用的. <marquee direction="left" behavior="scroll" scrollamount="1" scrolldelay="0" loop="-1"

随机推荐