小程序5
学习目标:
1.能够知道如何自定义小程序组件
2.能够知道小程序组件中behaviors的作用
自定义组件
组建的创建于使用
创建组件
- 在项目的根目录中,手表邮件,创建components->test文件夹
- 在新建的components->test文件夹上,鼠标右键,点击"新建Component"
- 输入组件名称之后回车,会自动生成组件对应的4个文件
如何引入组件
组建的引用方式分为局部引用和全局引用,顾名思义:
- 局部引用:组件只能在当前被引用的页面内使用
- 全局引用:组件可以在每个小程序页面中使用
局部引用:
在页面的.json文件中添加自定义组件
全局引用:
在app.json全局配置文件中引用组件的方式,叫做"全局引用"。示例代码如下:
全局引用VS局部引用
根据组建的使用频率和范围,来选择合适的引用方式:
- 如果某组件在多个页面中经常被用到,建议进行全局引用
- 如果某组件只是在特定的页面中用到,建议使用局部引用
组件和页面的区别
从表面来看,组件和页面都是由.js、.json、.wxml和.wxss四个文件组成。但是,组件和页面的.js与.json文件有明显的不同:
- 组件的.json文件中需要声明"component":true属性(这个语句是在声明这个文件是个组件,不是页面)
- 组件的.js文件中调用的是Component()函数(页面的.js文件中调用的是page函数,组件用Component函数)
- 组件的事件处理函数需要定义到methods节点中(和data函数同级)
自定义组件——样式
组件样式隔离
在默认情况下,自定义组件的样式只对当前组件生效,不会影响到组件之外的UI结构,如图所示:
- 组件A的样式不影响组件C的样式
- 组件A的样式不影响小程序页面的样式
- 小程序页面的样式不会影响组件A和C的样式
优势:
1.防止外界的样式影响组件内部的样式
2.防止组建的样式破坏外界的样式
组件样式隔离的注意点
- app.wxss中的全局样式对组件无效
- 只有class选择器会有样式隔离效果,id选择器、属性选择器、标签选择器不受样式隔离的影响
建议:在组件和引用组件的页面中建议使用class选择器,不要使用id、属性、标签选择器
如何修改组件的样式隔离选项
默认情况下,自定义组件的样式隔离性能够防止组件内外样式互相干扰的问题。但有时,我们希望在外界能够控制组件内部的样式,此时,可以通过stylesolation修改组件的样式隔离选项,用法如下:
stylesolation的可选值
自定义组件中的数据、方法和属性
data数据
在小程序组件中,用于组件模板渲染的私有数据,需要定义到data系欸暗中,示例如下:
methods方法
在小程序组件中,事件处理函数和自定义方法(在methods中自写的方法)需要定义到methods节点中,示例代码如下:
properties属性
在小程序中,properties是组件的对外属性,用来接受外界传递到组件中的数据,示例代码如下:
data和properties的区别
data是页面的私有数据,可读可写,properties是接收外界的数据,只能读;
而在小程序当中,properties和data都是可读可写的,只不过:
1.data更倾向于存储组建的私有数据
2.properties更倾向于存储外界传递到组件中的数据
使用setData修改properties的值
由于data和properties属性在本质上没有任何区别,因此properties属性值也可用于页面渲染,或使用setData为properties中的属性重新赋值,示例代码如下:
数据监听器
什么是数据监听?
数据监听器用于监听和相应任何属性和数据字段的变化,从而执行特定的操作。它的作用类似于vue中的watch侦听器。在小程序组件中,数据监听的基本语法如下:
在Component中创建observers对象(与data同级),在对象中声明字段以及字段对应的新值,而后书写代码
监听器的基本用法页面有两个值n1、n2,相加等于sum,我们可以在页面控制n1、n2的值,而sum的值,则是通过监视器计算得来的
注意:上面说的“字段1的新值”,“字段2的新值”起到的是一个形参的作用,在这个函数内部的计算,用这两者变量名就可以了;这只是一个名字
如上图,把计算过程中的newN1、newN2换成this.data.n1、this.data.n2依然可以进行计算;说明,newN1、newN2实质上代表的就是this.data.n1、this.data.n2
监听对象属性的变化
数据监听器支持监听对象中单个或多个属性的变化,示例语句如下:
这与上面的监听语法没什么区别,只不过对象中有多个属性,需要利用.操作符来调用
注意:对非对象的属性赋值时,在setData函数中直接写变量名即可,而为对象内的属性赋值时,需要将对象名.属性用''英文单引号包起来,才能正常赋值
前面对fullColor的定义是字符串类型,而基于Number类型的字段而变化的监听函数,对字符串的赋值案例如下:
其中将${}所包含的符号是``(与~同键),而不是英文单引号
还要考虑,颜色的取值范围(255)
最终效果:
如何监听对象中所有属性的变化
如果某个对象中需要被监听的属性太多,为了方便,可以使用通配符来监听对象中所有属性的变化。对这句话的解释就是:一个对象中有很多属性,我们需要监听的属性有三个(这属于少量属性需要被监听),那么我们就之间听这三个就可以了;但如果需要监听的过多,比如十几个,那么我们就可以使用通配符,来对所有的属性进行监听。示例代码如下:
如上所示,监听对象内属性依旧是用单引''号或""双引号包含,只不过内部的参数语句有变化(注意上面obj的变化)
纯数据字段
什么是纯数据字段?
概念:纯数据字段指的是那些不用于界面渲染的data字段
应用场景:某些data中的字段既不会战士在界面上,也不会传递给其他组件,仅仅在当前组件内部使用。带有这种特性的data字段适合被设置为纯数据字段。
优点:纯数据字段有助于提升页面更新的性能
使用规则
在Component构造器的option节点中,指定pureDataPattern为一个正则表达式,字段名符合这个正则表达式的字段将被定义为纯数据字段,示例如下:
注意:其中/^_/代表只要是下划线开头的数据(这与java中的有些不一样),就会被定义为纯数据字段
利用纯数据字段改造数据监听器
ctrl+d==shift+f6
组件的生命周期
组建的全部生命周期函数
组件主要的生命周期函数
- 1.created
在组件实例刚被创建好的时候,created生命周期函数会被触发
此时还不能调用setData(不能为数据赋值)
通常在这个生命周期函数中,之应该勇于给组件的this添加一些自定义的属性字段 - 2.attached
在组件完全初始化完毕、进入页面节点数后,attached生命周期函数会被触发
此时,this.data亦被出示化完毕
这个生命周期很有限,绝大多数初始化的工作可以在这个时机进行(例如,发送请求获取初始化数据) - 3.detached
在组件被销毁的时候,组件就会离开节点树,detached生命周期函数会被触发
退出一个页面时,会触发页面内每个自定义组件的detached生命周期函数
此时适合做一些清理性的工作
定义组件的生命周期函数lifetimes节点
在小程序组件中,生命周期函数可以直接定义在Component构造器的第一季参数中,可以在lifetimes字段内进行声明(这时推荐的方式,其优先级做高),代码示例:
组件所在页面的生命周期
优势,自定义组件的行为依赖于页面状态的变化,此时就需要用到组件所在页面生命周期。
例如,每当出发页面的show生命周期函数时,我们希望能够获得一个随机生成的rgb颜色值
- show:组件所在页面被展示时执行
- hide:组件所在页面被隐藏是执行
- resize:参数是Object Size,组件所在页面尺寸变化时执行
pageLifetimes
组件在页面生命周期函数,需要定义在pageLifetimes节点中示例代码如下:
随机生成颜色值
随机数Math.random(),生成0~1之间的随机数,而后利用Math.floor向下取整;由于是向下取整,所以范围应该定在0~256之间;语句就是Math.floor(Math.random() * 256)
插槽
什么是插槽
在自定义组件的wxml结构中,可以提供一个<slot>节点,用于承载组件使用者提供的wxml结构
单个插槽
在小程序中,默认每个自定义组件中只允许使用一个<slot>进行占位,这种个数上的限制叫做单个插槽
如何启用多个插槽
在小程序的自定义组件中,需要使用多<slot>插槽时,可以在组件的.js文件中,通过如下方式进行启用。代码示例:
定义多个插槽
可以在组建的.wxml中使用多个<slot>标签,以不同的name来区分不同的插槽。代码示例:
结果:
由上可见,在某个页面的wxml文件中声明组件标签,作用不仅是引入了组件,还有一个作用是用来存放要插入插槽中的组件的
父子组件之间的通信
父子组件之间的通信有三种方式
- 1.属性绑定
只能用于父组件向子组件的指定属性设置数据,仅能设置JSON兼容的数据(只能传递普通数据,不能传递方法等这些复杂的数据) - 2.事件绑定
用于子组件向父组件传递数据,可以传递任意数据 - 3.获取组件实例
父组件可以通过this.selectComponent()获取子组件实例对象
这样就可以直接访问子组件的任意数据和方法
属性绑定
就是通过前面学的,在页面ml文件中引入的组件中传递参数,在组件的.ts文件中的properties函数中声明这个变量以接收这个参数
1.在父组件中定义声明一个变量
2.在引用组件标签中传递参数
3.在子组件中声明这个参数
4.而后便可以在子组件中(自组件的wxml文件中使用这个参数;由于父组件引用了子组件,所以这个值就可以显示在父组件页面)
事件绑定(子向父传值)
可以传递任意数据
- 1.在父组件的.js中,定义一个函数,这个函数即将通过自定义事件的形式,传递给子组件
- 2.在父组件的wxml中,通过自定义事件的形式,将步骤1中定义的函数引用,传递给子组件
- 3.在子组件的js中,通过调用this.triggerEvent('自定义是时间名称',{/参数对象/}),将数据发送到父组件
- 4.在父组件的js中,通过e.detail获取到子组件传递过来的数据
1.在父组件的.js中,定义一个函数,这个函数即将通过自定义事件的形式,传递给子组件
在父组件中定义一个函数,这个函数定义时括号内要有参数e(用来以后接收数据),与父向子传递数据一样,在引入组件标签中将函数传递给子组件;传递的语句如下:
2.在子组件的js中,通过调用this.triggerEvent('自定义是时间名称',{/参数对象/}),将数据发送到父组件
在子组件的methods函数中(注意:this.triggerEvent在被传递的数据刚刚被赋值时使用),通过this.triggerEvent函数,将数据想要传递的数据,传到父组件中
两个不一样的函数名,相当于是一个标记建立联系,子组件根据sync来找到父组件中的函数;参数被传递过去后,再由父组件中的函数来处理
在父组件的js中,通过e.detail获取到子组件传递过来的数据
注意:上面的形参位置不能填写e,而要填写e:any
获取组件实例
可在父组件中调用this.seletComponent("id或class选择器"),获取子组件的实例对象,从而直接访问子组件的任意数据和方法。调用时需要传入一个选择器,例如this.seletComponent(".my-component")不支持标签选择器
思路:为在页面中引入的组件标签添加上类名选择器或是标签选择器;而后再页面的.js文件中定义一个自定义函数,在函数中利用this.seletComponent("id或class选择器")获取到目标组件的实例对象,而后再赋值给一个变量,通过这个变量,就可以在父组件中访问到自组建的数据和方法,上图其中的const,用于定义常量是一种数据类型
而在使用组件实例对象时,也要注意;哪怕时使用setData()使用的也是子组件中的,所以,依然需要用.操作符来调用;而为什么this.后面跟的是properties?原因是:count定义在properties中
num定义在data中,那就用this.data来调用
behaviors
什么是behaviors
是小程序中,用于实现组件代码共享的特性,类似于Vue.js中的“mixins”(很多代码是一样的,没必要重复写,就把这些代码封装到behaviors中)
behaviors的工作方式
每个behaviors可以包含一组属性、数据、生命周期和方法。组件引用它时,它的属性、数据和方法会被合并到组件中
每个组件可以引用多个behaviors,behaviors也可以引用其它behaviors
创建behaviors
调用Behavior(Object object)方法即可创建一个共享的behavior实例对象,共所有的组件使用:
创建一个新的.ts文件夹在文件内部声明Behavior({})函数,这个函数的返回值就是一个实例对象,我们就在利用module.exports共享出去
导入并使用behavior
在组建中,使用require()方法导入需要的behavior,挂在后即可访问behavior中的数据或方法,示例代码:
挂载:将导入的behavior(接收导入的behavior的那个变量),放到Component函数中的behaviors数组中
behavior中所有可用的节点
同名字段的覆盖和组合规则
组件和她引用的bahavior中可以包含同名的字段,此时可以参考如下3中同名时的处理规则:
- 情况一:同名的数据字段(data)
- 情况二:同名的属性(properties)或方法(method)
- 情况三:同名的生命周期函数