| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- Component({
- properties: {
- list: {
- type: Array,
- value: []
- },
- // 是否展示指示器
- showIndicators: {
- type: Boolean,
- value: true
- },
- // 左右边距(px)
- paddingLR: {
- type: Number,
- value: 30
- },
- // 中间卡片高度(px)
- centerHeight: {
- type: Number,
- value: 200
- },
- // 左右两侧卡片高度(px)
- sideHeight: {
- type: Number,
- value: 130
- },
- duration: {
- type: Number,
- value: 300
- },
- // 当前项索引
- current: {
- type: Number,
- value: 0
- },
- // 是否使用 navigator 进行跳转(仅当前项且有 url)
- useNavigator: {
- type: Boolean,
- value: true
- },
- onlineIcon: {
- type: String,
- value: 'https://klmybwg.4dage.com/mini/wxImg/exhibition/online-kz.png'
- },
- // 是否自动轮播
- autoplay: {
- type: Boolean,
- value: false
- },
- // 轮播间隔时间(毫秒)
- interval: {
- type: Number,
- value: 3000
- }
- },
- data: {
- preloadedImages: {},
- autoplayTimer: null, // 自动轮播定时器
- isUserInteracting: false // 用户是否正在交互
- },
- observers: {
- 'list': function(newList) {
- if (newList && newList.length > 0) {
- this.preloadImages(newList);
- // 当列表数据更新时,重新启动自动轮播
- this.restartAutoplay();
- }
- },
- 'autoplay, interval': function(autoplay, interval) {
- // 当自动轮播设置改变时,重新启动
- if (autoplay) {
- this.startAutoplay();
- } else {
- this.stopAutoplay();
- }
- }
- },
- lifetimes: {
- attached() {
- if (this.data.list && this.data.list.length > 0) {
- this.preloadImages(this.data.list);
- }
- // 组件初始化时启动自动轮播
- if (this.data.autoplay) {
- this.startAutoplay();
- }
- },
- detached() {
- // 组件销毁时清理定时器
- this.stopAutoplay();
- }
- },
- pageLifetimes: {
- show() {
- // 页面显示时重启自动轮播
- if (this.data.autoplay && !this.data.isUserInteracting) {
- this.startAutoplay();
- }
- },
- hide() {
- // 页面隐藏时停止自动轮播
- this.stopAutoplay();
- }
- },
- methods: {
- // 预加载图片
- preloadImages(list) {
- const preloadedImages = {};
- list.forEach((item, index) => {
- if (item.image && !this.data.preloadedImages[item.image]) {
- // 创建图片对象进行预加载
- // const img = wx.createOffscreenCanvas().getContext('2d');
- preloadedImages[item.image] = true;
- }
- });
-
- // 同时预加载在线观展图标
- if (this.data.onlineIcon && !this.data.preloadedImages[this.data.onlineIcon]) {
- // const img = wx.createOffscreenCanvas().getContext('2d');
- preloadedImages[this.data.onlineIcon] = true;
- }
-
- this.setData({
- preloadedImages: { ...this.data.preloadedImages, ...preloadedImages }
- });
- },
- onSwiperChange(e) {
- const index = e.detail.current;
- this.setData({ current: index });
- this.triggerEvent('change', { current: index });
- // swiper滑动时暂停自动轮播一段时间
- this.pauseAutoplayTemporarily();
- },
- // 左右图片可点击切换,不可跳转
- onSlideTap(e) {
- const index = e.currentTarget.dataset.index;
- if (index === this.data.current) return; // 当前项点击保持
- this.setData({ current: index });
- this.triggerEvent('change', { current: index });
- // 用户点击切换时暂停自动轮播一段时间
- this.pauseAutoplayTemporarily();
- },
- // 当前项且无 url 的点击,向外抛事件处理
- onCurrentTap(e) {
- const index = e.currentTarget.dataset.index;
- const item = this.data.list[index];
- this.triggerEvent('exhibitiontap', { item, index });
- },
- // 线上观展点击事件(有URL的情况)
- onOnlineExhibitionTap(e) {
- const index = e.currentTarget.dataset.index;
- const item = this.data.list[index];
- this.triggerEvent('onlineexhibitiontap', { item, index, url: item.url });
- },
- onDotTap(e) {
- const index = e.currentTarget.dataset.index;
- this.setData({ current: index });
- this.triggerEvent('change', { current: index });
- // 用户点击指示器时暂停自动轮播一段时间
- this.pauseAutoplayTemporarily();
- },
- // 启动自动轮播
- startAutoplay() {
- if (!this.data.autoplay || this.data.list.length <= 1) {
- return;
- }
-
- this.stopAutoplay(); // 先清除可能存在的定时器
-
- const timer = setInterval(() => {
- if (!this.data.isUserInteracting) {
- const nextIndex = (this.data.current + 1) % this.data.list.length;
- this.setData({ current: nextIndex });
- this.triggerEvent('change', { current: nextIndex });
- }
- }, this.data.interval);
-
- this.setData({ autoplayTimer: timer });
- },
- // 停止自动轮播
- stopAutoplay() {
- if (this.data.autoplayTimer) {
- clearInterval(this.data.autoplayTimer);
- this.setData({ autoplayTimer: null });
- }
- },
- // 重启自动轮播
- restartAutoplay() {
- if (this.data.autoplay) {
- this.stopAutoplay();
- this.startAutoplay();
- }
- },
- // 暂时暂停自动轮播(用户交互时)
- pauseAutoplayTemporarily(duration = 3000) {
- if (!this.data.autoplay) return;
-
- this.setData({ isUserInteracting: true });
- this.stopAutoplay();
-
- setTimeout(() => {
- this.setData({ isUserInteracting: false });
- if (this.data.autoplay) {
- this.startAutoplay();
- }
- }, duration);
- }
- }
- });
|