You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue 3 Script Setup中使用scrollIntoView点击滚动元素报错:Uncaught TypeError: element.scrollIntoView is not a function 问题排查

解决Vue3中scrollIntoView报错:Uncaught TypeError: element.scrollIntoView is not a function

你这个报错的核心原因很明确——你没正确获取到模板里的DOM元素!

看你的代码,在goTo函数里用ref(refName)创建了一个新的响应式变量,但这和模板中ref="test"对应的DOM元素完全不是一回事。Vue3里要获取模板中的ref元素,得按正确的规则来:

方案1:针对单个固定元素的场景

如果只是滚动到固定的test元素,直接在setup里声明同名的ref变量即可:

<script setup>
import { ref } from 'vue'
// 声明和模板ref同名的变量,Vue会自动把DOM元素挂载到这里
const test = ref(null)

function goTo(){
  // 注意:ref变量要通过.value访问DOM元素
  test.value.scrollIntoView({behavior: "smooth"})
}
</script>

你的点击组件和目标元素不用改,保持原样就行:

<DayWithText v-for="day in daysOfWeek" :name="day.shortHand" :day="day.day" :date="day.date" @click.prevent="goTo()"/>
<p ref="test">test</p>

方案2:动态传递ref名称的场景(比如多个滚动目标)

如果你的需求是点击不同组件滚动到不同元素,需要动态获取ref,那可以借助getCurrentInstance访问组件实例的$refs:

<script setup>
import { getCurrentInstance } from 'vue'
// 获取组件实例的代理对象
const { proxy } = getCurrentInstance()

function goTo(refName){
  // 通过ref名称从$refs里取对应的DOM元素
  const element = proxy.$refs[refName]
  // 加个判断,避免元素不存在时报错
  if(element){
    element.scrollIntoView({behavior: "smooth"})
  }
}
</script>

这种情况下你的点击事件和目标元素就不用改,还是传'test'就行。

额外注意点

  • 确保调用scrollIntoView时,DOM元素已经挂载完成(比如如果是页面加载就触发滚动,要放在onMounted钩子中);
  • 动态ref的情况下,要保证传入的refName和模板中元素的ref属性完全一致,不然会拿到undefined。

内容的提问来源于stack exchange,提问作者Lx45

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 20:14:06