本篇文章帶大家了解微信小程式中的wxs模組,介紹一下wxs的使用,希望對大家有幫助!
開發微信小程式已經有一段時間了,不得不說微信小程式的API以及各種封裝好的組件確實很厲害,很大程度上節約了開發者的時間,但是對我來說,我是更傾向於自己寫一些東西的,一切都在微信封裝的組件、 API內開發,久而久之只能實現如同熟練工的操作。
雖然說小程式也是一層的封裝,但是拿現成的和自己寫的總是有所不同的。舉個例子,全依賴與微信官方封裝和在原生小程式基礎上自我開發,就像是裝修精裝房和毛胚房的區別一樣,完全依賴於微信的封裝,你只需要往精裝房內搬家具就好了,可謂是快速搭建,當然我也不排斥微信封裝的API,畢竟在某些程度上,他們性能更加卓越,我只是希望,不管在什麼時候,都不要喪失自己從零開發的能力,畢竟前端,不隻小程式。
最近有一個需求,在一個頁面中有一個滑塊,能夠用手指拖動滑塊到頁面的任意位置,並且在鬆手的時候,滑塊能夠自動吸邊。
由於在小程式中無法直接操作DOM元素,也就無法透過js直接設定style,如果想要滑桿快速回應手指的滑動的話,透過頁面的data去定位元素位置,無異於是毫秒級的setData,一次setData 的回應需要經過2 次的邏輯層和渲染層的通訊以及一次渲染,通訊的耗時比較大。此外 setData 渲染也會阻塞其它腳本執行,這種頻率的setData容易造成卡頓,因此這個方案是不可行的。
在微信小程式中,官方有提供一個視圖容器,叫做movable-view,這個應該是可以解決需求的,但是在上文中有提到,在性能差別不大的時候,我更傾向於自己寫,這個作為一個備選方案。
#也就是說,wxs是專門用於wxml頁面的,它實現的是在視圖層調用函數的功能
#調用方式
雖然在微信文檔中有說明, wxs是小程式的一套腳本語言,有自己的文法,但大部分文法還是跟js差別不大,有興趣的可以自行翻看文件。微信小程式中提供了兩種呼叫方式,這裡不做過多贅述,直接貼程式碼
wxml:
<view class="main"> <view>主页</view> <wxs module="IndexWxs" src="./index.wxs"></wxs>//新建index.wxs文件,在wxs标签中自定义路径引入,IndexWxs为自定义的module名 <view change:prop="{{IndexWxs.chooseShow}}" //change:prop是起到类似observe的监听作用,当prop中的data属性有更新的时候,会触发change:prop的方法 prop="{{monitor}}" //data属性 data-navHeight="{{navHeight}}" //可以使用data-自定义传入属性 data-edge="{{edgeData}}" catch:touchstart="{{IndexWxs.touchStartByBlock}}" //要调用wxs的方法需使用{{ }} catch:touchmove="{{IndexWxs.touchMoveByBlock}}" catch:touchend="{{IndexWxs.touchEndByBlock}}"> </view> </view>
\
wxs:
var x = 0,y = 0; //viewData 使用小程序获取节点信息的方法,通过data-传入 var viewData = { height: 0,//滑块的宽高 width: 0, windowHeight: 0,//屏幕的宽高 windowWidth: 0 } var eventInstance = null module.exports = { //触摸开始 touchStartByBlock: function (event) { eventInstance = event;// event.instance为组件实例 var setViewData = event.currentTarget.dataset//获取data-传入的值 if (setViewData && setViewData.edge && setViewData.edge.windowHeight) { viewData = setViewData.edge } x = event.changedTouches[0].clientX - viewData.width/2//滑动过程中保持手指在模块中心位置 y = event.changedTouches[0].clientY - viewData.height/2 }, //触摸移动中,可以给x,y写一些边界值判断,防止滑块越界,此处不做展示 touchMoveByBlock: function (event) { x = event.changedTouches[0].clientX - viewData.width/2 y = event.changedTouches[0].clientY - viewData.height/2 event.instance.setStyle({//使用setStyle设置的样式权重比wxml设置的样式高 transform: 'translate('+x+'px'+','+y+'px)'//setStyle需使用字符串 }) }, //松开手指,触摸结束时 touchEndByBlock: function (event) { //吸边处理,判断当前手指位置在屏幕的哪一边 x = viewData.windowWidth/2 < x ? viewData.windowWidth-viewData.width : 0; y = y > viewData.windowHeight-viewData.height ? viewData.windowHeight-viewData.height : y event.instance.setStyle({ transform: 'translate('+x+'px'+','+y+'px)', }) }, //当props的monitor数据发生变化的时候触发该方法,会自动传入monitor当前值,一些业务逻辑可以在此处处理 chooseShow: function (monitor) { console.log('监听到更新,monitor=',monitor); } }
最終效果:(掘金好像不支持視頻,由於是知乎直接搬運的,也就沒有轉成gif,想看視頻的可以移步知乎文章 )
wxs的基本使用大概就是這樣,由於我也是第一次使用wxs,若有說的不足或錯誤之處歡迎補充指正。
【相關學習推薦:小程式開發教學】
以上是聊聊微信小程式中的wxs模組,介紹使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!