| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- <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>
|