整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          uni-app: 使用Vue.js需要注意哪些問(wèn)題?

          擊右上方紅色按鈕關(guān)注“web秀”,讓你真正秀起來(lái)

          前言

          uni-app 在發(fā)布到 H5 時(shí),是支持所有 vue 的語(yǔ)法的。但是發(fā)布到App或者小程序時(shí),由于各個(gè)平臺(tái)等限制,無(wú)法實(shí)現(xiàn)全部 vue 語(yǔ)法,本文將詳細(xì)講解差異。

          相比Web平臺(tái), Vue.js 在 uni-app 中使用差異主要集中在兩個(gè)方面:

          新增:uni-app除了支持Vue實(shí)例的生命周期,還支持應(yīng)用啟動(dòng)、頁(yè)面顯示等生命周期

          受限:相比web平臺(tái),在小程序和App端部分功能受限,具體見(jiàn)下。

          生命周期

          uni-app 在支持完整 Vue 實(shí)例的生命周期上,同時(shí)還新增 應(yīng)用生命周期 及 頁(yè)面生命周期。

          應(yīng)用生命周期包括下列函數(shù)

          1、onLaunch當(dāng)uni-app 初始化完成時(shí)觸發(fā)(全局只觸發(fā)一次)

          2、onShow當(dāng) uni-app 啟動(dòng),或從后臺(tái)進(jìn)入前臺(tái)顯示

          3、onHide當(dāng) uni-app 從前臺(tái)進(jìn)入后臺(tái)

          4、onUniNViewMessage對(duì) nvue 頁(yè)面發(fā)送的數(shù)據(jù)進(jìn)行監(jiān)聽(tīng)

          注意

          (1)、應(yīng)用生命周期僅可在App.vue中監(jiān)聽(tīng),在其它頁(yè)面監(jiān)聽(tīng)無(wú)效。

          (2)、onlaunch里進(jìn)行頁(yè)面跳轉(zhuǎn),可能遇白屏報(bào)錯(cuò),可以去官方查找解決方案。

          頁(yè)面生命周期

          注意

          (1)、onTabItemTap常用于點(diǎn)擊當(dāng)前tabitem,滾動(dòng)或刷新當(dāng)前頁(yè)面。如果是點(diǎn)擊不同的tabitem,一定會(huì)觸發(fā)頁(yè)面切換。

          (2)、如果想在App端實(shí)現(xiàn)點(diǎn)擊某個(gè)tabitem不跳轉(zhuǎn)頁(yè)面,不能使用onTabItemTap,可以使用plus.nativeObj.view放一個(gè)區(qū)塊蓋住原先的tabitem,并攔截點(diǎn)擊事件。

          (3)、onTabItemTap在App端,從HBuilderX 1.9 的自定義組件編譯模式開(kāi)始支持。

          語(yǔ)法支持

          支持的 vue 語(yǔ)法

          1、支持過(guò)濾器 filter

          2、支持比較復(fù)雜的 JavaScript 渲染表達(dá)式

          3、支持在 template 內(nèi)使用 methods 中的函數(shù)

          4、支持 v-html (同 rich-text 的解析)

          5、支持 v-slot 新語(yǔ)法

          6、支持解構(gòu)插槽 Prop 設(shè)置默認(rèn)值

          7、支持 slot 后備內(nèi)容

          8、組件支持原生事件綁定,如:@tap.native

          不支持的 vue 語(yǔ)法

          1、class不支持綁定Obejct變量(使用字符串的形式綁定)

          2、不支持事件修飾符:prevent、passive(在App與小程序平臺(tái),使用stop修飾符,既可以阻止冒泡也能阻止默認(rèn)行為)

          3、不支持render、inline-template、X-Templates、keep-alive、transition

          4、不支持使用 Vue.use 的方式注冊(cè)全局組件(在main.js使用Vue.component的方式引入)

          列表渲染

          1、在H5平臺(tái) 使用 v-for 循環(huán)整數(shù)時(shí)和其他平臺(tái)存在差異,如 v-for="(ite`m, index) in 10" 中,在H5平臺(tái) item 從 1 開(kāi)始,其他平臺(tái) item 從 0 開(kāi)始,可使用第二個(gè)參數(shù) index 來(lái)保持一致。

          2、在非H5平臺(tái) 循環(huán)對(duì)象時(shí)不支持第三個(gè)參數(shù),如 v-for="(value, name, index) in object" 中,index 參數(shù)是不支持的。

          事件處理

          幾乎全支持 事件處理器

          // 事件映射表,左側(cè)為 WEB 事件,右側(cè)為 ``uni-app`` 對(duì)應(yīng)事件
          {
           click: 'tap',
           touchstart: 'touchstart',
           touchmove: 'touchmove',
           touchcancel: 'touchcancel',
           touchend: 'touchend',
           tap: 'tap',
           longtap: 'longtap',
           input: 'input',
           change: 'change',
           submit: 'submit',
           blur: 'blur',
           focus: 'focus',
           reset: 'reset',
           confirm: 'confirm',
           columnchange: 'columnchange',
           linechange: 'linechange',
           error: 'error',
           scrolltoupper: 'scrolltoupper',
           scrolltolower: 'scrolltolower',
           scroll: 'scroll'
          }
          

          注意:

          1、為兼容各端,事件需使用 v-on 或 @ 的方式綁定,請(qǐng)勿使用小程序端的bind 和 catch 進(jìn)行事件綁定。

          2、事件修飾符

          .stop:各平臺(tái)均支持, 使用時(shí)會(huì)阻止事件冒泡,在非 H5 端同時(shí)也會(huì)阻止事件的默認(rèn)行為

          .prevent 僅在 H5 平臺(tái)支持

          .self:僅在 H5 平臺(tái)支持

          .once:僅在 H5 平臺(tái)支持

          .capture:僅在 H5 平臺(tái)支持

          .passive:僅在 H5 平臺(tái)支持

          3、若需要禁止蒙版下的頁(yè)面滾動(dòng),可使用 @touchmove.stop.prevent="moveHandle",moveHandle 可以用來(lái)處理 touchmove 的事件,也可以是一個(gè)空函數(shù)。

          <view class="mask" @touchmove.stop.prevent="moveHandle"></view>
          

          4、按鍵修飾符:uni-app運(yùn)行在手機(jī)端,沒(méi)有鍵盤(pán)事件,所以不支持按鍵修飾符。

          命名限制

          在 uni-app 中以下這些作為保留關(guān)鍵字,不可作為組件名。

          a, canvas, cell, content, countdown, datepicker, div, element, embed, header, image, img, indicator, input, link, list, loading-indicator, loading, marquee, meta, refresh, richtext, script, scrollable, scroller, select, slider-neighbor, slider, slot, span, spinner, style, svg, switch, tabbar, tabheader, template, text, textarea, timepicker, trisition-group, trisition, video, view, web

          除以上列表中的名稱外,標(biāo)準(zhǔn)的 HTML 及 SVG 標(biāo)簽名也不能作為組件名。

          其他疑難雜癥

          1、如何獲取上個(gè)頁(yè)面?zhèn)鬟f的數(shù)據(jù)

          在 onLoad 里得到,onLoad 的參數(shù)是其他頁(yè)面打開(kāi)當(dāng)前頁(yè)面所傳遞的數(shù)據(jù)。

          2、如何捕獲 app 的 onError

          由于 onError 并不是完整意義的生命周期,所以只提供一個(gè)捕獲錯(cuò)誤的方法,在 app 的根組件上添加名為 onError 的回調(diào)函數(shù)即可。如下:

          export default {
           // 只有 app 才會(huì)有 onLaunch 的生命周期
           onLaunch () {
           // ...
           },
           // 捕獲 app error
           onError (err) {
           console.log(err)
           }
          }
          

          3、組件屬性設(shè)置不生效解決辦法

          當(dāng)重復(fù)設(shè)置某些屬性為相同的值時(shí),不會(huì)同步到view層。 例如:每次將scroll-view組件的scroll-top屬性值設(shè)置為0,只有第一次能順利返回頂部。 這和props的單向數(shù)據(jù)流特性有關(guān),組件內(nèi)部scroll-top的實(shí)際值改動(dòng)后,其綁定的屬性并不會(huì)一同變化。

          解決辦法有兩種(以scroll-view組件為例):

          (1)、監(jiān)聽(tīng)scroll事件,記錄組件內(nèi)部變化的值,在設(shè)置新值之前先設(shè)置為記錄的當(dāng)前值

          <scroll-view :scroll-top="scrollTop" scroll-y="true" @scroll="scroll">
          <script>
          export default {
           data() {
           return {
           scrollTop: 0,
           old: {
           scrollTop: 0
           }
           }
           },
           methods: {
           scroll: function(e) {
           this.old.scrollTop = e.detail.scrollTop
           },
           goTop: function(e) {
           this.scrollTop = this.old.scrollTop
           this.$nextTick(function() {
           this.scrollTop = 0
           });
           }
           }
          }
          </script>
          

          (2)、監(jiān)聽(tīng)scroll事件,獲取組件內(nèi)部變化的值,實(shí)時(shí)更新其綁定值

          <scroll-view :scroll-top="scrollTop" scroll-y="true" @scroll="scroll">
          <script>
          export default {
           data() {
           return {
           scrollTop: 0,
           }
           },
           methods: {
           scroll: function(e) {
           this.scrollTop = e.detail.scrollTop
           },
           goTop: function(e) {
           this.scrollTop = 0
           }
           }
          }
          </script>
          

          第二種解決方式在某些組件可能造成抖動(dòng),推薦第一種解決方式。

          喜歡小編或者覺(jué)得小編文章對(duì)你有幫助的,可以點(diǎn)擊一波關(guān)注哦!同時(shí),要源碼的小伙伴可以點(diǎn)擊下方“了解更多”。

          最后推薦一個(gè)專欄文章,感謝小伙伴們多多支持,謝謝大家!

          時(shí)做移動(dòng)開(kāi)發(fā)很少接觸css,最近在寫(xiě)uni-app要用到css所以少不了學(xué)習(xí)這方面的知識(shí)。

          今天的筆記也是一些基礎(chǔ)知識(shí),關(guān)于盒子模型當(dāng)中的一些比較不錯(cuò)的屬性,也是常用屬性。

          在 CSS 盒子模型的默認(rèn)定義里,你對(duì)一個(gè)元素所設(shè)置的 width 與 height 只會(huì)應(yīng)用到這個(gè)元素的內(nèi)容區(qū)。如果這個(gè)元素有任何的 border 或 padding ,繪制到屏幕上時(shí)的盒子寬度和高度會(huì)加上設(shè)置的邊框和內(nèi)邊距值。這意味著當(dāng)你調(diào)整一個(gè)元素的寬度和高度時(shí)需要時(shí)刻注意到這個(gè)元素的邊框和內(nèi)邊距。當(dāng)我們實(shí)現(xiàn)響應(yīng)式布局時(shí),這個(gè)特點(diǎn)尤其煩人。

          box-sizing 兩個(gè)取值如下:

          • content-box 是默認(rèn)值。如果你設(shè)置一個(gè)元素的寬為100px,那么這個(gè)元素的內(nèi)容區(qū)會(huì)有100px 寬,并且任何邊框和內(nèi)邊距的寬度都會(huì)被增加到最后繪制出來(lái)的元素寬度中。
          • border-box 告訴瀏覽器:你想要設(shè)置的邊框和內(nèi)邊距的值是包含在width內(nèi)的。也就是說(shuō),如果你將一個(gè)元素的width設(shè)為100px,那么這100px會(huì)包含它的border和padding,內(nèi)容區(qū)的實(shí)際寬度是width減去(border + padding)的值。大多數(shù)情況下,這使得我們更容易地設(shè)定一個(gè)元素的寬高。
          <html>
             <head>
                <style>
                   .div1 {
                      width: 300px;
                      height: 100px;
                      border: 1px solid blue;
                      box-sizing: border-box;
                   }
                   .div2 {
                      width: 300px;
                      height: 100px;
                      padding: 50px;
                      border: 1px solid red;
                      box-sizing: border-box;
                   }
                </style>
             </head>
          
             <body>
                <div class = "div1">TutorialsPoint.com</div><br />
                <div class = "div2">TutorialsPoint.com</div>
             </body>
          </html>

          上面代碼對(duì)呀的效果如下:

          發(fā)環(huán)境

          1、Android Studio下載地址:https://developer.android.google.cn/studio/index.html

          2、HBuilderX(開(kāi)發(fā)工具,地址https://www.dcloud.io/hbuilderx.html)

          3、App離線SDK下載:最新android平臺(tái)SDK下載

          (https://nativesupport.dcloud.net.cn/AppDocs/download/android)

          注意:HBuilderX版本要跟SDK版本一致。


          SDK目錄說(shuō)明

              |-- HBuilder-Hello                App離線打包演示應(yīng)用
              |-- HBuilder-Integrate-AS         集成uni-app或5+ app的最簡(jiǎn)示例
              |-- SDK                           SDK庫(kù)文件目錄
              |-- Feature-Android.xls           Android平臺(tái)各擴(kuò)展Feature API對(duì)應(yīng)的詳細(xì)配置
              |-- readme                        版本說(shuō)明文件及注意事項(xiàng)
              |-- UniPlugin-Hello-AS            uni原生插件開(kāi)發(fā)示例


          準(zhǔn)備工程

          1、安裝android Studio并解壓SDK下載包;

          2、運(yùn)行android studio,選擇導(dǎo)入項(xiàng)目HBuilder-Hello;

          3、導(dǎo)入項(xiàng)目后,按提示安裝所需即可;安裝完成后,項(xiàng)目會(huì)重新rebuild,等待結(jié)束,運(yùn)行項(xiàng)目到測(cè)試機(jī),可以看到傳感器,音頻,二維碼等應(yīng)用示例;

          4、打開(kāi) HBuilderX 寫(xiě)好的項(xiàng)目,點(diǎn)擊 發(fā)行 > 原生app-本地打包 > 生成本地打包資源,打包完成后,HBuilderX 控制臺(tái)會(huì)輸出打包信息和打包路徑;

          5、打開(kāi) android studio 切換項(xiàng)目到project目錄,依次打開(kāi) HBuilder-Hello > app > src > main > assets,能看到 apps.HelloH5.www 和 data 兩個(gè)文件夾;

          6、刪除 android studio 的 apps 文件夾內(nèi)容后,將 HBuilderX 剛才打包路徑下的 resources 文件夾內(nèi)容替換;

          7、復(fù)制 www > manifest.json 中的id,替換 data > dcloud_control.xml 中的 appid;

          8、點(diǎn)擊運(yùn)行項(xiàng)目,如果運(yùn)行后測(cè)試機(jī)所顯示的內(nèi)容和HBuilderX項(xiàng)目中所展示一致,則表示替換成功;

          補(bǔ)充一些打包過(guò)程遇到問(wèn)題的解決方法:

          1)運(yùn)行APP提示“當(dāng)前運(yùn)行環(huán)境無(wú)法運(yùn)行啟用“自定義組件模式”的uni-app引用”,只需要在“app-libs”引入文件“ uniapp-release.aar”(該文件在SDK下載包的路徑“SDK\libs”下)即可解決);

          2)報(bào)錯(cuò)“Entry name 'assets/SDK_Default_Route_Texture_Gray_Arrow.png' collided”,刪除文件“HBuilder-Hello\app\build”下的所有數(shù)據(jù),重新生成就沒(méi)問(wèn)題;

          3)uniApp引入“vconsole.min.js”會(huì)導(dǎo)致打包運(yùn)行后,只顯示底部菜單,內(nèi)容區(qū)域顯示空白;

          4)工程增加package.json,并執(zhí)行“npm install”后,打包App運(yùn)行后會(huì)導(dǎo)致引用組件的頁(yè)面無(wú)法跳轉(zhuǎn);

          5)uniapp調(diào)用接口使用了Promise,打包App運(yùn)行后會(huì)導(dǎo)致打開(kāi)調(diào)用接口的頁(yè)面一直加載中。


          發(fā)布版本

          1、android studio > build > Generate Signed Bundle / APK,創(chuàng)建新的 jks文件或選擇原有jks,一路下一步,直至完成;

          2、把文件app-debug.apk發(fā)送到手機(jī),安裝并使用。


          主站蜘蛛池模板: 久久久国产精品亚洲一区 | 日韩好片一区二区在线看| 久久中文字幕无码一区二区| 国产一区二区精品| 精品少妇ay一区二区三区| 日本一区二区三区在线视频 | 一区二区三区在线观看中文字幕| 国产一区二区三区免费视频 | 无码一区二区三区亚洲人妻| 成人免费区一区二区三区| 在线欧美精品一区二区三区 | 欧洲精品码一区二区三区| 中文字幕无码免费久久9一区9| 久久毛片一区二区| 亚洲一区动漫卡通在线播放| 成人免费一区二区三区| 日韩精品久久一区二区三区| 97久久精品一区二区三区| 久久久久久一区国产精品| 亚洲A∨精品一区二区三区| 亚洲AV日韩AV一区二区三曲| 亚洲一区二区三区在线| 少妇无码一区二区二三区| 无码人妻少妇色欲AV一区二区| 国产A∨国片精品一区二区| 国产成人一区二区三区高清| 亚洲一区二区三区在线观看网站 | 精品一区中文字幕| 日本一区中文字幕日本一二三区视频| 亚洲一区二区三区免费视频| 日韩一区二区三区四区不卡| 中文字幕无码不卡一区二区三区| 91成人爽a毛片一区二区| 国产精品分类视频分类一区| 国产一区二区三区乱码网站| 亚洲av色香蕉一区二区三区| 无码AV动漫精品一区二区免费| 国产一区二区三精品久久久无广告| 99久久精品国产免看国产一区| 中文字幕一精品亚洲无线一区| 在线播放一区二区|