微信小程序自定义组件笔记-组件模板和样式
https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/wxml-wxss.html
组件拥有自己的 wxml 模板和 wxss 样式
组件模板中可以提供一个 <slot> 节点,用于承载组件引用时提供的子节点
<!-- 组件模板 -->
<view class="wrapper">
<view>这里是组件的内部节点</view>
<slot></slot>
</view>
<!-- 引用组件的页面模板 -->
<view>
<component-tag-name>
<!-- 这部分内容将被放置在组件 <slot> 的位置上 -->
<view>这里是插入到组件slot中的内容</view>
</component-tag-name>
</view>
默认情况下,一个组件的wxml中只能有一个slot。需要使用多slot时,可以在组件js中声明启用。
Component({
options: {
multipleSlots: true // 在组件定义时的选项中启用多slot支持
},
/*…*/
})
在这个组件的wxml中使用多个slot,以不同的 name 来区分。
<!-- 组件模板 -->
<view class="wrapper">
<slot name="before"></slot>
<view>这里是组件的内部细节</view>
<slot name="after"></slot>
</view>
使用
<!-- 引用组件的页面模板 -->
<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>
页面模板引用自定义组件及其对应的节点名需要在 json 文件中显式定义
数据绑定,这样就可以向子组件的属性传递动态数据。
<!-- 引用组件的页面模板 -->
<view>
<component-tag-name prop-a="{{dataFieldA}}" prop-b="{{dataFieldB}}">
</component-tag-name>
</view>
只能传递 JSON 兼容数据。自基础库版本 2.0.9 开始,还可以在数据中包含函数
组件样式
只对组件wxml内的节点生效,注意
不能使用 id选择器 #a 属性选择器[a] button(标签选择器)
避免使用代选择器 .a .b
.a > .b 除非 .a 是 <view> ,否则不一定会生效
继承样式,如 font 、 color ,会从组件外继承到组件内。
除继承样式外, app.wxss 样式、页面样式对自定义组件无效(除非更改隔离选项)。
:host 指定所在节点样式。
样式隔离
默认自定义组件的样式只受自身 wxss 影响,除非:
app.wxss 或页面 wxss 中使用了标签名选择器(或一些其他特殊选择器),不推荐。
指定样式隔离选项 styleIsolation 。
Component({
options: {
styleIsolation: 'isolated'
}
})
或在.json文件中:
{
"styleIsolation": "isolated"
}
isolated (默认值) class 指定的样式将不会相互影响
apply-shared 页面影响自定义组件,自定义组件不影响页面;
shared 页面影响自定义组件,自定义组件影响页面和 其他 apply-shared 或 shared 的自定义组件。(插件不可用)。
Component 构造器用于构造页面 额外的样式隔离选项可用:
page-isolated 完成隔离
page-apply-shared 只会受shared自定义组件影响
page-shared 会影响apply-shared、shared自定义组件,会受shared自定义组件影响。
addGlobalClass: true 等阶于 styleIsolation: 'isolated'
外部样式类
接受外部传入的样式类
注意:同一节点使用普通样式类和外部样式类时,两个类的优先级是未定义的,避免这种情况。
/* 组件 custom-component.js */
Component({
externalClasses: ['my-class']
})
<!-- 组件 custom-component.wxml -->
<custom-component class="my-class">这段文本的颜色由组件外的 class 决定</custom-component>
<!-- 页面的 WXML -->
<custom-component my-class="red-text" />
<custom-component my-class="large-text" />
<!-- 以下写法需要基础库版本 2.7.1 以上 -->
<custom-component my-class="red-text large-text" />
.red-text {
color: red;
}
.large-text {
font-size: 1.5em;
}
引用页面或父组件的样式
即使启用了样式隔离 isolated,仍可以引用
引用页面中的class:
<view class="~blue-text"> 引用页面的样式类 </view>
引用父组件中的class:
<view class="^red-text"> 引用父组件的样式类 </view>
<view class="^^red-text"> 引用祖父组件的样式类 </view>
独立、通用的组件,请优先使用外部样式类