this.$refs.item1.scrollIntoView is not a function,this.$refs[index].scrollIntoView is not a function

在Vue开发中遇到使用ref进行屏幕滚动时的错误,问题在于v-for循环中ref获取到的是一个数组。解决方案是通过索引访问数组元素,如`this.$refs['item' + _index][0].scrollIntoView()`。此外,还可以统一ref名称并通过index参数操作对应DOM。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天使用Vue过程中,使用ref去操作dom想要实现屏幕滚动效果时报错,his.$refs[index].scrollIntoView is not a function和this.$refs.item1.scrollIntoView is not a function;

报错截图和代码如下:

<div v-for="(item,index) in [{name:'test1'},{name:'test2'}]" @click="clickItem(index)">
  <div :ref="'item'+index" style="height: 500px;background-color: white;margin-top: 10px">
    {{ item.name }}
  </div>
</div>
clickItem: function (_index) {
  this.$refs[`item${_index}`].scrollIntoView(
      {
        behavior: "smooth",  // 平滑过渡
        block: "start"  // 上边框与视窗顶部平齐。默认值
      }
  );
},

 一开始以为是我方法中模板字符串用的有问题,于是尝试指定特定ref:改为this.$refs.item1和this.$refs['item1'],

clickItem: function (_index) {
  this.$refs.item1.scrollIntoView(
      {
        behavior: "smooth",  // 平滑过渡
        block: "start"  // 上边框与视窗顶部平齐。默认值
      }
  );
},

结果还是报错

然后通过调试 发现获取的ref是一个数组

  

然后划重点!!通过搜索了一番,发现ref加在普通元素上,this.$refs.name获取的是dom元素,用在v-for时,获取的是包含一组dom的数组。

最直接的解决办法是将下标设为0,通过this.refs.[`item${_index}`][0]获取指定的dom结构;

clickItem: function (_index) {
  this.$refs[`item${_index}`][0].scrollIntoView(
      {
        behavior: "smooth",  // 平滑过渡
        block: "start"  // 上边框与视窗顶部平齐。默认值
      }
  );
},

成功解决!!!

上述方法是将dom元素上的ref指向了变量item0、item1等,同理由数组可知ref不同于id,不是唯一标识的,可以在v-for中将ref命名为统一名称,通过v-for中的index索引传递给js函数的参数中进行相应dom的操作,如下图 为另一种写法:

<div ref="item" v-for="(item,index) in [{name:'test1'},{name:'test2'}]" @click="clickItem(index)">
  <div style="height: 500px;background-color: white;margin-top: 10px">
    {{ item.name }}
  </div>
</div>
clickItem:function (_index){
  this.$refs.item[_index].scrollIntoView(
      {
        behavior: "smooth",  // 平滑过渡
        block: "start"  // 上边框与视窗顶部平齐。默认值
      }
  );

### 使用 `scrollIntoView` 方法 JavaScript 提供了 `scrollIntoView` 方法来使指定的 DOM 元素滚动到浏览器窗口的可视区域内。该方法接受两个类型的参数:布尔值或选项对象。 当传递布尔值作为参数时,如果设置为 `true` 或者不提供参数,则元素顶部会尽可能地靠近视窗顶部;而设置为 `false` 则会让元素底部尽可能接近视窗底部[^1]。 对于表达式 `scrollDom.value?.scrollIntoView(false)` 来说: - 运算符 `?.` 称为空调用运算符(Optional Chaining),用来安全访问可能存在未定义的对象属性。 - 如果 `scrollDom.value` 存在且不是 null 或 undefined 类型的话,那么就会执行其后的 `.scrollIntoView(false)` 调用,否则不会抛出错误也不会有任何操作发生。 下面是一个具体的例子展示如何使用这个特性: ```html <div id="container"> <!-- 假设这里有很多子 div --> </div> <button onclick="scrollElement()">Scroll to Element</button> <script type="text/javascript"> function scrollElement(){ let elements = document.querySelectorAll('#container > div'); // 随机选取一个子元素并尝试滚动至它处 var randomIndex = Math.floor(Math.random() * elements.length); var selectedElement = elements[randomIndex]; console.log(`Trying to scroll into view of element at index ${randomIndex}`); // 安全地调用 scrollIntoView 并让目标元素位于页面下方 selectedElement?.scrollIntoView(false); } </script> ``` 在这个例子中,点击按钮会选择容器内的随机一个 `<div>` 元素,并试图将其滚动到当前屏幕区域的下部位置显示出来。由于用了可选链语法 (`?.`) ,即使有时可能找不到匹配的选择器也能够防止程序崩溃[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值