【问题标题】:Vue.js getting an element within a componentVue.js 获取组件中的元素
【发布时间】:2016-09-03 09:52:38
【问题描述】:

我有一个组件,如何选择其中一个元素?

我正在尝试获取此组件模板中的输入。

可能有多个组件,因此querySelector 只能解析组件的当前实例。

Vue.component('somecomponent', {
    template: '#somecomponent',
    props: [...],

   ...

    created: function() {
        somevariablehere.querySelector('input').focus();
    }
});

【问题讨论】:

    标签: javascript vue.js


    【解决方案1】:

    vuejs 2

    v-el:el:uniquename 已替换为 ref="uniqueName"。然后通过this.$refs.uniqueName 访问该元素。

    【讨论】:

    • 这让我意识到ref 属性适用于任何 HTML 元素或 Vue 组件。好东西。
    • 看起来 this.$refs.uniqueName 是一个数组,所以需要 this.$refs.uniqueName[0] 来获取引用的元素。
    • 只在挂载组件之后,可以在父组件的挂载方法中完成:medium.com/@brockreece/…
    • 为什么这被标记为 vuejs 2?它也适用于 vue.js 3。
    【解决方案2】:

    根据您要访问的内容,有几个选项:

    • 您可以使用this.$children 访问 Vue.js 组件的子组件

    • 您可以使用 ref="uniqueName" 标记模板中的特定 DOM 元素,稍后通过 this.$refs.uniqueName 引用这些元素
      (但请记住,在组件/应用程序具有 finished mounting 并执行初始渲染之前,您将无法引用这些内容)

    • 如果您无法为元素添加标签,您可以通过this.$el.querySelector('.myClass > .childElement')使用 CSS 选择器查询 DOM 中的子元素
      (如上,组件/应用需要有finished mounting

    您也可以通过在您的组件中执行一个简单的console.log(this) 来进行探索,它会显示您的 Vue 组件实例的所有属性。

    【讨论】:

    • 提示:this.$el 在挂载之前是未定义的。如果你想初始化一个变量,请在mount()
    【解决方案3】:

    答案没有说清楚:

    使用this.$refs.someName,但要使用它,您必须在父级中添加ref="someName"

    请看下面的演示。

    new Vue({
      el: '#app',
      mounted: function() {
        var childSpanClassAttr = this.$refs.someName.getAttribute('class');
        
        console.log('<span> was declared with "class" attr -->', childSpanClassAttr);
      }
    })
    <script src="https://unpkg.com/vue@2.5.13/dist/vue.min.js"></script>
    
    <div id="app">
      Parent.
      <span ref="someName" class="abc jkl xyz">Child Span</span>
    </div>

    $refsv-for

    请注意,当与v-for 一起使用时,this.$refs.someName 将是一个数组:

    new Vue({
      el: '#app',
      data: {
        ages: [11, 22, 33]
      },
      mounted: function() {
        console.log("<span> one's text....:", this.$refs.mySpan[0].innerText);
        console.log("<span> two's text....:", this.$refs.mySpan[1].innerText);
        console.log("<span> three's text..:", this.$refs.mySpan[2].innerText);
      }
    })
    span { display: inline-block; border: 1px solid red; }
    <script src="https://unpkg.com/vue@2.5.13/dist/vue.min.js"></script>
    
    <div id="app">
      Parent.
      <div v-for="age in ages">
        <span ref="mySpan">Age is {{ age }}</span>
      </div>
    </div>

    【讨论】:

    • 同样重要的是要注意被引用的项目不是反应性的。
    【解决方案4】:

    Vue2 中,请注意只有在安装组件后才能访问 this.$refs.uniqueName

    【讨论】:

    • 在 Vue 的生命周期中挂载之前的所有内容都不会显示在您的浏览器中。由于尚未挂载,因此没有可用的 DOM 检查。
    【解决方案5】:

    Vue 2.x

    官方信息:

    https://vuejs.org/v2/guide/migration.html#v-el-and-v-ref-replaced

    一个简单的例子:

    在任何元素上,您必须添加一个具有唯一值

    的属性ref
    <input ref="foo" type="text" >
    

    要定位该元素,请使用this.$refs.foo

    this.$refs.foo.focus(); // it will focus the input having ref="foo"
    

    【讨论】:

      【解决方案6】:

      组合 API

      Template refs 部分讲述了这是如何统一的:

      • 在模板内,使用ref="myEl":ref=v-for
      • 在脚本中,有一个const myEl = ref(null) 并从setup 公开它

      引用携带从安装开始的 DOM 元素。

      【讨论】:

      • 那么执行像document.querySelectorAll("nav &gt; ul &gt; li"); 这样的查询是不可能的吗?
      • 不,不是。但是您从文档(根)开始查询。由于您正在制作一个组件,它可能应该从组件内的一个节点开始。
      • 好的,比如&lt;header ref="headerEL"&gt;,其中header是nav的父级,然后是const headerEl = ref&lt;HTMLElement&gt;(),然后你可以做const links = headerEl.value.querySelectorAll('nav &gt; ul &gt; li')
      猜你喜欢
      • 2016-07-22
      • 2019-10-18
      • 2019-05-24
      • 2016-03-19
      • 2016-05-09
      • 1970-01-01
      • 2019-09-14
      • 2018-01-26
      • 1970-01-01
      相关资源
      最近更新 更多