自定义组件

100 阅读10分钟
  1. 创建和注册组件

     1.如果是公共组件,建议放在项目根目录的 components 文件夹中
     2.如果是页面组件,建议放在对应页面的目录下
         建议:一个组件一个文件夹
     3.开发中常见的组件主要分为 公共组件 和 页面组件 两种,因此注册组件的方式也分为两种:
         1.全局注册:在 app.json 文件中配置 usingComponents 进行注册,注册后可以在任意页面使用
         2.局部注册:在页面的json 文件中配置 usingComponents进行注册,注册后只能在当前页面使用
     4.在 usingComponents 中进行组件注册时,需要提供 自定义组件的组件名 和 自定义组件文件路径
     5.在将组件注册好以后,直接将 自定义组件的组件名 当成 组件标签名 使用即可
    

2.组件的数据以及方法

    组件数据和方法需要在 组件.js 的 Component 方法中进行定义, Component 创建自定义组件
        1.data :定义组件的内部数据
        2.methods:在组件中事件处理程序需要写到 methods 中才可以

3.组件的属性

Properies 是指组件的对外属性,主要用来接收组件使用者传递给组件内部的数据,和 data 一同用于组件的模板渲染

4.组件的属性

1.Properies 是指组件的对外属性,主要用来接收组件使用者传递给组件内部的数据,和 data 一同用于组件的模板渲染
2.注意事项:设置属性类型需要使用 type 属性,属性类型是必填项,value 属性为默认值属性类型可以为 StringNumberBooleanObjectArray ,也可以为 nu 表示不限制类型

5.组件 wxml 的 slot-插槽

1.在使用基础组件时,可以在组件中间写子节点,从而将子节点的内容展示到页面中,自定义组件也可以接收子节
2.只不过在组件模板中需要定义<slot/>节点,用于承载组件中间的子节点
3.默认情况下,一个组件的 wxml中只能有一个 slot(默认插槽)需要使用多 slot 时 ,可以在组件 js 中声明启用.
4.同时需要给 slot 添加 name 属性来区分不同的 slot (具名插槽)
5.然后给子节点内容添加 slot属性,属性值是对应 slot 的 name 名称,从而将内容插入到 对应的 slot 中

6.组件样式以及注意事项

1.自定义组件拥有自己的 wxss 样式,组件 wxss 文件的样式,默认只对当前组件生效
2.编写组件样式时,需要注意以下几点:
    1.app.wxss 或页面的 wxss 中使用了标签名(view)选择器(或一些其他特殊选择器)来直接指定样式
        这些选择器会影响到页面和全部组件,通常情况下这是不推荐的做法
    2.组件和引用组件的页面不能使用id 选择器(#a)、属性选择器([a]) 和 标签名选择器,请改用 class 选择器
    3.组件和引用组件的页面中使用后代选择器(a.b)在一些极端情况下会有非预期的表现,如遇,请避免使用
    4.子元素选择器(.a>.b)只能用于 vew 组件与其子节点之间,用于其他组件可能导致非预期的情况。
    5.继承样式,如 font、color ,会从组件外继承到组件内。
    6.除继承样式外,全局中的样式、组件所在页面的的样式对自定义组件无效(除非更改组件样式隔离选项)

7.组件样式隔离

默认情况下,自定义组件的样式只受自身 wxss 的影响,但是有时候我们需要组件使用者的样式能够影响到组件,这时候就需要指定特殊的样式隔离选项 stylelsolation,选择它支持以下取值:
    1.isolated: 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响(一般情况下的默认值)
    2. apply-shared: 表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面
    3.shared: 表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了 apply-sharedshared 的自定义组件。

8.数据监听器

1.数据监听器主要用于监听和响应任何属性(properies)和 数据(data)的变化,当数据发生变化时就会触发对应回调函数,从而方便开发者进行业务逻辑的处理
2.在组件中如果需要进行数据监听 需要使用 observers 字段

9.组件通信-父往子传值

父组件如果需要向子组件传递数据,只需要两个步骤:
    1.在父组件 WXML 中使用 数据绑定 的方式向子组件传递动态数据
    2.子组件内部使用 properties 接收父组件传递的数据即可

10.组件通信-子往父传值

子组件如果需要向父组件传递数据,可以通过小程序提供的事件系统实现,可以传递任意数据
    1.自定义组件内部使用 tiggerEvent 方法发射一个自定义的事件,同时可以携带数据
    2.自定义组件标签上通过 bind 方法监听 发射的事件,同时绑定事件处理函数,在事件函数函数中通过事件对象获取传递的数据

11.组件通信-获取组件实例

父组件可以 通过 this.selectComponent方法,获取子组件实例对象,这样就可以直接访问子组件的任意数据和方法
this.selectComponent方法在调用时需要传入一个匹配选择器 selector

12.组件生命周期

1.组件的生命周期:指的是组件自身的一些钩子函数,这些函数在特定的时间节点时被自动触发
2.组件的生命周期函数需要在 lifetimes 字段内进行声明
3.组件的生命周期函数有5个:created、attached、ready、 moved、 detached
    小程序页面 -> created(组件实例创建完毕)  -> attached(模板解析完成挂载到页面)  ->  detached(组件被销毁)
        注意事项:created 钩子函数中不能调用 setData

13.组件所在页面的生命周期

1.组件还有一些特殊的生命周期,这类生命周期和组件没有很强的关联
2.主要用于组件内部监听父组件的展示、隐藏状态,从而方便组件内部执行一些业务逻辑的处理
3.组件所在页面的生命周期有4个:showhide、resize、routeDone,需要在 pageLifetimes 字段内进行声明
    小程序页面展示  -> show(组件所在的页面被展示时执行)
    小程序页面隐藏  -> hide(组件所在的页面被隐藏时执行)

14.小程序生命周期总结

一个小程序完整的生命周期由 应用生命周期、页面生命周期 和 组件生命周期 三部分来组成
    1. 小程序冷启动,钩子函数执行的顺序
    2.保留当前页面,进入下一个页面,钩子函数执行的顺序
    3. 销毁当前页面,进入下一个页面,钩子函数执行的顺序
    4. 小程序热启动,钩子函数执行的顺序

15.小程序生命周期总结

1.小程序冷启动,钩子函数执行的顺序
onLaunch(小程序应用)  ->  onShow(小程序应用)  ->  created(小程序组件)  ->  attached(小程序组件)  ->  onLoad(小程序页面)  ->  onShow(小程序页面)   ->  ready(小程序组件)  ->   onReady(小程序页面)
2.保留当前页面-navigate
小程序页面: onHide     ->(进入新页面)      onLoad
3.关闭当前页面-redirect
onUnload(小程序页面)  ->   detached(小程序组件)    ->(进入新页面)   onLoad(小程序页面)
4.切后台
onHide(小程序应用)  <-   onHide(小程序页面)
5.热启动
onShow(小程序应用)  ->   onShow(小程序页面)

16.拓展:使用Component 构造页面

1.Component 方法用于创建自定义组件
2.小程序的页面也可以视为自定义组件,因此页面也可以使用 Component方法进行创建,从而实现复杂的页面逻辑开发
3.为什么需要使用 component 方法进行构造页面
    component 方法功能比 Page 方法强大很多
    如果使用 component 方法构造页面,可以实现更加复杂的页面逻辑开发
4.小程序页面也可以使用component 方法进行构造
5.注意事项:
    1.要求对应 json 文件中包含 usingComponents 定义段
    2.页面使用 Component 构造器创建,需要定义与普通组件一样的字段与实例方法
    3.页面 Page 中的一些生命周期方法(如 onLoad()等以“on“开头的方法),在 Component 中要写在 methods 属性中才能生效
    4.组件的属性 Properties 可以用于接收页面的参数,在 onLoad() 中可以通过 this.data 拿到对应的页面参数

17.拓展:组件复用机制 behaviors

1.小程序的 behaviors 方法是一种代码复用的方式,可以将一些通用的逻辑和方法提取出来,然后在多个组件中复用,从而减少代码冗余提高代码的可维护性。
2.如果需要 behavior 复用代码,需要使用 Behavior()方法,每个 behavior 可以包含一组属性、数据、生命周期函数和方法
3.组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。
4.组件和它引用的 behavior 中可以包含同名的字段,对这些字段的处理方法如下
    1.如果有同名的属性或方法,采用“就近原则",组件会覆盖 behavior 中的同名属性或方法
    2.如果有同名的数据字段且都是对象类型,会进行对象合并,其余情况会 采用“就近原则”进行数据覆盖
    3.生命周期函数和 observers 不会相互覆盖,会是在对应触发时机被逐个调用,也就是都会被执行

18.拓展:外部样式类

1.默认情况下,组件和组件使用者之间如果存在相同的类名不会相互影响,组件使用者如果想修改组件的样式,需要就解除样式隔离,但是解除样式隔离以后,在极端情况下,会产生样式冲突、CSS 嵌套太深等问题,从而给我们的开发带来一定的麻烦。
2.外部样式类:在使用组件时,组件使用者可以给组件传入CSS 类名,通过传入的类名修改组件的样式。
3.如果需要使用外部样式类修改组件的样式,在 Component 中需要用 extemalClasses 定义若干个外部样式类
4.外部样式类的使用步骤:
    1.在 Component 中用 extermalClasses 定义段定义若干个外部样式类1.
    2自定义组件标签通过 属性绑定 的方式提供一个样式类,属性是 externalClasses 定义的元素,属性值是传递的类名
    3.将接受到的样式类用于自定义组件内部
5.注意事项:
    在同一个节点上使用普通样式类和外部样式类时,两个类的优先级是未定义的,因此需要添加!impartant 以保证外部样式类的优先级

19.总结自定义组

1.组件基本使用:数据、属性、方法、插槽
2.组件样式使用:组件样式、注意事项、样式隔离、外部样式类
3.组件通信传值:父往子传值、子往父传值、获取组件实例
4.组件生命周期:组件的生命周期、组件所在页面的生命周期、总结了小程序全部的生命周期
5.组件数据监听器:observers
6.组件拓展:使用 Component构造页面、组件复用机制 behaviors 等