重构引发的思考
最近在重构小程序,重构的时候发现很多页面都用到了定位与逆地理解析这一功能,于是项目里几乎每个页面都要写一下获取定位的相关逻辑,实在头大。有没有办法抽离这部分逻辑呢?写成Component又太庞大,因为我们只需要js的相关逻辑。把方法抽离到utils中再调用,又需要再声明个响应式data去接收,都不是最优方案。那小程序能不能做到混入呢?答案是:能!
小程序中的behaviors
behaviors 是用于组件间代码共享的特性,类似于一些编程语言中的 “mixins” 或 “traits”。
每个 behavior 可以包含一组属性、数据、生命周期函数和方法。组件(注意:基础库 2.9.2 开始在页面中也支持使用 behaviors)引用它时,它的属性、数据和方法会被合并到组件中,生命周期函数也会在对应时机被调用。 每个组件可以引用多个 behavior ,behavior 也可以引用其它 behavior 。
behavior 需要使用 Behavior() 构造器定义。
参考文档
Behavior(Object object)
注册一个 behavior,接受一个 Object 类型的参数。
定义段 | 类型 | 是否必填 | 描述 |
---|---|---|---|
properties | Object Map | 否 | 同组件的属性 |
data | Object | 否 | 同组件的数据 |
methods | Object | 否 | 同自定义组件的方法 |
behaviors | String Array | 否 | 引入其它的 behavior |
created | Function | 否 | 生命周期函数 |
attached | Function | 否 | 生命周期函数 |
ready | Function | 否 | 生命周期函数 |
moved | Function | 否 | 生命周期函数 |
detached | Function | 否 | 生命周期函数 |
示例
// /behaviors/location.js
let QQMapWX = require('../utils/qqmap-wx-jssdk.min.js');
let qqmapsdk = new QQMapWX({
key: '你自己的key'});
module.exports = Behavior({
// 共享数据
data: {
location: {
}
},
methods: {
getLocation() {
// 因为我们的业务功能必须在位置信息获取到以后才能正常使用,所以这里封装成Promise,以便链式调用
return new Promise((resolve, reject) => {
wx.authorize({
scope: 'scope.userLocation'}