1. 程式人生 > >自定義元件實現底部彈出選單

自定義元件實現底部彈出選單

1.效果圖

點選客服按鈕,從底部彈出選單欄

點選微信線上客服,可以喚起微信客服

2.為什麼要自己寫選單欄?

微信原生的選單欄不支援直接喚起微信客服唄,難受==
不想說話了,貼程式碼

3.程式碼段

  1. 定義元件
<!--components/customerService/customerService.wxml-->
<view class="customer_service_wrap" wx:if="{{isShowCustomerService}}">
    <view class="overlay" animation
="{{fadeInOrOut}}" bindtap="cancleCallService">
</view> <view class="menu_list" animation="{{slideInOrOut}}"> <view class="menu_top"> <button class="menu_item" open-type="contact" send-message-title="{{sku_info.name}}"
<!--這幾項是為了使用者開啟客服會話時,快捷傳送商品圖片和連結的,跟淘寶一個套路-->
send-message-path="{{service_url}}" send-message-img="{{sku_info.pictures_arr[0]}}" show-message-card="true">微信線上客服</button> <view class="line">
</view> <button class="menu_item" bindtap="callService">客服電話: {{service_phone}}</button> </view> <view class="menu_item cancle" bindtap="cancleCallService">取消</view> </view> </view>
// components/customerService/customerService.js
import utils from '../../utils/util'
const appInstance = getApp()
Component({
  /**
   * 元件的屬性列表
   */
  properties: {
      sku_info:{
          type: Object,
          value: {}
      },
      isShowCustomerService: {
          type: Boolean,
          value: false,
          observer: 'serviceHandle'
      }
  },

  /**
   * 元件的初始資料
   */
  data: {
      service_url: '',
      service_phone: '4006655566',
      slideInOrOut: {},
      fadeInOrOut: {},
      translateLeft: null,
      translateTop: null
  },
    created(){
      var fadeInOrOutAnimation = wx.createAnimation({
          duration: 700,
          timingFunction: 'ease',
      })
      this.fadeInOrOutAnimation = fadeInOrOutAnimation

      var slideInOrOutAnimation = wx.createAnimation({
          duration: 700,
          timingFunction: 'ease',
          transformOrigin: '50% 50% 0'
      })
      this.slideInOrOutAnimation = slideInOrOutAnimation

        try {
            var res = wx.getSystemInfoSync()
            this.setData({
                screenWidth: res.screenWidth,
                screenHeight: res.screenHeight,
                translateLeft: 710/2/750*res.screenWidth,
                translateTop: 340/750*res.screenWidth
            })
        } catch (e) {
            // Do something when catch error
        }
  },
    onShow(){
        this.setData({
            // 獲取微信客服用分享連結
            service_url: utils.getCurrentPageUrl(),
            service_phone:  this.data.service_phone
        })
    },
  /**
   * 元件的方法列表
   */
  methods: {
      serviceHandle: function(newVal, oldVal){
          if(newVal === true){
              this.fadeInOrOutAnimation.opacity(0.5).step();
              this.slideInOrOutAnimation.translate(-this.data.translateLeft, -this.data.translateTop).step();

              setTimeout(function () {
                  this.setData({
                      fadeInOrOut: this.fadeInOrOutAnimation.export(),
                      slideInOrOut: this.slideInOrOutAnimation.export(),
                  })
              }.bind(this),100)

          }
      },
      callService: function () {
          var that = this;
          wx.makePhoneCall({
              phoneNumber: that.data.service_phone
          })

      },
      cancleCallService: function () {
          this.fadeInOrOutAnimation.opacity(0).step();
          this.slideInOrOutAnimation.translate(-this.data.translateLeft, this.data.translateTop).step();
          this.setData({
              fadeInOrOut: this.fadeInOrOutAnimation.export(),
              slideInOrOut: this.slideInOrOutAnimation.export(),
          })
          setTimeout(function () {
              this.setData({
                  isShowCustomerService: false
              })
          }.bind(this),300)
      }
  }
})
// components/customerService/customerService.js
{
  "component": true
}

2.使用客服元件

 <!-- index.html -->
<customer-service wx:if="{{canIUseDataProxy}}" sku_info="{{sku_info}}" isShowCustomerService="{{isShowCustomerService}}"></customer-service>
//index.js
{
  "usingComponents": {
    "customer-service": "/components/customerService/customerService"
  }
}

4. 相容性

用了自定義元件的observer屬性,文件說從1.6.3開始支援 , 親測1.9.9 向下有幾個基礎庫都不相容,做了查詢當前版本庫,低的話降低處理

5.用自定義元件還是模版?

這取決於你只是想複用一段UI樣式,還是想實現一個可複用的小功能?你懂得吧

相關推薦

定義元件實現底部選單

1.效果圖 點選客服按鈕,從底部彈出選單欄 點選微信線上客服,可以喚起微信客服 2.為什麼要自己寫選單欄? 微信原生的選單欄不支援直接喚起微信客服唄,難受== 不想說話了,貼程式碼 3.程式碼段 定義元件

Android DialogFragment實現底部選單效果

底部彈出式選單, 可以使用PopupWindow來做,也可以用自定義View來做。當然這裡採用DialogFragment來做。 DialogFragment是3.0之後引入的,使用DialogFragment,我們不用管理其生命週期,並且可以作為元件重用。比

Android開發-實現底部選單

效果圖: activity_main: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and

使用CoordinatorLayout實現底部選單

第一步:新增依賴: compile "com.android.support:design:${project.properties.get("support")}" 第二步:佈局引用: &

[Android] 仿IOS實現定義Dialog,底部窗和中間窗工具

用過Android的預設對話方塊的都懂,不管是哪個版本的對話方塊,都醜到爆!就算是Google推崇的Material Design風格的彈窗一樣不好看,基本每款APP都不會去使用預設的對話方塊樣式,他們都有自己的風格,怎樣去改變預設的對話方塊樣式呢?只能自定義了,將系統對話方

Vue定義元件實現按鈕許可權功能

在這之前請看我上一篇部落格https://blog.csdn.net/qq_41594146/article/details/83381964,這裡有思路和資料庫設定,之前做的是沒有元件化,也就是單純的v-for迴圈直接顯示,剛剛寫了按鈕許可權的元件,現在貼上程式碼\ var myBu

vue定義元件實現v-model雙向繫結

vue中父子元件通訊,都是單項的,直接在子元件中修改prop傳的值vue也會給出一個警告,接下來就用一個小列子一步一步實現了vue自定義的元件實現v-model雙向繫結,父元件值變了子元件也會跟著變,子元件中傳過來的值變了,父元件值也會跟著變化。如有錯誤的地方歡迎評論指出 父級元件

使用vue定義元件實現樹形列表

最近公司做新專案用的是vue,有一個功能做一個樹形列表由於之前一直用的是jquery操作dom,剛接觸vue走了不少彎路,特意寫部落格記錄一下 一、js自定義一個元件       <script type="text/template" id

定義小程式popupwindow

在上方彈出 wxml <view class="zan-dialog {{ showDialog ? 'zan-dialog--show' : '' }}"> <view class="zan-dialog__mask" bindtap=

高仿element-ui定義上角標

最近要寫個彈框,發現element-ui彈框樣式還可以,就copy下來改吧改吧。 html程式碼 <!--彈框--> <div class="el-dropdown-menu el-popper" :style="'position: absolute; top:

微信小程式定義元件實現地址單級連續選擇(拼多多APP地址選擇樣式)

最終效果在 首先在page資料夾下建立components資料夾,在components資料夾下建立region-picker的資料夾,然後在region-picker資料夾下建立Component名稱為region-picker。 region-picke

定義PopupWindow,點選PopupWindow,背景變暗,仿點選分享

注:參照大神程式碼寫的 自定義程式碼 package com.duanlian.popupwindowdemo; import android.app.Activity; import android.content.Context; import android.g

Angular2中定義元件實現雙向繫結

    在Angular2中的資料流動是單向的,我們常見的雙向繫結的例子如下:<input [(ngModel)]="value"/>等價於<input [ngModel]="value" (ngModelChange)="valueChange($even

android定義dialog,軟體鍵盤擋住輸入區域解決

在做新浪oauth2.0認證時,裡面有一個自定義dialog的類。dialog中載入的是一一個webview。當鍵盤彈起的時候就會彈住輸入區域。 解決辦法: 在dialog的oncarete方法中加  getWindow().setSoftInputMode(WindowManager.LayoutPara

android 底部選單

好久沒寫筆記了,好不容易今天有空,就分享一下android底部彈出選單的效果。 主要用popupwindow來實現。 先看一下效果圖: 點選按鈕就可以建立一個底部選單了。 現在來看程式碼: 首先在res目錄下新建anim目錄,在anim目錄下建兩個

使用微信小程式定義元件實現的tabs選項卡功能

一個自定義元件由 json wxml wxss js 4個檔案組成。要編寫一個自定義元件,首先需要在 json 檔案中進行自定義元件宣告(將 component 欄位設為 true 可這一組檔案設為自定義元件) components/navigator/i

微信中MMAlert(半透明底部選單)的使用介紹

如果大家時常用過微信或者用過iphone,就會發現有種從底部彈出的半透明選單,這種選單風格優美並且使用者體驗良好,先看一下效果。 MMAlert來自微信開放平臺的sdk示例,其示例的程式碼有點亂,我做了刪減和整理,只保留了MMAlert這個類的一部分功能,即只保留了

Android安卓定義底部對話方塊

努力不一定立刻會有好的結果,但一定是朝著好的方向                           ——李尚龍 《你所謂的穩定,不過是在浪費生命》

微信小程式之 動畫 —— 定義底部

wxml: <view class='buy' bindtap='showBuyModal'>立即購買</view> <!-- 點選立即購買 彈出購買遮罩層 --> <view class="cover_screen" bindtap="hideBuyModal"

微信小程序之 動畫 —— 定義底部

modals num view radi let art time cit 點擊 wxml: <view class='buy' bindtap='showBuyModal'>立即購買</view> <!--