180 lines
6.2 KiB
Vue
180 lines
6.2 KiB
Vue
<template>
|
|
<view class="bubble-tips-container" :style="{top: top, left: left}">
|
|
<view class="bubble-content row" v-show="showBubble" v-for="item in currentList" :key="item.id">
|
|
<u-image class="bubble-img" width="50rpx" height="50rpx" :src="item.user.avatar" border-radius="50%" />
|
|
<view class="xs">
|
|
{{item.template}}
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script>
|
|
import {getBubbleLists} from "@/api/app";
|
|
import Cache from "@/utils/cache"
|
|
export default {
|
|
name: "BubbleTips",
|
|
props: {
|
|
// 是否停止切换
|
|
discharge: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
top: {
|
|
type: String,
|
|
default: "40rpx"
|
|
},
|
|
left: {
|
|
type: String,
|
|
default: "20rpx"
|
|
},
|
|
updateTime: {
|
|
type: Number,
|
|
default: 5 * 60 * 1000
|
|
}
|
|
},
|
|
data() {
|
|
return {
|
|
index: Cache.get("currentIndex") || 0,
|
|
list: [],
|
|
currentList: [],
|
|
timer: null,
|
|
showBubble: false,
|
|
}
|
|
},
|
|
watch: {
|
|
index(newValue, oldValue) {
|
|
if (this.index - this.list.length >= 0) {
|
|
this.showBubble = false;
|
|
let timer = setTimeout(() => {
|
|
Cache.set("currentIndex", 0)
|
|
if (this.timer) {
|
|
clearInterval(this.timer)
|
|
this.timer = null
|
|
}
|
|
this.fadeUpBubble();
|
|
clearTimeout(timer)
|
|
}, 2000)
|
|
} else {
|
|
if (this.timer) {
|
|
clearInterval(this.timer)
|
|
this.timer = null
|
|
}
|
|
this.fadeUpBubble();
|
|
return;
|
|
}
|
|
},
|
|
discharge() {
|
|
// 为了让活性的页面停止计时器
|
|
if (this.discharge) {
|
|
// 停止
|
|
Cache.set("currentIndex", this.index);
|
|
clearInterval(this.timer);
|
|
this.timer = null;
|
|
return false;
|
|
} else {
|
|
// 继续切换
|
|
let currentInex = Cache.get("currentInex") || this.list.length;
|
|
if (currentInex - this.list.length < 0) {
|
|
if (this.timer) {
|
|
setInterval(this.timer)
|
|
this.timer = null;
|
|
}
|
|
this.fadeUpBubble()
|
|
}
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
$getBubbleLists() {
|
|
getBubbleLists().then(res => {
|
|
|
|
if (res) {
|
|
this.list = res.data.lists;
|
|
var requestTime = res.data.time * 1000;
|
|
Cache.set("bubbleList", JSON.stringify(this.list), 300);
|
|
Cache.set("requestTime", requestTime);
|
|
if (this.timer) {
|
|
clearInterval(this.timer);
|
|
this.timer = null;
|
|
}
|
|
this.fadeUpBubble()
|
|
}
|
|
})
|
|
},
|
|
fadeUpBubble() {
|
|
let requestTime = Cache.get("requestTime");
|
|
let currentTime = new Date();
|
|
this.showBubble = true;
|
|
this.index = Cache.get("currentIndex") || 0;
|
|
this.list = Cache.get("bubbleList") ? JSON.parse(Cache.get("bubbleList")) : [];
|
|
if (currentTime.getTime() - requestTime >= this.updateTime) {
|
|
this.$getBubbleLists();
|
|
Cache.set("currentIndex", 0, 300)
|
|
return;
|
|
}
|
|
this.timer = setInterval(() => {
|
|
this.currentList = this.list.slice(this.index, this.index + 1);
|
|
Cache.set("currentIndex", ++this.index);
|
|
}, 4000);
|
|
}
|
|
},
|
|
created() {
|
|
var index = Cache.get("currentIndex") || 0;
|
|
var requestTime = Cache.get("requestTime");
|
|
var currentTime = new Date();
|
|
var currentList = Cache.get("bubbleList") ? JSON.parse(Cache.get("bubbleList")) : [];
|
|
if (currentList.length <= 0) {
|
|
this.$getBubbleLists();
|
|
Cache.set("currentIndex", 0)
|
|
} else if (index - currentList.length >= 0) {
|
|
Cache.set("currentIndex", 0);
|
|
if (this.timer) {
|
|
clearInterval(this.timer)
|
|
this.timer = null
|
|
}
|
|
this.fadeUpBubble();
|
|
} else if (currentTime.getTime() - requestTime >= this.updateTime) {
|
|
this.$getBubbleLists();
|
|
Cache.set("currentIndex", 0)
|
|
} else {
|
|
if (this.timer) {
|
|
clearInterval(this.timer);
|
|
this.timer = null;
|
|
}
|
|
this.fadeUpBubble()
|
|
}
|
|
},
|
|
onLoad() {},
|
|
destroyed() {
|
|
if (this.timer) {
|
|
clearInterval(this.timer);
|
|
this.timer = null
|
|
}
|
|
}
|
|
}
|
|
</script>
|
|
|
|
<style lang="scss">
|
|
@import '@/styles/base.scss';
|
|
|
|
.bubble-tips-container {
|
|
position: fixed;
|
|
z-index: 98;
|
|
|
|
.bubble-content {
|
|
padding: 4rpx 20rpx 4rpx 10rpx;
|
|
background-color: rgba(0, 0, 0, 0.7);
|
|
color: white;
|
|
border-radius: 120rpx;
|
|
|
|
.bubble-img {
|
|
width: 50rpx;
|
|
height: 50rpx;
|
|
border-radius: 50%;
|
|
margin-right: 10rpx;
|
|
}
|
|
}
|
|
}
|
|
</style>
|