小程序开放平台

文档中心
起步
目录
配置小组件
小组件框架
小组件运行时
自定义组件
自定义组件
组件模块和样式
组件构造器
组件间通信与事件
组件生命周期
组件行为
数据监听器
自定义组件拓展
开发第三方自定义组件
基础能力
开放能力
性能优化

组件模块和样式

开发
>
指南
>
自定义组件
>
组件模块和样式
>
更新时间:2025-08-04 14:55:03

类似于页面,自定义组件拥有自己的 xhsml 模板和 css 样式。

组件模板

组件模板的写法与页面模板相同。组件模板与组件数据结合后生成的节点树,将被插入到组件的引用位置上。

在组件模板中可以提供一个

<slot>
节点,用于承载组件引用时提供的子节点。

<!-- 组件模板 -->
<view class="wrapper">
  <view>这里是组件的内部节点</view>
  <slot></slot>
</view>
<!-- 引用组件的页面模板 -->
<view>
  <component-tag-name>
    <!-- 这部分内容将被放置在组件 <slot> 的位置上 -->
    <view>这里是插入到组件slot中的内容</view>
  </component-tag-name>
</view>

注意,在模板中引用到的自定义组件及其对应的节点名需要在 json 文件中显式定义,否则会被当作一个无意义的节点。

模板数据绑定

与普通的 XHSML 模板类似,可以使用数据绑定,这样就可以向子组件的属性传递动态数据。

<!-- 引用组件的页面模板 -->
<view>
  <component-tag-name prop-a="{{dataFieldA}}" prop-b="{{dataFieldB}}">
    <!-- 这部分内容将被放置在组件 <slot> 的位置上 -->
    <view>这里是插入到组件slot中的内容</view>
  </component-tag-name>
</view>

在以上例子中,组件的属性 propA 和 propB 将收到页面传递的数据。

注意:页面中不可以通过 setData 来改变绑定的数据字段。

注意:这样的数据绑定只能传递 JSON 兼容数据。

组件 xhsml 的 slot

在组件的 xhsml 中可以包含 slot 节点,用于承载组件使用者提供的 xhsml 结构。

默认情况下,一个组件的 xhsml 中只能有一个 slot 。需要使用多 slot 时,应使用不同的

name
来区分。

<!-- 组件模板 -->
<view class="wrapper">
  <slot name="before"></slot>
  <view>这里是组件的内部细节</view>
  <slot name="after"></slot>
</view>

使用时,用 slot 属性来将节点插入到不同的 slot 上。

<!-- 引用组件的页面模板 -->
<view>
  <component-tag-name>
    <!-- 这部分内容将被放置在组件 <slot name="before"> 的位置上 -->
    <view slot="before">这里是插入到组件slot name="before"中的内容</view>
    <!-- 这部分内容将被放置在组件 <slot name="after"> 的位置上 -->
    <view slot="after">这里是插入到组件slot name="after"中的内容</view>
  </component-tag-name>
</view>

组件样式

组件对应 css 文件的样式,只对组件 xhsml 内的节点生效。编写组件样式时,需要注意以下几点:

  • 组件和引用组件的页面不能使用 id 选择器(#a)、属性选择器(a)和标签名选择器,请改用 class 选择器。
  • 组件内,可以使用 app.css 中定义的样式。

组件样式隔离

默认情况下,自定义组件的样式只受到自定义组件 css 的影响。除非以下两种情况:

  • app.css 或页面的 css 中使用了标签名选择器(或一些其他特殊选择器)来直接指定样式,这些选择器会影响到页面和全部组件。通常情况下这是不推荐的做法。
  • 在组件的 json 中指定特殊的样式隔离选项
    styleIsolation
{
  "styleIsolation": "isolated"
}

styleIsolation
选项从基础库版本 3.16.5,开发者工具 1.59.23-beta.15 开始支持。它支持以下取值:

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

使用后两者时,请务必注意组件间样式的相互影响。

外部样式类

小组件基础库版本 2.0.3 开始支持。

当组件希望接受外部传入的样式类时,可以在 Component 中用 externalClasses 字段定义若干个外部样式类。

/* 组件 custom-component.js */
Component({
    externalClasses: ['external-class']
});
<!-- 组件 custom-component.xhsml -->
<view class="external-class">这段文本的颜色由组件外的 class 决定</view>

组件的使用者可以像使用其他属性一样,指定这个样式类对应的 class 。

<!-- 使用组件的页面或者组件 -->
<custom-component external-class="red-text" />
.red-text {
    color: red;
}

同时,可以支持指定多个对应的 class 。

<!-- 使用组件的页面或者组件 -->
<my-component my-class="red-text bg-color" />

全局样式类

小组件基础库版本 2.0.3 开始支持。

Component
options
中设置
addGlobalClass: true
,这个选项等价于设置
styleIsolation: apply-shared
,但设置了
styleIsolation
选项后这个选项会失效。

/* 组件 custom-component.js */
Component({
    options: {
        addGlobalClass: true,
    }
});
<!-- 组件 custom-component.xhsml -->
<text class="global-class">这段文本的颜色由组件外的 class 决定</text>
/* 组件外的样式定义 */
.global-class {
    color: red;
}