情景和联动模式
情景模式是通过把一系列设备控制放在一起,然后触发设备按设定的延迟时间执行,如进入家中手动点击触发回家情景模式,该模式设置了客厅灯打开,亮度、颜色和色温多少,窗帘拉开百分之多少,还可以设置设备的各种控制属性和设备延时执行;联动模式是选择一个主设备的属性触发该模式,相当于时刻监听该主设备的属性变化,一旦设备达到设置条件则触发联动模式,联动可以添加一系列的设备和情景模式,如回家联动模式,主设备设置人体传感器触发则执行联动
其中处理比较复杂的是选中的设备列表数据,其中存储的有设备ID、设备属性以及延时时间(设备列表展示和执行都是根据延时时间来表现)而显示的数据则是设备的名称以及控制属性名字,并且同一设备可以重复添加(所以设备ID 不能做编辑设备属性的唯一标识,每次新增设备时新增一个标识为设备ID 加上在设备列表的索引),相当于给设备添加了定时功能触发。开始处理方式是对设备列表循环获取设备详情在组合一起,不同的属性转化方式会有很大的不同,如颜色,模式,风速类别,所以需要很多的判断来转化成对应的名称。后期的处理优化,通过 map 结构来把情景列表和联动列表来缓存起来,key 为情景或联动标识并且把设备属性选择抽离出组件来实现共用,所以当数据量操作对比很复杂的时候通过 map 结构来缓存数据是一个比较不错的选择
swiper 滑动组件
设备默认值以及状态改变
设备属性递归
icon 字体图标
点击区域
canvas 和 swiper 滑动偏移
滑动 swiper,定位的 canvas 会出现偏移,将 swiper 标签中的 duration 改成了0,即取消了滑动的渐变效果,canvas 便不再偏移,canvas 使用 wx:if 会在滑动回返时缺少 canvas 线条,应使用 hidden 来代替,
wx:if 在隐藏的时候不渲染,而 hidden 在隐藏时仍然渲染,只是不呈现,注意 canvas 等属性单位为 px
tab 切换
深层次对象值
let objProp = (data, path) => {
if (!data || !path) { return null }
let tempArr = path.split('.');
for (let i = 0; i < tempArr.length; i++) {
let key = tempArr[i];
if (data[key]) {
data = data[key];
} else {
return null;
}
}
return data;
}
let data = { deviceObj: { attrObj: { power: 'on' } } }
console.log(objProp(data, 'deviceObj.attrObj.power')) //on
console.log(objProp(data, 'deviceObj.propObj')) //null
console.log(objProp(data, 'deviceObj.attrObj.wind')) //null
浮动按钮
浮动按钮中有对设备名称,区域更改以及设备解绑,放置在右下角,但因为不同页面浮动按钮放置位置可能会遮挡部分操作内容,所以在不同页面它的 bottom 不同,但是还是不够灵活,后期使浮动按钮在竖直一定范围内进行拖拽,开始考虑过使用小程序 movable-view 自带组件,但是必须放在一定区域 movable-area 中,但 movable-area 又会遮挡页面内容的操作,所以还是通过 catchtouchmove 事件来进行拖拽