日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 前端文檔 正文

微信小程序中wxs文件的一些妙用分享_javascript技巧

作者:HealthyZhang ? 更新時間: 2022-03-23 前端文檔

前言

wxs文件是小程序中的邏輯文件,它和wxml結合使用。

不同于js, wxs可以直接作用到視圖層,而不需要進行視圖層和邏輯層的setData數據交互;

因為這個特性,wxs非常適合應用于優化小程序的頻繁交互操作中;

應用

過濾器

在IOS環境中wxs的運行速度要遠高于js,在android中兩者表現相當。

使用wxs作為過濾器也可以一定幅度提升性能;讓我們來看一個過濾器來了解其語法。

wxs文件:

var toDecimal2 = function (x) {
  var f = parseFloat(x);
  if (isNaN(f)) {
    return '0.00'
  }
  var f = Math.round(x * 100) / 100;
  var s = f.toString();
  var rs = s.indexOf('.');
  if (rs < 0) {
    rs = s.length;
    s += '.';
  }
  while (s.length <= rs + 2) {
    s += '0';
  }
  return s;
}
module.exports = toDecimal2

上面的代碼實現了數字保留兩位小數的功能。

wxml文件:

<wxs src="./filter.wxs" module="filter"></wxs>
<text>{{filter(1)}}</text>

基本語法:在視圖文件中通過wxs標簽引入,module值是自定義命名,之后在wxml中可以通過filter調用方法

上面的代碼展示了 wxs的運行邏輯,讓我們可以像函數一樣調用wxs中的方法;

下面再看一下wxs針對wxml頁面事件中的表現。

拖拽

使用交互時(拖拽、上下滑動、左右側滑等)如果依靠js邏輯層,會需要大量、頻繁的數據通信。卡頓是不可避免的;

使用wxs文件替代交互,不需要頻繁使用setData導致實時大量的數據通信,從而節省性能。

下面展示一個拖拽例子

wxs文件:

function touchstart(event) {
  var touch = event.touches[0] || event.changedTouches[0]
  startX = touch.pageX
  startY = touch.pageY
}

事件參數event和js中的事件event內容中touches和changedTouches屬性一致

function touchmove(event, ins) {
  var touch = event.touches[0] || event.changedTouches[0]
  ins.selectComponent('.div').setStyle({
    left: startX - touch.pageX + 'px',
    top: startY - touch.pageY  + 'px'
  })
}

ins(第二個參數)為觸發事件的視圖層wxml上下文。可以查找頁面所有元素并設置style,class(足夠完成交互效果)

注意:在參數event中同樣有一個上下文實例instance;event中的實例instance作用范圍是觸發事件的元素內,而事件的ins參數作用范圍是觸發事件的組件內。

module.exports = {
  touchstart: touchstart,
  touchmove: touchmove,
}

最后將方法拋出去,給wxml文件引用。

wxml文件

<wxs module="action" src="./movable.wxs"></wxs> 
<view class="div" bindtouchstart="{{action.touchstart}}" bindtouchmove="{{action.touchmove}}"></view>

上面的例子,解釋了事件的基本交互用法。

文件之中相互傳參

在事件交互中,少不了需要各個文件之中傳遞參數。 下面是比較常用的幾種

wxs傳參到js邏輯層

wxs文件中:

var dragStart = function (e, ins) {
	ins.callMethod('callback','sldkfj')
}

js文件中:

callback(e){
	console.log(e)
}
// sldkfj

使用callMethod方法,可以執行js中的callback方法。也可以實現傳參;

  • !!!callMethod不支持傳回調函數*

js邏輯層傳參到wxs文件

js文件中:

handler(e){
	this.setData({a:1})
}

wxml文件:

<wxs module="action" src="./movable.wxs"></wxs> 
<view change:prop="{{action.change}}" prop="{{a}}"></view>

wxs文件中:

change(newValue,oldValue){}

js文件中的參數傳遞到wxs需要通過wxml文件中轉。

js文件觸發handler事件,改變a的值之后,最新的a傳遞到wxml中。

wxml中prop改變會觸發wxs中的change事件。change中則會接收到最新prop值

wxs中獲取dataset(wxs中獲取wxml數據)

wxs中代碼

var dragStart = function (e) {
  var index = e.currentTarget.dataset.index;
  var index = e.instance.getDataset().index;
}

上面有提到e.instance是當前觸發事件的元素實例。

所以e.instance.getDataset()獲取的是當前觸發事件的dataset數據集

注意點

wxs和js為不同的兩個腳本語言。但是語法和es5基本相同,確又不支持es6語法; getState 在多元素交互中非常實用,歡迎探索。

不知道是否是支持的語法可以跳轉官網文檔; wxs運算符、語句、基礎類庫、數據類型

總結

原文鏈接:https://juejin.cn/post/6995065856451411981

欄目分類
最近更新