为啥 querySelector 不能与 v-for 一起使用?

Posted

技术标签:

【中文标题】为啥 querySelector 不能与 v-for 一起使用?【英文标题】:Why does querySelector not work with v-for?为什么 querySelector 不能与 v-for 一起使用? 【发布时间】:2021-11-22 01:13:05 【问题描述】:

我有一个简单的 div 和一个 v-for 循环,可以在页面上显示项目。这些项目上有一个class,我想使用 javascriptquerySelector 方法来选择。

    <div class="product-feed">
          <div v-for="Product in ProductFeed" :key="Product.ProductID" class="product-item" >
            <Product-Vue-Component :Product="Product"></Product-Vue-Component>
          </div>
    </div>

<script>
...
setup()
async function loadFeed()
      await nextTick();
      let element1 = document.querySelector('.product-feed'); 
      console.log(`element1`, element1) // this works and displays the element

      let element2 = document.querySelector('.product-item:last-of-type'); 
      console.log(`element2`, element2) // this comes back as null
      
    

   onMounted(()=> 
      loadFeed();
    )

...
</script>

即使我正在等待 DOM 使用 nextTick() 渲染,函数 loadFeed() 也无法获取 v-for 循环中的任何项目。

我需要检测v-for 循环中的项目,以便我可以实现无限滚动功能,当用户滚动到.product-item 元素列表的底部时会加载更多项目(因此:last-of-type 伪选择器)

哪里出了问题,可以这样选择元素吗?

【问题讨论】:

在孤立示例中一切正常:jsfiddle.net/matvey_andreyev/4qgny59j/2 您确定您的 ProductFeed 在 onMounted + nextTick 时间可用吗? @MatveyAndreyev 谢谢你的测试,那一定是种族问题 【参考方案1】:

尝试使用class="product-item"在div上设置ref

<div ref="el" v-for="Product in ProductFeed" :key="Product.ProductID" class="product-item" >

然后在设置函数中:

const el = ref(null)

onMounted(() => 
    loadFeed()
  )

async function loadFeed()
  await nextTick();
    let element1 = document.querySelector('.product-feed'); 
    console.log(`element1`, element1) // this works and displays the element

    console.log(el.value) 
  

return el

【讨论】:

你如何获得最后一个.product-item 嘿伙计,我测试过,el.value 得到最后一个元素【参考方案2】:

请使用 refs,只需将 ref 属性添加到容器 ref="productFeed" 并获取此元素

import  ref  from 'vue'
...    
const productFeed = ref(null)
...
return 
    productFeed

那么就可以使用productFeed.value作为变量,包含dom元素

【讨论】:

而for循环使用this 我需要product-item 而不是ProductFeed 为此,我为您留下了一个链接,在您的 product-item 元素上写 :ref="el =&gt; if (el) divs[i] = el " 为您的元素 const divs = ref([]) 创建一个变量,在更新时清除它 onBeforeUpdate(() =&gt; divs.value = [] ),并使用 @987654330 @ 作为 domElements 数组【参考方案3】:

尝试像这样使用refs:

<div
  v-for="Product in ProductFeed" :ref="`product--$Product.id`">
</div>

【讨论】:

以上是关于为啥 querySelector 不能与 v-for 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥JS代码“var a = document.querySelector('a[data-a=1]');”导致错误?

“ *[attribute^="string" ” 如何/为啥是有效的 querySelector? (JS错误?)

为啥 appendChild 不能处理 <li> 模板标签

querySelector与getElementBy的区别

问一下为啥webstorm里面它报错

querySelector 与 getElementById [关闭]