微信小程序开发4

一、WXS脚本-概述

1.1、什么是wxs

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

1.2、wxs的应用场景

wxml中无法调用在页面的.js中定义的函数,但是,wxml中可以调用wxs中定义的函数,因此,小程序中wxs的典型应用场景就是”过滤器“

1.3、wxs和JavaScript的关系

虽然wxs的语法类似于JavaScript,但是wxs和JavaScript是完全不同的两种语言:
1 wxs有自己的数据类型
        number数值类型  string字符串类型  boolean布尔类型  object对象类型
        function函数类型  array数组类型  date日期类型  regexp正则
2 wxs不支持类似于ES6及以上的语法形式
        不支持:let、const、结构赋值、展开运算符、箭头函数、对象属性简写...
        支持:var定义变量、普通function函数等类似于ES5的语法
3 wxs遵循CommonJS规范
        module对象、require()函数、module.exports对象er

二、WXS脚本-基本语法

2.1、内嵌WXS脚本

wxs代码可以编写在wxml文件中的<wxs>标签内,就想JavaScript代码可以编写在html文件中的<script>
标签内一样
wxml文件中的每个<wxs></wxs>标签,必须提供module属性,用来指定当前wxs的模块名称,方便在
wxml中访问模块中的成员:
<view>{{m1.toUpper(username)}}</view>
<wxs module="m1">
  // 将文本转为大写形式
  module.exports.toUpper=function(str){
    return str.toUpperCase()
  }
</wxs>

2.2、自定义外联的wxs脚本

wxs代码还可以编写以.wxs为后缀名的文件内,就像javascript代码可以编写在以.js为后缀名的文件中一样,
示例代码如下:
function toLower(srt){
  return String.toLowerCase()
}
module.exports={
  toLower:toLower
}

2.3、使用外联的wxs脚本

在wxml中引入外联的wxs脚本时,必须为<wxs>标签添加module和src属性,其中:
module用来指定模块的名称
src用来指定要引入的脚本的路径,且必须是相对路径
示例代码如下:
<view>{{m2.toLower(country)}}</view>
<wxs src="../index/index.wxs" module="m2"></wxs>

三、WXS脚本-WXS的特点

3.1、与JavaScript不同

为了降低wxs(WeiXin Script)的学习成本,wxs语言在设计时借鉴了大量的javascript的语法,
但是本质上,wxs和JavaScript是完全不同的两种语言

3.2、不能作为组件的事件回调

wxs典型的应用场景就是”过滤器“,经常配合Mustache语法进行使用,例如:
<view>{{m2.toLower(country)}}</view>
但是,在wxs中定义的函数不能作为组件的事件回调函数,例如,下面的用法是错误的:
<button bindtap="m2.toLower">按钮</button>

3.3、隔离性

隔离性指的是wxs的运行环境和其他JavaScript代码是隔离的,体现在如下两方面:
1 wxs不能调用js中定义的函数
2 wxs不能调用小程序提供的API

3.4、性能好

在IOS设备上,小程序内WXS会比JavaScript代码快2——20倍
在android设备上,二者的运行效率无差异

四、自定义组件-组件的创建与引用

4.1、创建组件

1 在项目的根目录中,鼠标右键,创建components->test文件夹
2 在新建的components->test文件夹,鼠标右键,点击”新建Component“
3 输入组件的名称之后回车,会自动生成组件对应的4个文件,后缀名分别为.js,.json,.wxml和.wxss
注意:为了保证目录结构的清晰,建议把不同的组件,存放到单独目录中

4.2、引用组件

组件的引用方式为”全局引用“和”局部引用“,顾名思义:
局部引用:组件只能在当前被引用的页面内使用
全局引用:组件可以在每个小程序页面中使用

4.3、局部引用组件

在页面的.json配置文件中引用组件的方式,叫做”局部引用“,示例代码如下:
// 在页面的.json文件中,引入组件
{
  "usingComponents": {
    "my-test1":"/components/test/test"
  }
}
// 在页面的.wxml文件中,使用组件
<my-test1></my-test1>

4.4、全局引用组件

在app.json全局配置文件中引用组件的方式,叫做”全局引用“,示例代码如下:
// 在app.json文件中,引入组件
{
  "usingComponents": {
    "my-test1":"/components/test/test"
  }
}
// 在页面的.wxml文件中,使用组件
<my-test1></my-test1>

4.5、全局引用VS局部引用

根据组件的使用频率和范围,来选择合适的引用方式:
如果某组件在多个页面中经常被用到,建议进行”全局引用“
如果某组件只在特定的页面中被用到,建议进行”局部引用“

4.6、组件和页面的区别

从表名来看,组件和页面都是由.js,.json,.wxml和wxss这四个文件组成,但是,组件和页面的.js
与.json文件有明显的不同:
组件的.json文件中需要声明:component":ture属性
组件的.js文件中调用的是Component()函数
组件的事件处理函数需要定义到methods节点中

五、自定义组件-样式

5.1、组件样式隔离

默认情况下,自定义组件的样式只对当前组件生效,不会影响到组件之外的UI结构
好处:
        1 防止外界的样式影响组件内部的样式
        2 防止组件的样式破坏外界的样式

5.2、组件样式隔离的注意点

app.wxss中的全局样式对组件无效
只有class选择器会有样式隔离效果,id选择器、属性选择器、标签选择器不受样式隔离的影响
建议:在组件和引用组件的页面中建议使用class选择器,不要使用id、属性、标签选择器

5.3、修改组件的样式隔离选项

默认情况下,自定义组件的样式隔离特性能够防止组件内外样式互相干扰的问题,但有时,我们希望在外界能
够控制组件内部的样式,此时,可以通过styleIsolation修改组件的样式隔离选项,用法如下:
// 在组件的.js文件中新增如下配置
Component({
  options:{
    styleIsolation:'isolated'
  },
})
// 或组件的.json文件中新增如下配置
{"styleIsolation":"isolated"}

5.4、styleIsolation的可选值

可选值         默认值     描述
isolated        是      表示启用样式隔离,在自定义组件内外,使用class指定的样式将不会互相影响
apply-shared    否      表示页面wxss样式将影响到自定义组件,但自定义组件wxss中指定的样式不会影响页面
shared          否      表示页面wxss样式将影响到自定义组件,自定义组件wxss中指定的样式也会影响页面和
                        其他设置了apply-shared或shared的自定义组件

六、自定义组件-数据、方法和属性

6.1、data数据

在小程序组件中,用于组件模板渲染的私有数据,需要定义到data节点中,示例如下:
Component({
    data:{
        count:0
    }
})

6.2、methods方法

在小程序组件中,事件处理函数和自定义方法需要定义到methods节点中,示例代码如下:
Component({
    methods:{   // 数组的方法列表[包含事件处理函数和自定义方法]
        addCount(){ // 事件处理函数
            this.setData({count:this.data.count+1})
            this.__showCount()  // 通过this直接调用自定义方法
        },
        __showCount(){  // 自定义方法建议以__开头
            wx.showToast({
                title:'count值为'+this.data.count,
                icon:'none'
            })
        }
    }
})

6.3、properties属性

在小程序组件中,properties是组件的对外属性,用来接收外界传递到组件中的数据,示例代码如下:
Component({
    // 属性定义
    properties:{
        max:{   // 完整定义属性的方式[当需要指定属性默认值时,建议使用此方式]
            type:Number,    // 属性值的数据类型
            value:10    // 属性默认值
        },
        max:Number  .. 简化定义属性的方式[不需要指定默认值时,可以使用简化方式]
    }
})
<my-test1 max="10"></my-test1>

6.4、data和properties的区别

在小程序的组件中,properties属性和data数据的用法相同,它们都是可读可写的,只不过:
data更倾向于存储组件的私有数据
properties更倾向于存储外界传递到组件中的数据
Component({
    methods:{
        showInfo(){
            console.log(this.data)  // 输出结果{count:0,max:10}
            console.log(this.properties)    // 输出结果{count:0,max:10}
            // 结果为true,证明data数据和properties属性[在本质上是一样的,都是可读可写的]
            console.log(this.data===this.properties)
        }
    }
})

6.5、使用setData修改properties的值

由于data数据和properties属性在本质上没有任何区别,因此properties属性的值也可以用于页面渲染,
或使用setData为properties中的属性重新赋值,示例代码如下:
// 在组件的.wxml文件中使用properties属性的值
<view>max属性的值为:{{max}}</view>
Component({
    properties:{max:Number},    // 定义属性
    methods:{
        addCount(){
            this.setData({max:this.properties.max+1})   // 使用setData修改属性的值
        }
    }
})

七、自定义组件-数据监听器

7.1、什么是数据监听器

数据监听器用于监听和相应任何属性和数据字段的变化,从而执行特定的操作,它的作用类似于vue中的
watch监听器,在小程序组件中,数据监听器的基本语法格式如下:
Component({
    observers:{
        '字段A,字段B':function(字段A的新值,字段B的新值){
            // do something
        }
    }
})

7.2、数据监听器的基本用法

组件的UI结构如下:
    <view>{{n1}}+{{n2}}={{sum}}</view>
    <button size="mini" bindtap="addN1">n1自增</button>
    <button size="mini" bindtap="addN2">n2自增</button>
组件的.js文件代码如下:
    Component({
      data:{n1:0,n2:0,sum:0},
      methods:{ // 方法列表
        addN1(){this.setData({n1:this.data.n1+1})},
        addN2(){this.setData({n2:this.data.n2+1})}
      },
      observers:{ // 数据监听节点
        'n1,n1':function(n1,n2){  // 监听n1和n2的数据的变化
          this.setData({sum:n1+n2}) // 通过监听器,自动计算sum的值
        }
      },
    })

7.3、监听对象属性的变化

数据监听器支持监听对象中单个或多个属性的变化,示例语法如下:
Component({
    observers:{
        '对象.属性A,对象.属性B':function(属性A的新值,属性B的新值){
            // 触发此监听器的3种情况:
            // [为属性A赋值]使用setData设置this.data.对象.属性A时触发
            // [为属性B赋值]使用setData设置this.data.对象.属性B时触发
            // [直接为对象赋值]使用setData设置this.data.对象时触发
            // do something...
        }
    }
})

八、自定义组件-纯数据字段

8.1、什么是纯数据字段

概念:纯数据字段指的是那些不用于界面渲染的data字段
应用场景:例如有些情况下,某些data中的字段既不会展示在界面上,也不会传递给其他组件,仅仅在当前
组件内部使用,带有这种特性的data字段适合被设置为纯数据字段
好处:纯数据字段有助于提升页面更新的性能

8.2、使用规则

在Component构造器的options节点中,指定pureDataPattern为一个正则表达式,字段名符合这个正则
表达式的字段将成为纯数据字段,示例代码如下:
Component({
    options:{
        // 指定所有__开头的数据字段为纯数据字段
        pureDataPattern:/^_/
    },
    data:{
        a:true,   // 普通数据字段
        __b:ture,   // 纯数据字段
    }
})

九、自定义组件-组件的生命周期

9.1、组件全部的生命周期函数

小程序组件可用的全部生命周期如下表所示:
生命周期函数  参数              描述说明
created     无               在组件实例刚刚被创建时执行
attached    无               在组件实例进入页面节点树时执行
ready       无               在组件在视图层布局完成后执行
moved       无               在组件实例被移动到节点树另一个位置时执行
detached    无               在组件实例被从页面节点树移除时执行
error       Object Error    每当组件方法抛出错误时执行

9.2、组件主要的生命周期函数

在小程序组件中,最重要的生命周期函数有3个,分别是created,attached,detached它们各自的特点如下:
1 组件实例刚被创建好的时候,created生命周期函数会被触发
    此时还不能调用setData
    通常在这个生命周期函数中,只应该用于组件的this添加一些自定义的属性字段
2 在组件完全初始化完毕、进入页面节点树后,attached生命周期函数会被触发
    此时,this.data已被初始化完毕
    这个生命周期很有用,绝大数初始化的工作可以在这个时机进行(例如发请求获取初始数据)
3 在组件离开页面节点树后,detached生命周期函数会被触发
    退出一个页面时,会触发页面内每个自定义组件的detached生命周期函数
    此时适合做一些清理性质的工作

9.3、lifetimes节点

在小程序组件中,生命周期函数可以直接定义在Component构建器的第一级参数中,可以在lifetimes字段
内进行声明(这是推荐的方式,其优先级最高),实例代码如下:
Component({
    // 推荐用法
    lifetimes:{
        attached(){},   // 在组件实例进入页面节点树时执行
        detached(){},   // 在组件实例被从页面节点移除时执行
    },
    // 以下是旧式定义方法
    attached(){},   // 在组件实例进入页面节点树时执行
    detached(){},   // 在组件实例被从页面节点移除时执行
})

十、自定义组件-组件所在页面的生命周期

10.1、什么是组件所在页面的生命周期

有时,自定义组件的行为依赖于页面状态的变化,此时就需要用到组件所在页面的生命周期
例如:每当触发页面的show生命周期函数的时候,我们希望能够重新生成一个随机的RGB颜色值
在自定义组件中,组件所在页面的生命周期函数有如下3个,分别是:
生命周期函数  参数              描述
show        无               组件所在的页面被展示时执行
hide        无               组件所在的页面被隐藏时执行
resize      Object Size     组件所在的页面尺寸变化时执行

10.2、pageLifetimes节点

组件所在页面的生命周期函数,需要定义在pageLifetimes节点中,实例代码如下:
Component({
    pageLifetimes:{
        show:function(){},  // 页面被展示
        hide:function(){},  // 页面被隐藏
        resize:function(){} //页面尺寸变化
    }
})

10.3、生成随机的RGB颜色值

Component({
    methods:{
        // 生成随机RGB颜色的方法,非事件处理函数建议以_开头
        _randomColor(){
            this.set({  // 为data里面的_rgb纯数据字段重新赋值
                _rgb:{
                    r:Math.floor(Math.random()*256),
                    g:Math.floor(Math.random()*256),
                    b:Math.floor(Math.random()*256)
                }
            })
        }
    },
    pageLifetimes:{
        // 组件所在的页面被展示时,立即调用_randomColor生成随机颜色值
        show:function(){
            this._randomColor()
        }
    }
})

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值