前言
组件对应 wxss 文件的样式,只对组件wxml内的节点生效;但是如果修改组件中如:checkbox、radio等它们的默认样式,在组件wxss中修改也是无效的;并且怎么在组件引用的页面去控制组件中的样式呢?
方法
在组件的js文件中将wxml中需要修改的标签class暴露出来,然后在引用组件时对暴露出来的class进行class覆盖;
// 组件中需要修改的标签 如:
<view class="myclass">我是组件内部标签view>
/* 组件 myComponent.js */
Component({
externalClasses: ['my-class'] // 可以是多个class名
})
<myComponent my-class="text">myComponent>
.text {
color: red;
}
在官网中有组件样式隔离这一说明,就是可以在组件内部去指定组件的样式与页面的样式之间如何共享和隔离;
Component({
options: {
styleIsolation: 'shared'
}
})
styleIsolation可以取一下几个值:
- isolated 表示启用样式隔离,在自定义组件内外,使用 class 指定的样式将不会相互影响
- apply-shared 表示页面 wxss 样式将影响到自定义组件,但自定义组件 wxss 中指定的样式不会影响页面
- shared 表示页面 wxss 样式将影响到自定义组件,自定义组件 wxss 中指定的样式也会影响页面和其他设置了 apply-shared 或 shared 的自定义组件。(这个选项在插件中不可用。)
/* 组件 myComponent.js */
Component({
options: {
addGlobalClass: true,
}
})
这样在页面中或者在app.wxss都可以设置组件中的样式了
即使启用了样式隔离 isolated ,组件仍然可以在局部引用组件所在页面的样式或父组件的样式。
.blue-text {
color: blue;
}
<view class="~blue-text"> 这段文本是蓝色的 view>
.red-text {
color: red;
}
<view class="^red-text"> 这段文本是红色的 view>
#a { } /* 在组件中不能使用 /
[a] { } / 在组件中不能使用 /
button { } / 在组件中不能使用 /
.a > .b { } / 除非 .a 是 view 组件节点,否则不一定会生效 */