【问题标题】:Error using this.$el.queryselector on mounted()在mounted() 上使用this.$el.queryselector 时出错
【发布时间】:2020-10-13 09:11:17
【问题描述】:

所以我对使用 vue 非常陌生,目前我正在使用 vue 进行我的第一个项目,但我很茫然。所以让我解释一下..

首先是我的标记。在我的标记中,我添加了一个<template v-if="data"></template>,所有标记都包含在其中。这是它的样子:

  <div class="main-template">
    <template v-if="data">
       <!-- markup -->
    </template>
  </div

现在我的模板中有一个图像滑块,我想在我的 vue 实例中初始化滑块,所以根据我的研究,我做了这样的事情:

methods: { 
  sliderInit(){
    const ImgSlider = this.$el.querySelector('.slider-container'),

    var flikty = new Flickity(ImgSlider, { 
        contain: true, 
        imagesLoaded: true, 
        cellAlign: 'left',
        pageDots: false, 
        arrowShape: 'M 15,50 L 65,100 L 70,95 L 25,50  L 70,5 L 65,0 Z', 
        lazyLoad: 5 }
    )
  }
}, 
mounted() {
  this.sliderInit()
}

但我收到一条错误消息,提示 Bad element for Flikity: null。所以我尝试控制台记录我的ImgSlider,结果它返回null。我尝试过其他解决方案,例如使用 watch:this.$nextTick()ImgSlider 始终记录为 null。

现在我确实使用update()setTimeout(() =&gt; {}, timeout) 解决了它一次,但更新会在每次状态更改时重新初始化滑块,并且 setTimeout 并不理想。这并不理想,因为除了初始化滑块之外,我还需要使用 Flikity 的 API 添加事件,如果我什至无法使用 querySelector 在我的 vue 实例中正常选择元素,那么我将无法正确编码其他事件,这就是为什么只使用setTimeout 并不理想。

所以更具体地说,我怎样才能正确使用querySelector?我的代码中是否有任何问题阻止我在this.$el 上使用querySelector?如果我可以让查询选择器在挂载时正常运行,那么这已经是一个很大的帮助,我至少可以从那里拿走它。 谢谢! :D

【问题讨论】:

    标签: javascript html vue.js


    【解决方案1】:

    你可以用 ref 代替

    <div ref="mainTemplate" class="main-template">
          <template v-if="data" />
        </div>
    ...
    sliderInit(){
        const ImgSlider = this.$refs.mainTemplate
    }
    

    【讨论】:

    • 感谢您的回答!但是由于某种原因,当我调用 this.$refs.refName 时,我得到了 undefined 但是当我登录 this.$refs 时,我得到并反对..?
    • 给个在线demo方便吗?只需确保在组件安装后运行功能
    【解决方案2】:

    例如,您可以使用双下一个刻度:

     this.$nextTick(() => { this.$nextTick(() => { //code }) })
    

    除此之外,您可以尝试使用Flickity-Vue,您不需要这样的解决方法,但这意味着其他依赖项,所以这是您的选择。

    另一种解决方案是使用 vanilla js 选择元素。你甚至可以像文档中所说的那样编写它:

      var flikty = new Flickity('.main-template', { 
            contain: true, 
            imagesLoaded: true, 
            cellAlign: 'left',
            pageDots: false, 
            arrowShape: 'M 15,50 L 65,100 L 70,95 L 25,50  L 70,5 L 65,0 Z', 
            lazyLoad: 5 }
        )
      }
    

    【讨论】:

    • 谢谢!我不知道 Flickity-Vue 的存在哈哈。但我的问题是我在哪里放置香草js?我的问题是我无法使用 queryselector 选择 vue 实例中的 DOM。我不知道是不是因为我设置了一个条件,在数据不为空之前不加载模板中的 DOM,但是如果我删除它,vue 会警告我不应该使用data不存在。对不起,如果我看起来像是在兜圈子。顺便说一句,我没有使用 Vue CLI,这只是 laravel-mix 上的 vue.js ..
    • 您是否尝试像这样初始化它:var flikty = new Flickity('.main-template', { ...?您不需要在文档中说明的引擎盖下使用它为您选择的任何选择器。如果它不起作用,请尝试使用 event listener window.addEventListener('DOMContentLoaded', (event) =&gt; { var flikty = new Flickity('.main-template', { .... });Inside 这个事件侦听器将所有逻辑包装在 sliderInit 函数中,您应该能够使用您的 querySelector 选择元素。让我知道这是否有帮助,以便我可以编辑我的答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 1970-01-01
    • 2017-01-29
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-10
    相关资源
    最近更新 更多