| export default { | |
|   install(Vue) { | |
|     Vue.prototype.$scrollTo = function(el, behavior = 'smooth', retryCount = 0) { | |
|       if (!el) { | |
|         console.warn('scrollTo: 元素参数为空') | |
|         return  | |
|       } | |
|        | |
|       const maxRetries = 3 | |
|       const retryDelay = 100 // 100ms | |
|        | |
|       let targetEL = typeof el === 'string' ? this.$refs[el] : el | |
|        | |
|       console.log(`scrollTo called with: ${el} (尝试次数: ${retryCount + 1})`) | |
|       console.log('原始targetEL:', targetEL) | |
|        | |
|       // 如果targetEL为undefined且还有重试次数,则延迟重试 | |
|       if (!targetEL && retryCount < maxRetries) { | |
|         console.log(`元素未找到,${retryDelay}ms后重试...`) | |
|         setTimeout(() => { | |
|           this.$scrollTo(el, behavior, retryCount + 1) | |
|         }, retryDelay) | |
|         return | |
|       } | |
|        | |
|       // 如果重试次数用完仍未找到元素,输出详细信息 | |
|       if (!targetEL) { | |
|         console.error(`scrollTo: 经过${maxRetries + 1}次尝试仍未找到元素 "${el}"`) | |
|         console.log('当前可用的refs:', Object.keys(this.$refs)) | |
|         return | |
|       } | |
|        | |
|       // 如果targetEL是数组,取第一个元素 | |
|       if (Array.isArray(targetEL) && targetEL.length > 0) { | |
|         targetEL = targetEL[0] | |
|         console.log('检测到数组,取第一个元素:', targetEL) | |
|       } else if (Array.isArray(targetEL) && targetEL.length === 0) { | |
|         console.error('scrollTo: 找到的是空数组') | |
|         return | |
|       } | |
|        | |
|       if (targetEL) { | |
|         // #ifdef H5 | |
|         console.log('进h5环境的滚动插件了'); | |
|         console.log('targetEL类型:', typeof targetEL); | |
|         console.log('targetEL是否有$el属性:', !!targetEL.$el); | |
|         console.log('targetEL是否有scrollIntoView方法:', !!targetEL.scrollIntoView); | |
|          | |
|         try { | |
|           // H5环境下使用原生的scrollIntoView方法 | |
|           if (targetEL.$el) { | |
|             // 如果是Vue组件(uni-app的view等组件),获取其DOM元素 | |
|             console.log('检测到uni-app Vue组件,使用$el获取DOM元素'); | |
|             console.log('DOM元素:', targetEL.$el); | |
|              | |
|             targetEL.$el.scrollIntoView({ | |
|               behavior: behavior, | |
|               block: 'start', | |
|               inline: 'nearest' | |
|             }) | |
|             console.log('✅ 滚动成功') | |
|           } else if (targetEL.scrollIntoView) { | |
|             console.log('检测到原生DOM元素'); | |
|             // 如果是原生DOM元素 | |
|             targetEL.scrollIntoView({ | |
|               behavior: behavior, | |
|               block: 'start', | |
|               inline: 'nearest' | |
|             }) | |
|             console.log('✅ 滚动成功') | |
|           } else { | |
|             console.log('无法识别的元素类型,尝试其他方法'); | |
|             // 如果都不是,可能需要其他处理方式 | |
|           } | |
|         } catch (error) { | |
|           console.error('scrollTo 执行失败:', error) | |
|         } | |
|         // #endif | |
|          | |
|         // #ifndef H5 | |
|         // 非H5环境(小程序等)使用uni.pageScrollTo | |
|         const query = uni.createSelectorQuery().in(this) | |
|         query.select(`[ref="${el}"]`).boundingClientRect((data) => { | |
|           console.log('element position:', data) | |
|           if (data) { | |
|             uni.pageScrollTo({ | |
|               scrollTop: data.top, | |
|               duration: behavior === 'smooth' ? 300 : 0 | |
|             }) | |
|             console.log('✅ 滚动成功') | |
|           } else { | |
|             console.error('scrollTo: 未找到元素位置信息') | |
|           } | |
|         }).exec() | |
|         // #endif | |
|       } | |
|     } | |
|   } | |
| } | |
| 
 | |
| // 使用方式 | |
| // 在 main.js 中引入:Vue.use(require('./plugins/scrollTo')) | |
| // 然后在组件中:this.$scrollTo('targetRef')
 |