# 组件模版和样式
类似于页面,自定义组件拥有自己的 `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>
```
- 简介
- 第一章 公众号开发
- 使用微信JSSDK
- 接口权限配置
- 分享接口
- 隐藏按钮项
- 微信支付
- 第二章 小程序开发
- 基础知识
- 分包加载
- WXSS样式表
- 配置
- app.json配置
- window
- tabBar
- page.json配置
- 逻辑层
- app.js
- 场景值
- page.js
- 初始化数据
- 生命周期函数
- 页面相关事件处理函数
- 事件处理函数
- 页面实例方法
- 路由
- 文件作用域
- 模块化
- 视图层
- 模板语法
- 列表渲染
- 条件渲染
- 模板
- 事件
- 引用
- WXS语法规范
- WXS数据类型
- WXS控制流程
- WXS基础类库
- 组件
- 视图容器
- view
- scroll-view
- swiper
- movable-view
- cover-view
- 基础组件
- icon
- text
- rich-text
- progress
- 表单组件
- button
- checkbox
- form
- input
- label
- picker
- picker-view
- radio
- slider
- switch
- textarea
- 导航组件
- navigator
- 媒体组件
- audio
- image
- video
- camera
- 地图组件
- map
- 画布组件
- canvas
- 开放能力
- web-view
- 自定义组件
- 组件模版和样式
- Component
- 组件传值
- 组件事件
- Behaviors
- 组件间关系
- 网络请求
- wx.request
- 微信登录
- 获取 openid 和 unionid
- 获取用户信息
- 将 wx.request 封装为 promise
- 上传图片接口封装
- 数据存储
- 存储数据和读取数据
- 获取数据缓存信息
- 移除数据缓存
- 获取用户设置
- openSetting
- getSetting
- 第三章 小游戏开发
- 参考资料