🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 组件模版和样式 类似于页面,自定义组件拥有自己的 `wxml` 模版和 `wxss` 样式。 ### 组件模版 组件模版的写法与页面模板相同。组件模版与组件数据结合后生成的节点树,将被插入到组件的引用位置上。 在组件模板中可以提供一个 `<slot>` 节点,用于承载组件引用时提供的子节点。 **代码示例:** **组件** *components/com/index.wxml* ```html <view class="wrapper"> <view>这里是组件的内部节点</view> <slot></slot> </view> ``` *components/com/index.json* 必须在组件的json配置中加入 `"component": true`,才能识别这是一个组件。 ```json { "component": true } ``` *components/com/index.js* 在 js 中使用 `Component()` 声明这是一个组件。 ```js Component({}) ``` **引用组件的页面** *pages/test/index.wxml* ```html <view> <component-tag-name> <!-- 这部分内容将被放置在组件 <slot> 的位置上 --> <view>这里是插入到组件slot中的内容</view> </component-tag-name> </view> ``` *pages/test/index.json* 在json中引入组件。 ```json { "usingComponents": { "component-tag-name": "/components/com/index" } } ``` *pages/test/index.js* 在 js 中使用 `Page()` 声明这是一个页面。 ```js Page({}) ``` ### 组件wxml的slot 在组件的wxml中可以包含 `slot` 节点,用于承载组件使用者提供的wxml结构。 默认情况下,一个组件的wxml中只能有一个slot。需要使用多slot时,可以在组件js中声明启用。 ```js Component({ options: { multipleSlots: true // 在组件定义时的选项中启用多slot支持 } }) ``` 此时,可以在这个组件的wxml中使用多个slot,以不同的 `name` 来区分。 **组件模板** ```html <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> ``` ### 组件样式 组件对应 `wxss` 文件的样式,只对组件wxml内的节点生效。编写组件样式时,需要注意以下几点: - 组件和引用组件的页面不能使用id选择器(`#a`)、属性选择器(`[a]`)和标签名选择器,请改用class选择器。 - 组件和引用组件的页面中使用后代选择器(`.a .b`)在一些极端情况下会有非预期的表现,如遇,请避免使用。 - 子元素选择器(`.a>.b`)只能用于 `view` 组件与其子节点之间,用于其他组件可能导致非预期的情况。 - 继承样式,如 `font` 、 `color` ,会从组件外继承到组件内。 - 除继承样式外, `app.wxss` 中的样式、组件所在页面的的样式对自定义组件无效。 ``` #a { } /* 在组件中不能使用 */ [a] { } /* 在组件中不能使用 */ button { } /* 在组件中不能使用 */ .a > .b { } /* 除非 .a 是 view 组件节点,否则不一定会生效 */ ``` 除此以外,组件可以指定它所在节点的默认样式,使用 `:host` 选择器(需要包含基础库 [1.7.2](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/compatibility.html) 或更高版本的开发者工具支持)。 **代码示例:** ```css /* 组件 custom-component.wxss */ :host { color: yellow; } <!-- 页面的 WXML --> <custom-component>这段文本是黄色的</custom-component> ```