首頁  >  文章  >  微信小程式  >  聊聊微信小程式中的wxs模組,介紹使用方法

聊聊微信小程式中的wxs模組,介紹使用方法

青灯夜游
青灯夜游轉載
2021-12-17 10:31:425445瀏覽

本篇文章帶大家了解微信小程式中的wxs模組,介紹一下wxs的使用,希望對大家有幫助!

聊聊微信小程式中的wxs模組,介紹使用方法

寫在前面,關於一些想法:

開發微信小程式已經有一段時間了,不得不說微信小程式的API以及各種封裝好的組件確實很厲害,很大程度上節約了開發者的時間,但是對我來說,我是更傾向於自己寫一些東西的,一切都在微信封裝的組件、 API內開發,久而久之只能實現如同熟練工的操作。

雖然說小程式也是一層的封裝,但是拿現成的和自己寫的總是有所不同的。舉個例子,全依賴與微信官方封裝和在原生小程式基礎上自我開發,就像是裝修精裝房和毛胚房的區別一樣,完全依賴於微信的封裝,你只需要往精裝房內搬家具就好了,可謂是快速搭建,當然我也不排斥微信封裝的API,畢竟在某些程度上,他們性能更加卓越,我只是希望,不管在什麼時候,都不要喪失自己從零開發的能力,畢竟前端,不隻小程式。

正文:

最近有一個需求,在一個頁面中有一個滑塊,能夠用手指拖動滑塊到頁面的任意位置,並且在鬆手的時候,滑塊能夠自動吸邊。

由於在小程式中無法直接操作DOM元素,也就無法透過js直接設定style,如果想要滑桿快速回應手指的滑動的話,透過頁面的data去定位元素位置,無異於是毫秒級的setData,一次setData 的回應需要經過2 次的邏輯層和渲染層的通訊以及一次渲染,通訊的耗時比較大。此外 setData 渲染也會阻塞其它腳本執行,這種頻率的setData容易造成卡頓,因此這個方案是不可行的。

在微信小程式中,官方有提供一個視圖容器,叫做movable-view,這個應該是可以解決需求的,但是在上文中有提到,在性能差別不大的時候,我更傾向於自己寫,這個作為一個備選方案。

聊聊微信小程式中的wxs模組,介紹使用方法

WXS的使用

聊聊微信小程式中的wxs模組,介紹使用方法

#也就是說,wxs是專門用於wxml頁面的,它實現的是在視圖層調用函數的功能

2-聊聊微信小程式中的wxs模組,介紹使用方法

#調用方式

雖然在微信文檔中有說明, 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: &#39;translate(&#39;+x+&#39;px&#39;+&#39;,&#39;+y+&#39;px)&#39;//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: &#39;translate(&#39;+x+&#39;px&#39;+&#39;,&#39;+y+&#39;px)&#39;,
    })
  },
//当props的monitor数据发生变化的时候触发该方法,会自动传入monitor当前值,一些业务逻辑可以在此处处理
  chooseShow: function (monitor) {
    console.log(&#39;监听到更新,monitor=&#39;,monitor);
  }
}

最終效果:(掘金好像不支持視頻,由於是知乎直接搬運的,也就沒有轉成gif,想看視頻的可以移步知乎文章 )

聊聊微信小程式中的wxs模組,介紹使用方法

wxs的基本使用大概就是這樣,由於我也是第一次使用wxs,若有說的不足或錯誤之處歡迎補充指正。

【相關學習推薦:小程式開發教學

以上是聊聊微信小程式中的wxs模組,介紹使用方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.cn。如有侵權,請聯絡admin@php.cn刪除