# behaviors
## 定义和使用 behaviors
`behaviors` 是用于组件间代码共享的特性,类似于一些编程语言中的“mixins”或“traits”。
每个 `behavior` 可以包含一组属性、数据、生命周期函数和方法,组件引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。每个组件可以引用多个 `behavior` 。 `behavior` 也可以引用其他 `behavior` 。
`behavior` 需要使用 `Behavior()` 构造器定义。
**代码示例:**
```
// my-behavior.js
module.exports = Behavior({
behaviors: [],
properties: {
myBehaviorProperty: {
type: String
}
},
data: {
myBehaviorData: {}
},
attached: function(){},
methods: {
myBehaviorMethod: function(){}
}
})
```
组件引用时,在 `behaviors` 定义段中将它们逐个列出即可。
**代码示例:**
```
// my-component.js
var myBehavior = require('my-behavior')
Component({
behaviors: [myBehavior],
properties: {
myProperty: {
type: String
}
},
data: {
myData: {}
},
attached: function(){},
methods: {
myMethod: function(){}
}
})
```
在上例中, `my-component` 组件定义中加入了 `my-behavior` ,而 `my-behavior` 中包含有 `myBehaviorProperty` 属性、 `myBehaviorData` 数据字段、`myBehaviorMethod` 方法和一个 `attached` 生命周期函数。这将使得 `my-component` 中最终包含 `myBehaviorProperty` 、 `myProperty` 两个属性,`myBehaviorData` 、 `myData` 两个数据字段,和 `myBehaviorMethod` 、 `myMethod` 两个方法。当组件触发 `attached` 生命周期时,会依次触发 `my-behavior` 中的 `attached` 生命周期函数和 `my-component` 中的 `attached` 生命周期函数。
## 字段的覆盖和组合规则
组件和它引用的 `behavior` 中可以包含同名的字段,对这些字段的处理方法如下:
- 如果有同名的属性或方法,组件本身的属性或方法会覆盖 `behavior` 中的属性或方法,如果引用了多个 `behavior` ,在定义段中靠后 `behavior` 中的属性或方法会覆盖靠前的属性或方法;
- 如果有同名的数据字段,如果数据是对象类型,会进行对象合并,如果是非对象类型则会进行相互覆盖;
- 生命周期函数不会相互覆盖,而是在对应触发时机被逐个调用。如果同一个 `behavior` 被一个组件多次引用,它定义的生命周期函数只会被执行一次。
## 内置 behaviors
自定义组件可以通过引用内置的 `behavior` 来获得内置组件的一些行为。
**代码示例:**
```
Component({
behaviors: ['wx://form-field']
})
```
在上例中, `wx://form-field` 代表一个内置 `behavior` ,它使得这个自定义组件有类似于表单控件的行为。
内置 `behavior` 往往会为组件添加一些属性。在没有特殊说明时,组件可以覆盖这些属性来改变它的 `type` 或添加 `observer` 。
### wx://form-field
使自定义组件有类似于表单控件的行为。 form 组件可以识别这些自定义组件,并在 submit 事件中返回组件的字段名及其对应字段值。这将为它添加以下两个属性。
| 属性名 | 类型 | 描述 | 最低版本 |
| ----- | ------ | -------- | ---------------------------------------- |
| name | String | 在表单中的字段名 | [1.6.7](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/compatibility.html) |
| value | 任意 | 在表单中的字段值 | [1.6.7](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/compatibility.html) |
- 简介
- 第一章 公众号开发
- 使用微信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
- 第三章 小游戏开发
- 参考资料