|
@@ -4,7 +4,29 @@
|
|
|
<div class="point_box" style="margin-top: 10px;">
|
|
|
<el-input v-model="value" placeholder="按巡查点名称搜索" />
|
|
|
</div>
|
|
|
- <div class="_deviceList_mains" ref="mainsRef" @mouseenter="pauseCarousel" @mouseleave="resumeCarousel">
|
|
|
+ <div class="scroll-view" ref="scrollViewRef" @mouseenter="onMouseenter" @mouseleave="onMouseleave">
|
|
|
+ <div ref="listRef" class="list" v-for="(p, n) in count" :key="n">
|
|
|
+ <div class="item" v-for="(item, index) in data" :key="index">
|
|
|
+ <el-text class="w-150px mb-2 _table_row1" truncated style="color: white;flex: .4;">
|
|
|
+ <el-icon color="#168cdb">
|
|
|
+ <el-icon>
|
|
|
+ <Opportunity />
|
|
|
+ </el-icon>
|
|
|
+ </el-icon>
|
|
|
+ {{ item.DeviceName }}
|
|
|
+ </el-text>
|
|
|
+ <el-text class="w-150px mb-2" truncated :class="item.SwitchStatus == 0 ? 'blue_title' : 'red_title'"
|
|
|
+ style="flex: .2;">
|
|
|
+ {{ item.SwitchStatus == 0 ? '开启' : '关闭' }}
|
|
|
+ </el-text>
|
|
|
+ <el-text class="w-150px mb-2" truncated
|
|
|
+ :class="item.OnlinePresence == 0 ? 'blue_title' : 'red_title'" style="flex: .2">
|
|
|
+ {{ item.OnlinePresence == 0 ? '在线' : '离线' }}
|
|
|
+ </el-text>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <!-- <div class="_deviceList_mains" ref="mainsRef" @mouseenter="pauseCarousel" @mouseleave="resumeCarousel">
|
|
|
<div :style="{ transform: `translateY(${scrollY}px)` }">
|
|
|
<div class="_deviceList_mains_item" v-for="(item, index) in eventList" :key="index">
|
|
|
<el-text class="w-150px mb-2 _table_row1" truncated style="color: white;flex: .4;">
|
|
@@ -28,7 +50,7 @@
|
|
|
</el-icon>
|
|
|
</div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </div> -->
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
@@ -44,81 +66,74 @@ const props = defineProps({
|
|
|
})
|
|
|
|
|
|
const value = ref('')
|
|
|
-// const eventList = ref([
|
|
|
-// { name: '回路1', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路2', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路3', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路4', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路5', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路6', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路7', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路8', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路9', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路10', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路11', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路12', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路13', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路14', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路15', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路16', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路17', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路18', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路19', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路20', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路21', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路22', state: '关闭', flag: '离线' },
|
|
|
-// { name: '回路23', state: '开启', flag: '在线' },
|
|
|
-// { name: '回路24', state: '关闭', flag: '离线' }
|
|
|
-// ])
|
|
|
-
|
|
|
-const eventList = ref([])
|
|
|
+
|
|
|
+const headerList = ref(['名称', '状态', '时间'])
|
|
|
+const data = ref(); //列表数据
|
|
|
+const listRef = ref(); //列表dom
|
|
|
+const scrollViewRef = ref(); //滚动区域dom
|
|
|
+const count = ref(1); //列表个数
|
|
|
+
|
|
|
+let intervalId = null;
|
|
|
+let isAutoScrolling = true; //是否自动滚动标识
|
|
|
+
|
|
|
+//获取列表数据
|
|
|
+const getData = () => {
|
|
|
+ //模拟接口请求列表数据
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ setTimeout(() => {
|
|
|
+ //生成10条数据
|
|
|
+ let list = new Array(30).fill().map((item, index) => index);
|
|
|
+ resolve(list);
|
|
|
+ }, 100);
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
watch(() => props.resultData, (newVal) => {
|
|
|
if (newVal) {
|
|
|
- eventList.value = []
|
|
|
- eventList.value = newVal
|
|
|
+ // data.value = await getData();
|
|
|
+ data.value = newVal;
|
|
|
+ intervalId && clearInterval(intervalId);
|
|
|
+ nextTick(() => {
|
|
|
+ //判断列表是否生成滚动条
|
|
|
+ count.value = hasScrollBar() ? 2 : 1;
|
|
|
+ //有滚动条开始自动滚动
|
|
|
+ if (count.value == 2) {
|
|
|
+ autoScrolling();
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
}, { deep: true, immediate: true } // 开启深度监听
|
|
|
)
|
|
|
-const mainsRef = ref(null)
|
|
|
-const scrollY = ref(0)
|
|
|
-let intervalId = null
|
|
|
-const scrollSpeed = 1 // 滚动速度
|
|
|
-
|
|
|
-const startCarousel = () => {
|
|
|
+onMounted(() => {
|
|
|
+})
|
|
|
+//判断列表是否有滚动条
|
|
|
+const hasScrollBar = () => {
|
|
|
+ return scrollViewRef.value.scrollHeight > scrollViewRef.value.clientHeight;
|
|
|
+};
|
|
|
+//设置自动滚动
|
|
|
+const autoScrolling = () => {
|
|
|
intervalId = setInterval(() => {
|
|
|
- const itemHeight = mainsRef.value?.querySelector('._deviceList_mains_item')?.offsetHeight;
|
|
|
- if (!itemHeight) return;
|
|
|
- scrollY.value -= scrollSpeed;
|
|
|
- // 检查第一个元素是否完全离开视口
|
|
|
- if (Math.abs(scrollY.value) >= itemHeight) {
|
|
|
- // 将第一个元素移到列表末尾
|
|
|
- const firstItem = eventList.value.shift();
|
|
|
- if (firstItem) {
|
|
|
- eventList.value.push(firstItem);
|
|
|
- }
|
|
|
- // 调整滚动位置
|
|
|
- scrollY.value += itemHeight;
|
|
|
+ if (scrollViewRef.value.scrollTop < listRef.value[0].clientHeight) {
|
|
|
+ scrollViewRef.value.scrollTop += isAutoScrolling ? 1 : 0;
|
|
|
+ } else {
|
|
|
+ scrollViewRef.value.scrollTop = 0;
|
|
|
}
|
|
|
}, 20);
|
|
|
};
|
|
|
|
|
|
-const pauseCarousel = () => {
|
|
|
- clearInterval(intervalId);
|
|
|
-};
|
|
|
-
|
|
|
-const resumeCarousel = () => {
|
|
|
- startCarousel();
|
|
|
-};
|
|
|
-
|
|
|
-onMounted(() => {
|
|
|
- nextTick(() => {
|
|
|
- startCarousel();
|
|
|
- })
|
|
|
+onBeforeUnmount(() => {
|
|
|
+ //离开页面清理定时器
|
|
|
+ intervalId && clearInterval(intervalId);
|
|
|
});
|
|
|
|
|
|
-onUnmounted(() => {
|
|
|
- clearInterval(intervalId);
|
|
|
-});
|
|
|
+//鼠标进入,停止滚动
|
|
|
+const onMouseenter = () => {
|
|
|
+ isAutoScrolling = false;
|
|
|
+};
|
|
|
+//鼠标移出,继续滚动
|
|
|
+const onMouseleave = () => {
|
|
|
+ isAutoScrolling = true;
|
|
|
+};
|
|
|
</script>
|
|
|
|
|
|
<style lang="scss">
|
|
@@ -144,6 +159,83 @@ onUnmounted(() => {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.header-view {
|
|
|
+ margin-top: 10px;
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ padding: 10px 10px 10px 20px;
|
|
|
+ background-color: rgba(16, 40, 92, 1);
|
|
|
+}
|
|
|
+
|
|
|
+.view_item {
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-start;
|
|
|
+}
|
|
|
+
|
|
|
+.warning-view {
|
|
|
+ width: 100%;
|
|
|
+ height: calc(100% - 51px);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+}
|
|
|
+
|
|
|
+.label {
|
|
|
+ color: #fff;
|
|
|
+ padding: 20px;
|
|
|
+ font-size: 22px;
|
|
|
+}
|
|
|
+
|
|
|
+.scroll-view {
|
|
|
+ flex: 1;
|
|
|
+ height: 0;
|
|
|
+ width: 100%;
|
|
|
+ overflow-y: auto;
|
|
|
+}
|
|
|
+
|
|
|
+.list {
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+}
|
|
|
+
|
|
|
+.item {
|
|
|
+ padding: 0px 10px 0px 20px;
|
|
|
+ width: 100%;
|
|
|
+ height: 50px;
|
|
|
+ min-height: 50px;
|
|
|
+ font-size: 15px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
+ color: #eee;
|
|
|
+}
|
|
|
+
|
|
|
+.item:nth-child(even) {
|
|
|
+ background: rgba(16, 40, 92, 0.4);
|
|
|
+}
|
|
|
+
|
|
|
+.item:hover {
|
|
|
+ cursor: pointer;
|
|
|
+ background-image: linear-gradient(to right, #168cdb, transparent);
|
|
|
+}
|
|
|
+
|
|
|
+/*隐藏滚动条
|
|
|
+ */
|
|
|
+::-webkit-scrollbar {
|
|
|
+ display: none;
|
|
|
+}
|
|
|
+
|
|
|
+.blue_title {
|
|
|
+ color: #67C23A;
|
|
|
+}
|
|
|
+
|
|
|
+.red_title {
|
|
|
+ color: #F56C6C;
|
|
|
+}
|
|
|
</style>
|
|
|
|
|
|
<style lang="scss" scoped>
|