// 使用 `export` 关键字将名为 `basic` 的变量作为模块的导出项，以便其他模块可以引入并使用它。
// `basic` 被赋值为通过 `Behavior` 函数创建的一个行为对象（在微信小程序等框架中，行为可以被组件引入来复用其中的属性、方法等功能）。
export const basic = Behavior({
    // `methods` 属性用于定义在该行为对象中包含的一系列方法，这些方法可以被使用了这个行为的组件所调用。
    methods: {
        // 定义名为 `$emit` 的方法，其功能是调用 `this.triggerEvent` 方法，并将接收到的所有参数原封不动地传递给 `triggerEvent` 方法。
        // 这里的 `$emit` 可能是仿照一些框架（如 Vue 等）中触发自定义事件的方式来命名，用于在组件内部触发自定义事件，方便组件间通信等操作。
        $emit() {
            this.triggerEvent.apply(this, arguments);
        },
        // 定义名为 `getRect` 的方法，该方法用于获取页面中指定选择器对应的元素的布局信息（边界矩形信息等），返回一个 `Promise` 对象。
        getRect(selector, all) {
            return new Promise(resolve => {
                // 使用微信小程序提供的 `wx.createSelectorQuery` 方法创建一个选择器查询对象，用于在页面中查找元素。
                wx.createSelectorQuery()
                    // 通过 `.in(this)` 将选择器查询的作用范围限定在当前组件实例内（如果有组件层级等情况时很有用）。
                    // 根据 `all` 参数的值来决定调用 `selectAll` 还是 `select` 方法，`select` 用于获取单个元素，`selectAll` 用于获取所有匹配选择器的元素。
                    .in(this)[all?'selectAll' :'select'](selector)
                    // 调用 `boundingClientRect` 方法来获取元素的边界矩形信息（如位置、大小等），传入一个回调函数，在获取到信息后进行处理。
                    .boundingClientRect(rect => {
                        // 如果 `all` 参数为 `true`，并且获取到的 `rect` 是数组且长度大于 0，说明获取到了多个元素的矩形信息，此时通过 `resolve` 方法将 `rect` 数组传递出去，用于后续处理（在 `Promise` 中表示成功获取到了期望的数据）。
                        if (all && Array.isArray(rect) && rect.length) {
                            resolve(rect);
                        }
                        // 如果 `all` 参数为 `false`，并且获取到了单个元素的 `rect` 信息（即 `rect` 不为空），同样通过 `resolve` 方法将 `rect` 传递出去，表示成功获取到了单个元素的矩形信息。
                        if (!all && rect) {
                            resolve(rect);
                        }
                    })
                    // 最后调用 `exec` 方法执行整个查询操作，触发实际的查找和获取元素信息的流程。
                    .exec();
            });
        }
    }
});