【问题标题】:Using querySelector() in vue Compostion API在 vue Composition API 中使用 querySelector()
【发布时间】:2023-02-17 22:17:43
【问题描述】:

我是 Vue 组合 API 的新手,需要使用 Document 方法 querySelector。但是,它没有按预期工作。如果我写

<nav class="home-menu pure-menu pure-menu-horizontal pure-menu-fixed">

<script setup>
import { ref } from "vue";
const observer = new IntersectionObserver(handleIntersection);
const target = document.querySelector(".home-menu");
observer.observe(target);
console.log(target);

目标为空。阅读文档我看到了 ref 属性,如果我

<nav ref="navbar" class="home-menu pure-menu pure-menu-horizontal pure-menu-fixed">
<script setup>
import { ref } from "vue";

const target = ref("navbar");
console.log(target);

我安慰一个对象。 ref 是在组合 API 中获取 DOM 元素的方式吗?我现在可以在我的观察者对象中使用 target 吗?它等同于querySelector吗?我试过这个

import { ref } from "vue";
const observer = new IntersectionObserver(handleIntersection);

const target = ref("navbar");
observer.observe(target);

但有错误

未捕获的类型错误:IntersectionObserver.observe:参数 1 未实现接口元素。

谢谢。

【问题讨论】:

  • Vue 模板引用是不是querySelectorquerySelector 采用 CSS 选择器并返回匹配元素(如果存在)。使用模板引用,您可以定义一个引用并在模板中使用它。相反,可以这样想:您像往常一样定义一个ref,然后,当评估模板时,带有ref="name"的元素使用你定义的 ref,有点像变量访问。
  • 对于querySelector,DOM 排在第一位,您可以从中选择一些内容。对于模板引用,引用首先出现,然后元素将自身绑定到该引用。

标签: vuejs3 vue-composition-api


【解决方案1】:

document.querySelector 返回 null 的原因是 DOM 尚未包含该元素。 script setup 在组件运行时运行创建,因此组件的 DOM 尚未创建。

您可以使用 onMounted 生命周期钩子在安装组件后运行代码。我创建了a playground 来演示这一点。

来自the docs

例如,onMounted 钩子可用于在组件完成初始渲染并创建 DOM 节点后运行代码

要实现您想要的,请执行以下操作:

  • 创建一个ref

    const navbar = ref(null);
    
  • 通过将元素上的 ref 属性设置为您用于 ref 变量的名称,将 ref 变量连接到元素:

    <nav ref="navbar" ...>
    
  • 挂载组件时连接观察者:

    onMounted(() => {
      observer.observe(target);
    })
    
  • 卸载组件时断开观察者:

    onBeforeUnmount(() => {
      observer.disconnect();
    })
    

这是链接文档中的生命周期图(由于 Imgur/SO,背景颜色错误):

【讨论】:

    【解决方案2】:

    您可以使用 ref 方法,使用您在模板中声明 ref 的相同名称调用变量:

    const navbar = ref(null);
    

    但是,您应该等待要安装的组件以观察:

    onMounted(() => {
      observer.observe(target);
    })
    

    还记得在卸载组件时断开它:

    onBeforeUnmount(() => {
      observer.disconnect();
    })
    

    【讨论】:

    • 感谢你们快速简洁的回答。我从来没有在 vue 2 中遇到过这个问题。我想从 methods 选项运行 querySelector() 会做同样的事情。
    • 对于像这样有用的实用程序,VueUse 是不可思议的。
    猜你喜欢
    • 2021-04-03
    • 2021-08-28
    • 1970-01-01
    • 2023-02-10
    • 2020-11-11
    • 2022-01-17
    • 2021-09-08
    • 1970-01-01
    • 2020-08-25
    相关资源
    最近更新 更多