1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        微信小程序組件開發(fā)——可視化電影選座

        共 8607字,需瀏覽 18分鐘

         ·

        2021-08-31 07:47

        點(diǎn)擊上方 前端Q,關(guān)注公眾號

        回復(fù)加群,加入前端Q技術(shù)交流群

        一. 簡介

        想必很多人都有陪男女朋友去看電影的經(jīng)歷吧,是不是在每次選座的時(shí)候你都要征求女盆友或男盆友的意見,什么?不征求?!那你完了!

        目前市場上許多的電影購票app和小程序中,為了讓觀眾老爺們在線上更好地選擇自己心怡的位置,方便可視化的選座數(shù)據(jù)必不可少,在此, 讓我們一起來看看這個(gè)好用的可視化選座組件吧!

        視圖效果如下:

        效果圖.png

        如果各位看官老爺感興趣的話,請繼續(xù)往下看!

        1. 組件數(shù)據(jù)

        首先呢,我們需要給該組件傳入兩個(gè)數(shù)據(jù),以便顯示組件時(shí)使用,一個(gè)是電影廳的廳號,一個(gè)就是座位的數(shù)組,如下:

        image.png

        廳號:大寫數(shù)字字符串

        座位數(shù)據(jù):數(shù)組點(diǎn)陣,左右的空白用0表示,普通座位用1表示,優(yōu)選座位用2表示,已經(jīng)被其他觀眾選擇的座位用3表示,初始數(shù)據(jù)如下:

        image.png

        組件的 js文件中需聲明傳過來的數(shù)據(jù),與頁面聲明方式不同,組件的properties中聲明數(shù)據(jù)需要寫出數(shù)據(jù)類型。

          properties: {
            seatings: Array,
            hallNumber: String
          },
        復(fù)制代碼

        2. 組件頁面布局

        頁面中有能動的,也有不能動的,當(dāng)然還有自己能動的;這個(gè)組件呢,頂部的標(biāo)識區(qū)屬于靜態(tài)部分和座位區(qū)是可移動的并且可以雙指縮放,具體結(jié)構(gòu)如下:

        image.png

        1. 標(biāo)識區(qū)構(gòu)成

        這個(gè)區(qū)域主要是起提示作用,提示座位的信息,包括了普通區(qū)和優(yōu)選區(qū),當(dāng)然,代碼直接可以偷取座位區(qū)域中的座位的WXSS樣式,用signs_normal和seat_Excellent類名實(shí)現(xiàn)。當(dāng)然,誰不喜歡c位呢~

            <view class="signs_normal">
        <view class="seatNormal"></view> <text>普通區(qū)</text>
        </view>
        <view class="signs_excellent">
        <view class="seatExcellent"></view> <text>優(yōu)選區(qū)</text>
        </view>
        </view>
        復(fù)制代碼
        1. 座位區(qū)構(gòu)成

        這個(gè)部分我們分為了三個(gè)小部分:屏幕,電影廳介紹和座位區(qū), 聽我細(xì)細(xì)道來!

        image.png

        2.1 電影屏幕:

        為實(shí)現(xiàn)熒幕弧形效果,俺們可以通過遮蓋法實(shí)現(xiàn),非常好用! 先通過長方形盒子構(gòu)建熒幕長寬,再用一個(gè)橢圓形大餅的邊緣顯示在長方形盒子里,其他部分用overflow: hidden屬性遮蓋,再調(diào)整背景顏色和邊框顏色即可實(shí)現(xiàn)熒幕效果
        html如下:

        <view class="visual_screen">
           <view class="screen"></view>
        </view>
        復(fù)制代碼

        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%;
        }
        復(fù)制代碼

        2.2 電影廳介紹:

        這部分相對來說較為簡單,直接插入傳輸過來的數(shù)據(jù),微調(diào)樣式即可

        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;
        }
        復(fù)制代碼

        2.3 座位區(qū)域:

        基礎(chǔ)結(jié)構(gòu):

        1. 基礎(chǔ)單位 :由于設(shè)定座位的寬度為基本單位vw,便于統(tǒng)一單位和機(jī)型配適,所以我這里將高度也以vw為單位進(jìn)行設(shè)計(jì)

        2. 座位樣式 : 我們通過之前傳輸過來的座位數(shù)組可知,我們的座位形式有五種,分別是:seatNormal(普通座位)、seatExcellent(優(yōu)選座位)、seatNone(空白座位)、seatChosen(不可選座位)和selected(當(dāng)前已選座位),這里座位的基礎(chǔ)樣式是一樣的可以統(tǒng)一,再單獨(dú)寫各自獨(dú)特的樣式。其中空白座位只要設(shè)置邊框顏色為透明就可以達(dá)到效果。

        .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);
        }
        復(fù)制代碼

        推薦 好用的樣式:在wxss中我們用到了一個(gè)非常好用的樣式 “box-sizing: border-box;”,這個(gè)樣式為元素設(shè)定的寬度和高度決定了元素的邊框盒。就是說,為元素指定的任何內(nèi)邊距和邊框都將在已設(shè)定的寬度和高度內(nèi)進(jìn)行繪制,通過從已設(shè)定的寬度和高度分別減去邊框和內(nèi)邊距才能得到內(nèi)容的寬度和高度,便于控制元素大小。

        1. **總體布局** :座位區(qū)域使用的是彈性布局display:flex,并使用flex-wrap: wrap,讓座位填滿后自動換行,大盒子包住一個(gè)盒子,讓里面的盒子彈性居中,達(dá)到整體居中的效果。
        .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;
        }
        復(fù)制代碼
        1. 可移動可縮放區(qū)域: 由于方便座位選擇,我們設(shè)定座位區(qū)域可移動,并可通過雙指縮放的,所以我們需要用到微信小程序的一個(gè)API:movable-area[1]和 movable-view[2]。

        movable-area: 這個(gè)區(qū)域必須設(shè)置width和height屬性,不設(shè)置則默認(rèn)為10px,同時(shí),當(dāng)movable-view小于movable-area時(shí),movable-view的移動范圍是在movable-area內(nèi), 當(dāng)movable-view大于movable-area時(shí),movable-view的移動范圍必須包含movable-area(x軸方向和y軸方向分開考慮)。

        movable-view: 標(biāo)簽屬性設(shè)定移動方向全方位direction="all";支持雙指縮放scale="{{true}}";最大最小縮放倍數(shù)scale-min="0.3"和scale-max="1.5";如果想綁定觸發(fā)條件還可以添加綁定方法,拖動綁定事件:bindchange,縮放綁定事件bindscale等等

        little tips: 由于movable-view區(qū)域在放大時(shí), 所處的x, y坐標(biāo)不變會導(dǎo)致view區(qū)域會超出area區(qū)域. 為了view可移動區(qū)域不遮擋上方元素, 所以可采取減少放大倍數(shù)上限并可在上方添加一些空白區(qū)域, 增加頁面美觀性.
        詳細(xì)用法參考微信小程序官網(wǎng)手冊: developers.weixin.qq.com/miniprogram…[3]

        3. 組件業(yè)務(wù)邏輯

        1. 座位數(shù)據(jù)輸出 : 上回說到,座位數(shù)據(jù)是由數(shù)組存儲的,里面不同的座位用不同的數(shù)字表現(xiàn), 所以我們在輸出數(shù)據(jù)時(shí)需要作判斷. 這里通過block標(biāo)簽對數(shù)組數(shù)據(jù)循環(huán)輸出, 然后判斷數(shù)組數(shù)據(jù), 輸出不同的格式.
        image.png
        1. 選擇座位 : 要做到在用戶點(diǎn)擊某個(gè)座位時(shí), 那個(gè)座位樣式改變并記錄座位數(shù)據(jù).
          首先, 需要傳輸在循環(huán)時(shí)的下標(biāo)數(shù)據(jù)wx:for="{{seatings}}" wx:key="Index" data-index="index", 每個(gè)座位的view中綁定selected事件, 在js文件selected方法中收到下標(biāo)數(shù)據(jù);

          我們需要用到已選擇座位的總數(shù)(限制為六個(gè))和下標(biāo)數(shù)組(儲存已點(diǎn)擊的座位)兩個(gè)數(shù)據(jù), 所以我們在data中聲明selectedIndex: [ ], selectedNum: 0, methods方法中聲明方法;

          selected方法邏輯 : 先保存下標(biāo)index, 判斷下標(biāo)數(shù)組中是否存在該元素(使用數(shù)組的indexOf()方法), 若存在,則表明之前已選擇現(xiàn)在再次點(diǎn)擊取消, 需刪除將改下標(biāo)從下標(biāo)數(shù)組在刪除,總已選擇座位數(shù)減一 ; 否則不存在則判斷已選擇總數(shù)是否小于6,小于則將該數(shù)據(jù)插入數(shù)組中, 總已選擇座位數(shù)加一, 不小于提示最多選擇六張票;

          這個(gè)時(shí)候,我們就有了下表數(shù)據(jù)啦,就可進(jìn)行更多更復(fù)雜的業(yè)務(wù)操作啦?。?/p>

          tip : 由于數(shù)組沒有移除某個(gè)元素的方法 , 所以另外聲明remove()方法, 先獲取元素下標(biāo)再刪除.

        image.png
        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;
              }
        復(fù)制代碼
        1. 已選樣式改變 : 在座位view中, 我們用到了三元運(yùn)算符進(jìn)行數(shù)據(jù)判斷: class="{{tools.indexOf(selectedIndex, index)?'selected': ''}}"
          若前面的結(jié)果為true即數(shù)組中存在這個(gè)數(shù)據(jù)的下標(biāo), 則添加selected類名, 座位樣式改變; 否則添加空類名.

          tips : 由于數(shù)組的indexOf方法在wxml中失效, 所以我們需要在pages同級目錄下util文件夾中聲明一個(gè)indexOf函數(shù)供三元運(yùn)算調(diào)用,自己動手豐衣足食!使用時(shí)只需通過 wxs src="../../util/indexof.wxs" module="tools" 進(jìn)行聲明, 就可使用 tools.indexOf 方法,效果和數(shù)組自帶的indexOf方法是一樣一樣的~

        image.png
        // indexOf方法
        function indexOf(arr, value) {
          if (arr.indexOf(value) < 0) {
              return false;
          } else {
              return true;
          }
        }
        module.exports.indexOf = indexOf;
        復(fù)制代碼

        具體組件源碼如有需要的話,請?jiān)趃itee中獲取哦!
        gitee.com/jensmith/so…[4]

        如果大家覺得這篇文章對大家有幫助的話 , 請多多支持該文章 , 多多點(diǎn)贊哦?!!

        emo3.jpg

        關(guān)于本文

        來源:Jusen_Fu

        https://juejin.cn/post/6996913047725932575


        內(nèi)推社群


        我組建了一個(gè)氛圍特別好的騰訊內(nèi)推社群,如果你對加入騰訊感興趣的話(后續(xù)有計(jì)劃也可以),我們可以一起進(jìn)行面試相關(guān)的答疑、聊聊面試的故事、并且在你準(zhǔn)備好的時(shí)候隨時(shí)幫你內(nèi)推。下方加 winty 好友回復(fù)「面試」即可。



        往期推薦


        大廠面試過程復(fù)盤(微信/阿里/頭條,附答案篇)
        面試題:說說事件循環(huán)機(jī)制(滿分答案來了)
        專心工作只想搞錢的前端女程序員的2020
        瀏覽 50
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            非洲一级片 | 精品人妻一区二区三区蜜桃 | 久久九九女女男女热 | 无码免费AAAAAAAAA软件 | 性欧美肥妇 | 内射美女在线观看 | 久热精品在线观看视频 | 开心五月天.色网 | 视频一区豆花 | 亚洲欧美日韩不卡 |