版本要求:
从小程序基础库版本 1.6.3 开始,小程序支持简洁的组件化编程。开发者可以将页面内的功能模块抽象成自定义组件,以便在不同的页面中重复使用;也可以将复杂的页面拆分成多个低耦合的模块,有助于代码维护。 注意:自定义组件在使用时与基础组件非常相似

构成部分,每个自定义组件由四个代码文件组成:
①json文件 用于于放置一些最基本的组件配置
②wxml 文件 组件模版
③wxss 文件 组件的样式,只在组件内部节点上生效(这个文件是可选的)
④js 文件 组件的 JS 代码,承载组件的主要逻辑

这四个文件与编写一个页面时用到的四个文件非常类似,但也有区别。接下来介绍如何利用这四个文件编写一个简单的自定义组件。

(1)文件夹位置

首先要确定文件位置,官方并没有明确规定自定义组件的文件放在哪里,但是为了自己或团队的方便,建议大家在根目录下创建一个components目录,用来存放所有自定义组件。 20210404234422791

(2)创建组文件

在components文件夹下新建myComponent组文件,用来盛放自定义组件,如下所示
20210404234422792

(3)组件配置

类似于页面,一个自定义组件由 jsonwxmlwxssjs 4个文件组成。要编写一个自定义组件,首先需要在 json 文件中进行自定义组件声明(将 component 字段设为 true ,即可将该组文件设为自定义组件)
配置json文件

{
  "component": true,
  "usingComponents": {}
}

(4)组件模板

在 wxml 文件中编写组件模板,在 wxss 文件中加入组件样式,它们的写法与页面的写法似。
组件模板的写法与页面模板相同,这个模版将在组件中渲染出一个 checkbox 和一个 label

<!--components/myComponent/myComponent.wxml-->
<view class="componentArea">
  <label for="checkbox" class="label" bindtap="labelTap">
    <checkbox id="checkbox" checked></checkbox>
    {\{title}\}
  </label>
</view>

(5)组件样式

类似于页面, wxss 文件中可以指定组件节点的样式。其中的样式仅在组件内部生效。需要注意的是,样式只能通过类选择器(如 .the-class-name )来指定。

注意:

①组件和引用组件的页面不能使用id选择器(#a)、属性选择器([a])和标签名选择器,请改用class选择器。
②组件和引用组件的页面中使用后代选择器(.a .b)在一些极端情况下会有非预期的表现,如遇,请避免使用。
③继承样式,如 font 、 color ,会从组件外继承到组件内。
④除继承样式外, app.wxss 中的样式、组件所在页面的的样式对自定义组件无效(除非更改组件样式隔离选项)

.componentArea{
  color: red;
  font-size: 60rpx;
  background: rgba(0, 0, 0, 0.1);
}

(6)组件定义

组件的 JS 文件中必须包含组件定义。定义时使用 Component 构造器:

Component({
  /**
   * 组件的属性列表
   * 组件外部在使用组件时就可以指定这个属性的值
   */
  properties: {
    title: String
  },

  /**
   * 组件的初始数据
   * 组件的内部数据,可以使用this.setData方法来改变
   */
  data: {

  },

  /**
   * 组件的方法列表
   * 可以永凯包含组件的事件回调函数
   */
  methods: {
    labelTap(){
      console.log('你点击了按钮')
    }
  }
})

(7)调用自定义组件

Step 1步骤一:
在需要使用这个组件的页面所对应的 json 文件中,添加自定义组件声明。
例如在个人认证页面调用引入自定义组件

{
  "usingComponents": {
    "myComponent":"/components/myComponent/myComponent"
  },
  "navigationBarTitleText": "信息认证"
}

Step 2步骤二:
在页面对应的 wxml 文件中使用即可

<view class="componentArea">
  <myComponent title="我已阅读"></myComponent>
</view>

20210404234422793