【问题标题】:Cannot log DOM elements on the mounted hook of vue.js无法在 vue.js 的挂载钩子上记录 DOM 元素
【发布时间】:2019-02-28 13:03:52
【问题描述】:

由于某种原因,在挂载的钩子上,我似乎无法在浏览器上记录 DOM 元素,而我可能想循环遍历元素,或者,作为我最后的手段,我只在 HTML 集合的特定索引上工作:

以下是我遇到问题的 vue 组件:

<template>
  <full-page ref="fullpage" id="fullpage" :options="options">
            <slider class="section" :auto="false">
                <slider-item v-animate-css="'fadeIn'">
                    <h1 class="mainTitle">PROJECT GORILLA</h1>
                </slider-item>
                <slider-item v-for="bkg in bkgImg" :style="{backgroundSize:'cover', 
                backgroundImage: 'url(' + bkg + ')'}">
                <h1 class="mainTitle">PROJECT GORILLA</h1>
                </slider-item>
        </slider>
  </full-page>
</template>
<script>
import { Slider, SliderItem } from 'vue-easy-slider'
import pinkBkg from '@/assets/img/IMG_2473.jpg'
import redBkg from '@/assets/img/IMG_4674.jpg'
import blueBkg from '@/assets/img/IMG_4716.jpg'
import greenBkg from '@/assets/img/IMG_2013.jpg'

export default {
    data(){
      return {
        options:{
          licenseKey:null
        },
        bkgImg:[pinkBkg,redBkg,blueBkg,greenBkg]
      }
    },
    components: {
        Slider,
        SliderItem
    },
    mounted(){
        let slides = document.getElementsByClassName("slider-item");

        console.log(slides[0]);


    }
}
</script>
<style>

.slider-item:nth-of-type(1) { background-color:black;}

.slider-item > .wrap {
    display:flex;
    justify-content: center;
    align-items:center;
}
h1.mainTitle {
    position:fixed;
    z-index:99;
    color:white !important;
}
.slider-item {
    z-index:98 !important;
}

</style>

请记住,我目前正在为 vue-cli 使用 webpack 模板。老实说,jQuery 作为最后的手段已经越过我的脑海,但我真的不想 诉诸于此,因为应用程序具有良好的性能很重要...... 在这种情况下,console.log 返回未定义。但是如果我在浏览器上复制并粘贴代码,那么它会正常工作。

【问题讨论】:

    标签: javascript vue.js vue-cli


    【解决方案1】:

    当你的组件被挂载时,并不一定意味着其中的子组件被完全渲染。

    正如您在模板中看到的,没有带有class="slider-item" 的 HTML 元素。我想这些会在稍后呈现 SliderItem 组件时出现。

    您可以将ref 属性添加到您要引用的任何元素或组件。

    例如

    <slider-item ref="sliderItem" v-animate-css="'fadeIn'">
      <h1 class="mainTitle">PROJECT GORILLA</h1>
    </slider-item>
    <slider-item ref="sliderItemRepeater" v-for="bkg in bkgImg"
                 :style="{backgroundSize:'cover', backgroundImage: 'url(' + bkg + ')'}">
      <h1 class="mainTitle">PROJECT GORILLA</h1>
    </slider-item>
    

    然后在你的mounted钩子里,你就可以访问了

    this.$refs.sliderItem // the first, non-repeating component
    this.$refs.sliderItemRepeater // an array of the repeated components
    

    https://vuejs.org/v2/guide/components-edge-cases.html#Accessing-Child-Component-Instances-amp-Child-Elements

    【讨论】:

    • 这是一些有趣的信息,谢谢!如果我发现任何问题,我一定会调查并回来。
    • 到目前为止,似乎使用 $ref 我只能获得对组件的引用,而不是实际的 div 元素,这很奇怪......我什至尝试记录 $el 属性,希望能够得到元素。我的最终目标是能够访问 H1.mainTitle 以便我能够对其进行动画处理。我什至尝试添加对 h1 的引用,但也没有用。
    • 您总是可以将 ref 属性放在&lt;h1&gt; 上并直接访问它。你应该在你的问题中解释你真正想要做什么
    猜你喜欢
    • 1970-01-01
    • 2020-02-15
    • 2017-10-14
    • 1970-01-01
    • 2018-05-07
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2019-05-29
    相关资源
    最近更新 更多