• 【小程序】中WXS的语法详解


    WXS基本使用

    🍰WXS的介绍

    WXS(WeiXin Script)是小程序的一套脚本语言,结合 WXML,可以构建出页面的结构

    官方中说到: WXS 与 JavaScript 是不同的语言,有自己的语法,并不和 JavaScript 一致。

    其实WXS和JavaScript基本一致

    为什么要设计WXS语言呢?

    WXML中是不能直接调用(指的是不能在插值语法调用函数) Page/Component中定义的函数的.

    但是某些情况, 我们可以希望使用函数来处理WXML中的数据(类似于Vue中的过滤器),这个时候就使用WXS了

    WXS使用的限制和特点

    WXS 不依赖于运行时的基础库版本,可以在所有版本的小程序中运行;

    WXS 的运行环境和其他 JavaScript 代码是隔离的, WXS 中不能调用其他 JavaScript 文件中定义的函数,也不能调用小程序提供的API;

    由于运行环境的差异,在 iOS 设备上小程序内的 WXS 会比 JavaScript 代码快 2 ~ 20 倍。在 android 设备 上二者运行效率 无差异;


    🍰WXS的写法

    例如: 我们来看下面这样一个案例

    例如我们想要调用一个函数, 用来给价格加上一个符号, 在js编写函数, 在wxml中调用是没有效果的

    
    <view>{{ formatPrice(80) }}view>
    
    • 1
    • 2
    Page({
    	data: {
    		// js中的函数
    		formatPrice(price) {
    			return "¥" + price
    		}
    	}
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    这个时候就需要使用WXS的写法

    WXS有两种写法

    方式一: 写在标签中

    方式二: 写在以.wxs结尾的文件中

    每一个 .wxs 文件和 标签都是一个单独的模块

    每个模块都有自己独立的作用域。即在一个模块里面定义的变量与函数,默认为私有的,对其他模块不可见。

    一个模块要想对外暴露其内部的私有变量与函数,只能通过CommonJS规范 module.exports 实现。

    标签的属性

    属性名类型说明
    moduleString当前 标签的模块名。必填字段
    srcString引用 .wxs 文件的相对路径。仅当本标签为单闭合标签标签的内容为空时有效。*

    方式一: 我们先用标签来写替代刚刚代码中的js部分

    <!-- model声明当前wxs标签的模块名, 必填字段 -->
    <wxs module="format">
    	// wxs中不能写ES6的语法: 例如箭头函数
    	function formatPrice(price) {
    		return "¥" + price
    	}
    
    	// 需要导出函数, 导出只能使用CommonJs规范
    	module.exports = {
    		// 对象中也不能使用对象的增强写法
    		formatPrice: formatPrice
    	}
    </wxs>
    
    <!-- 通过模块名调用 -->
    <view>{{ format.formatPrice(50) }}</view>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    方式二: 可以将wxs的代码写到一个单独的 .wxs文件中

    我们一般会在项目根目录下创建一个utils文件夹, wxs文件写在这里, 如下: 将刚刚的代码放到单独的 .wxs文件中

    在这里插入图片描述

    单独的 .wxs文件中同样不支持ES6的语法, 再在要使用的页面中, 通过wxs标签引入 .wxs文件

    
    <wxs module="format" src="/utils/farmat.wxs">wxs>
    
    
    <view>{{ format.formatPrice(50) }}view>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    🍰WXS的练习(一)

    使用两种方式来计算一个数组的和

    • 方式一
    <wxs module="sumNumber">
    	function sum(arr) {
    		return arr.reduce(function(prevValue, item) {
    			return prevValue + item
    		}, 0)
    	}
    
    	module.exports = {
    		sum: sum
    	}
    </wxs>
    
    <!-- 展示价格 -->
    <view>{{ sumNumber.sum(nums) }}</view>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 方式二
    // farmat.wxs
    function sum(arr) {
    	return arr.reduce(function(prevValue, item) {
    		return prevValue + item
    	}, 0)
    }
    
    module.exports = {
    	sum: sum
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    <wxs module="sumNumber" src="/utils/farmat.wxs">wxs>
    
    
    <view>{{ sumNumber.sum(nums) }}view>
    
    • 1
    • 2
    • 3
    • 4

    🍰WXS的练习(二)

    案例练习题目

    题目一:传入一个数字,格式化后进行展示(例如36456,展示结果3.6万);

    // format.wxs
    
    function formatCount(count) {
    	// 保证传入的参数是数字类型
    	var numCount = parseInt(count)
    
    	if (numCount >= 100000000) {
    		return (numCount / 100000000).toFixed(1) + "亿"
    	} else if (numCount >= 10000) {
    		return (numCount / 10000).toFixed(1) + "万"
    	} else {
    		return numCount
    	}
    }
    
    module.exports = {
    	formatCount: formatCount
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    <wxs module="format" src="/utils/format.wxs">wxs>
    
    <view>{{ format.formatCount(5650000000) }}view>
    <view>{{ format.formatCount(123456) }}view>
    <view>{{ format.formatCount(100) }}view>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    题目二:传入一个时间,格式化后进行展示(例如100秒,展示结果为01 :40);

    // 定义方法, 给时间补零
    function padLeft(time) {
    	// 将时间转为字符串
    	time = time + ""
    	return ("00" + time).slice(time.length)
    }
    
    function formatDate(time) {
    	var minute = Math.floor(time / 60)
    	var second = Math.floor(time) % 60
    
    	// 调用补零函数
    	return padLeft(minute) + ":" + padLeft(second)
    }
    
    module.exports = {
    	formatDate: formatDate
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    <wxs module="format" src="/utils/format.wxs">wxs>
    
    <view>{{ format.formatDate(230) }}view>
    <view>{{ format.formatDate(160) }}view>
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【JavaScript】JavaScript、Java 计算两个日期时间内的每一周,不足一周的按照一周计算
    Jenkins+Docker+SpringCloud微服务持续集成(中)
    使用@RestControllerAdvice统一处理@ResponseBody的返回前端数据
    UML类图
    基于车联网的网络切片GBR动态专载触发方案
    6.30 基于自编码器卷积神经网络的室内定位
    【附源码】Python计算机毕业设计社区便捷管理系统
    9.19~9.20elf论文(浮点数的二进制表示&确定擦除尾随0的数量)
    Spring框架系列(14) - SpringMVC实现原理之DispatcherServlet处理请求的过程
    4D5D影院设备发展前景7D互动影院体验馆应用
  • 原文地址:https://blog.csdn.net/m0_71485750/article/details/126396002