<acronym id="indot"><dfn id="indot"></dfn></acronym>
<span id="indot"></span>

<bdo id="indot"><meter id="indot"></meter></bdo>
<label id="indot"><samp id="indot"></samp></label>
<label id="indot"><xmp id="indot">
  • <span id="indot"><table id="indot"></table></span>
    <center id="indot"><optgroup id="indot"></optgroup></center>
  • <bdo id="indot"><meter id="indot"></meter></bdo>
      當前位置:首頁 > javascript > vue > 正文內容

      UniApp H5項目指南:處理二維碼生成和掃描操作

      hxing6412年前 (2023-11-03)vue2388

      在我們基于UniApp的H5項目中,需要生成一些二維碼進行展示,另外也需要讓用戶可以掃碼進行一定的快捷操作,本篇隨筆介紹一下二維碼的生成處理和基于H5的掃碼進行操作。二維碼的生成,使用了JS文件weapp-qrcode.js進行處理,而二維碼掃碼則是基于一個第三方組件的方式進行支持的,最后通過統一入口來支持不同平臺的掃碼操作。


      1、二維碼的生成處理

      二維碼的生成,使用了JS文件weapp-qrcode.js進行處理的。因此我們在頁面或者組件使用它的時候,需要引入JS文件才能調用。

      import qrCode from '@/libs/weapp-qrcode.js';

      我們為二維碼的展示,創建一個自定義組件,用來展示二維碼信息以及一些說明信息,如下所示。

      <view class="hidden-box">
      	<!-- <view class="code-tit">二維碼</view> -->
      	<view class="qrcode-box">
      		<tui-no-data v-if="!code" :fixed="false" imgUrl="/static/image/img_nodata.png">暫未生成二維碼 </tui-no-data>
      		<view class="qrcode" v-else>
      			<canvas :style="{ width: qrcode_w + 'px', height: qrcode_w + 'px' }" canvas-id="qrcode" id="qrcode"></canvas>
      		</view>
      	</view>
      	<view class="explain" v-if="desc.length > 0">使用說明</view>
      	<view class="explain-text" v-for="(items, index) in desc" :key="items">{{ items }} </view>
      </view>

      如果沒有生成二維碼的所示,我們用一個空圖片代替,如下效果所示。

      8867-20220921115327990-627447190.png

      二維碼生成的時候,接收一個控件id,以及二維碼的值,生成函數代碼如下所示。


      // 二維碼生成工具    
      qrcode(text, canvasId) {        
          // console.log(text, canvasId)
          new qrCode(canvasId, {
              text: text,
              width: this.qrcode_w,
              height: this.qrcode_w,
              colorDark: '#000000',
              colorLight: '#ffffff',
              correctLevel: qrCode.CorrectLevel.H
          });
      }

      在添加一個方法對展示進行折疊處理,那么具體如下所示。


      showDetail() {
          this.visible = !this.visible;
          if (this.visible) {
              setTimeout(() => {
                  this.qrcode(this.code, 'qrcode');
              }, 60);
          }
      },

      在測試頁面中,導入剛才的二維碼自定義組件,然后以普通的組件一樣使用它即可。

      <qrcode-info :code="entity.qrCode"></qrcode-info>

      隨便弄一個二維碼的值,生成二維碼后的界面測試效果如下所示。

      8867-20220921114651855-1057004405.png


      2、二維碼的掃碼操作

      我們知道,基于UniApp的程序中,內置有掃碼操作

      uni.scanCode(OBJECT)

      地址是:https://uniapp.dcloud.net.cn/api/system/barcode.html#scancode

      不過該接口卻不能在H5中調用掃碼處理,

      8867-20220921120001183-1370651862.png


      如果需要在H5應用中掃碼,那么需要另辟蹊徑,如果使用基于微信的SDK進行,還需要一系列的操作很麻煩,而且H5掃碼一般需要https的支持才能調用攝像頭的。

      我在GitHub上搜索了一些基于H5掃碼的項目,好像效果都不是很理想,估計是沒有找到好的案例。在不經意間,發現《H5調用攝像頭識別二維碼》(需要https環境才能使用)效果挺好,就下來整合在項目中使用。

      8867-20220921120357113-294180138.png


      為了方便通用的掃碼處理,我們這里定義了一個通用的掃碼頁面scan-qrcode.vue ,其他地方需要掃碼的,統一定位到該頁面處理即可。

      在頁面代碼中,我們引入上面的二維碼掃描組件即可,如下代碼所示。

      <template>
          <view class="container">
              <get-qrcode @success='qrcodeSucess' @error="qrcodeError"></get-qrcode>
          </view>
      </template>
      <script>
          import getQrcode from '@/pages/components/GetQrcode/getQrcode.vue'
          export default {
              components: {
                  getQrcode
              },



      另外定義一個to參數,用來判斷頁面轉到那里去的。


      data() {
          return {
              to: '' //頁面帶過來的to地址
          }
      },
      onLoad(options) {
          this.to = options?.to;
      }


      同時定義兩個方法,一個是成功處理的,一個是出錯的提示的。


      qrcodeSucess(data) {
          if (uni.$u.test.url(data)) {
              let url = data;
              console.log(url)
              if (url.indexOf('#') > 0) {
                  let pageurl = url.split('#')[1];
                  console.log(pageurl);
                  //在頁面地址后增加一個to參數
                  let toUrl = uni.$u.test.isEmpty(this.to) ? pageurl : (pageurl + `&to=${this.to}`)
                  uni.navigateTo({
                      url: toUrl
                  })
              } else {
                  uni.$u.toast("URL格式不符");
              }
          }
      },
      qrcodeError(err) {
          console.log(err)
          uni.showModal({
              title: '攝像頭授權失敗',
              content: '攝像頭授權失敗,請檢測當前瀏覽器是否有攝像頭權限。',
              success: () => {
                  uni.navigateBack({})
              }
          })
      },


      掃碼成功后,會自動根據地址進行跳轉到具體的二維碼URL頁面,并帶過去一個to的參數給目標頁面。掃碼的頁面效果如下所示。

      8867-20220921121402758-720508450.png

       如果我們掃碼的內容是一個URL連接,就會跳轉到具體的頁面中去,并且帶上一個to參數用于區分目標。

      這樣我們在一些需要的地方,通過按鈕或者圖片來觸發一個掃碼行為即可。

      8867-20220921121712057-503481835.png


      處理代碼如下所示


      uni.navigateTo({
          url: '../common/scan-qrcode'
      })


      如果我們的程序,需要兼容App模式、小程序模式和H5等模式,那么我們可以通過判斷來切換不同的掃碼處理,如下代碼所示。


      onScan(to) { // h5掃描二維碼并解析  
          console.log("不支持H5掃碼 走onScan這個方法")
          let url = '../common/scan-qrcode?to=' + to;
          this.tui.href(url)
      },
      scanCode(to) {
          // 允許從相機和相冊掃碼
          // #ifndef H5
          uni.scanCode({
              scanType: ['qrCode', "barCode"],
              success: function(res) {
                  console.log(res)
                  // 微信小程序
                  if (res.errMsg == "scanCode:ok") {
                      // 掃描到的信息
                      // uni.$u.toast(res.result);
                      var url = res.result;
                      if (uni.$u.test.url(url)) {
                          console.log(url)
                          if (url.indexOf('#') > 0) {
                              let pageurl = url.split('#')[1];
                              console.log(pageurl);
                              //在頁面地址后增加一個to參數
                              uni.navigateTo({
                                  url: pageurl + `&to=${to}` //加上功能
                              })
                          } else {
                              uni.$u.toast("URL格式不符");
                          }
                      } else {
                          uni.$u.toast("URL格式不符");
                      }
                  } else {
                      console.log("未識別到二維碼,請重新嘗試!")
                      uni.$u.toast('未識別到二維碼,請重新嘗試!')
                  }
              }
          });
          // #endif
          // #ifdef H5
          this.onScan(to)
          // #endif
      }



      這樣我們就統一處理入口了,如下調用代碼所示。


      packsign() {
          this.scanCode('packsign')
      },


      以上就是二維碼生成和在H5中掃碼的處理操作供參考。

      掃描二維碼推送至手機訪問。

      版權聲明:本文由星星博客發布,如需轉載請注明出處。

      本文鏈接:http://www.7811333.com/?id=430

      分享給朋友:

      “UniApp H5項目指南:處理二維碼生成和掃描操作” 的相關文章

      【Vue】深入探究Vue生命周期

      Vue.js 是一款流行的前端框架,廣泛應用于各種 Web 應用開發中。在 Vue.js 中,每個組件都有一個生命周期,它包括一系列鉤子函數,用于在特定階段執行特定的操作。本文將詳細介紹 Vue 組件生命周期,并講述它們的實際應用。生命周期鉤子函數Vue 組件的生命周期分成了 8 個不同的階段,每個...

      深入探索Vue自定義過濾器

      Vue.js是一種流行的JavaScript框架,提供了很多有用的功能來構建交互式的Web應用程序。其中一個非常有用且經常被忽視的功能是自定義過濾器。通過使用自定義過濾器,我們可以在Vue應用程序中輕松地轉換、格式化和處理數據。本文將深入探索Vue自定義過濾器的使用方法和實際應用。一、什么是Vue自...

      Vue中的父子組件通訊及使用sync同步父子組件數據

      在Vue.js中,組件通訊是一個非常重要的主題。特別是在處理父子組件之間的通訊時,我們需要了解不同的方式來傳遞數據和響應事件。本文將介紹Vue中父子組件通訊的幾種方式,并重點討論使用sync屬性來實現父子組件數據的雙向綁定。父子組件通訊 在Vue中,父組件可以通過prop向子組件傳遞數據,而子組件則...

      Vue.js雙向綁定的實現原理解析與實例演示

      1. 簡介 Vue.js作為一款流行的前端框架,其雙向綁定機制是其核心特性之一。通過雙向綁定,Vue.js實現了數據模型和視圖之間的即時同步,為開發者提供了極大的便利。在本文中,我們將深入探討Vue.js雙向綁定的實現原理,并結合代碼示例進行詳細解釋。...

      Vue中的防抖節流技術,提升用戶交互體驗

      在Vue開發中,我們經常會遇到需要處理用戶頻繁操作的場景,例如搜索框輸入聯想、窗口大小改變等。這時,使用防抖節流技術能夠有效地控制事件觸發頻率,提升用戶體驗和頁面性能。 1. 防抖技術 防抖(Debounce)是指在事件被觸發后,等...

      vue 前端自動打開文件地址進行下載

      ue 前端自動打開文件地址進行下載   最近在做異步導出的功能,導出的過程中前端另外啟動一個查詢導出進度的線程接口。如果導出完成后,把生成的文件上傳到服務器,返回給前端一個文件的下載地址;前端自動打開這個地址進行跳轉下載。 有兩種方...

      發表評論

      訪客

      ◎歡迎參與討論,請在這里發表您的看法和觀點。
      主站蜘蛛池模板: 天天做.天天爱.天天综合网| 人人狠狠综合久久亚洲高清| 色综合一区二区三区| 久久婷婷是五月综合色狠狠| 在线综合亚洲欧洲综合网站| 国产综合成人亚洲区| 一本久久综合亚洲鲁鲁五月天| 国产成人精品综合在线观看| 精品亚洲综合久久中文字幕| 亚洲 欧洲 日韩 综合在线| 成人综合久久综合| 亚洲综合伊人久久大杳蕉| 精品综合久久久久久97| 久久亚洲高清综合| 97久久天天综合色天天综合色hd | 国产成人综合野草| 狠狠色狠狠色综合久久| 国产成人人综合亚洲欧美丁香花 | 国产精品亚洲综合专区片高清久久久 | 伊人狠狠色丁香综合尤物| 亚洲欧洲日韩综合| 综合激情五月综合激情五月激情1| 亚洲综合中文字幕无线码| 亚洲国产精品综合久久网络 | 综合久久久久久中文字幕亚洲国产国产综合一区首 | 狠狠色丁香婷婷综合久久片| 久久综合九色综合精品| 狠狠综合久久AV一区二区三区| 国产成人亚洲综合一区| 亚洲综合偷自成人网第页色| 玖玖爱zh综合伊人久久| 亚洲成综合人影院在院播放| 久久久久久久综合色一本| 国产香蕉尹人综合在线| 少妇人妻综合久久中文字幕| 久久婷婷色综合一区二区| 狠狠色丁香婷婷综合尤物| 国内精品综合久久久40p| 久久综合精品不卡一区二区| 久久久久综合国产| 亚洲av日韩综合一区二区三区|