import { SmartDevicesMap, GetSmartDeviceModelDevInfo, GetSmartDeviceModelDpSchema, SmartDeviceModelNetwork, SmartDeviceModelBluetooth, ReadonlyDpSchemaList } from '../types/SdmModel'; type GetDeviceData = T extends import('../SmartDeviceModel').default ? { devInfo: GetSmartDeviceModelDevInfo; dpSchema: GetSmartDeviceModelDpSchema; network: SmartDeviceModelNetwork; bluetooth: SmartDeviceModelBluetooth; } : never; type GetDevicesData = { [K in keyof M]: GetDeviceData; }; /** * 获取关联设备实例列表的状态集合数据。 * 不传 selector 时返回完整设备数据集合,任一设备的任何状态变化都会触发重渲染。强烈推荐始终传入 selector 仅选取所需属性,或提供自定义 equalityFn,以优化渲染性能并避免无效渲染。 * @public * @since @ray-js/panel-sdk 1.16.0 * @param selector - 选择器函数,入参为所有关联设备的状态集合对象。 * key 为设备标识,value 包含 devInfo、dpSchema、network、bluetooth 四个属性 * @typeOverride selector (devicesData: { [key: string]: DeviceData }) => any; * @param equalityFn - 自定义比较函数,返回 true 则不触发重渲染,默认 shallow equal * @typeOverride equalityFn (prev: any, next: any) => boolean; * @returns 匹配选择器的设备状态数据,类型由 selector 返回值自动推导 * @typeOverride returns any * @remarks * 使用前需挂载 SdmDevicesProvider 并配置关联设备映射。 * 性能优化(最佳实践): * 1. 始终使用 selector 精确挑选数据,例如 `useDevices(devices => devices.main?.network)`,确保仅当依赖数据改变时才触发组件重渲染。 * 2. 对于派生计算等复杂场景,可利用 `equalityFn` 自定义比对逻辑以阻断无效渲染。 * 3. 若希望 `devicesData.lamp1`、`devicesData.lamp2` 等获得完整 DP 类型推导,请参考 [多设备管理 - 常见问题](/cn/miniapp/solution-panel/ability/common/multi-device/faq)。 * @example 获取指定设备的网络状态 * ```tsx * import { useDevices } from '@ray-js/panel-sdk'; * * function DeviceNetworkStatus() { * // 仅当 main 设备的 network 状态发生改变时才触发当前组件重渲染 * const mainNetwork = useDevices(devices => devices.main?.network); * return 在线: {mainNetwork?.isOnline ? '是' : '否'}; * } * ``` * @example 自定义 rerender 策略 * ```tsx * import { useDevices } from '@ray-js/panel-sdk'; * * function DeviceNetworkStatus() { * // 仅当特定逻辑判定网络连接情况发生实质变更时更新 * const network = useDevices( * devices => devices.main?.network, * (prev, next) => prev?.isConnected === next?.isConnected * ); * return 在线: {network?.isConnected ? '是' : '否'}; * } * ``` * @example 获取所有设备的基础信息 * ```tsx * import { useDevices } from '@ray-js/panel-sdk'; * * function DeviceList() { * const allDevices = useDevices(); * return ( * * {Object.entries(allDevices).map(([key, data]) => ( * {data.devInfo.name} * ))} * * ); * } * ``` */ export declare function useDevices>(selector?: (devicesData: GetDevicesData) => V, equalityFn?: (a: V, b: V) => boolean): V; export {};