【问题标题】:VueJS & jQuery query selectorVueJS 和 jQuery 查询选择器
【发布时间】:2019-01-22 15:36:50
【问题描述】:

我正在尝试在 .vue 组件中获取 DOM 元素,但我不能,因为我认为该元素尚未渲染。

如果我这样做,它会起作用:

setTimeout(() => {
    $('.element').do_something();
}, 100);

但这是不好的方式。

我也尝试过这样做:

// app.js
var app = new Vue({
    el: '#root',
    methods: {
        getElement(selector, cb()){
            var el = $(selector)                
            if(el.length){
                // I SEE THIS ELEMENT HERE
                cb(el);
            }else{
                setTimeout(() => {
                    this.getElement(selector);
                }, 10);
            }
        };
    }
});



// ExampleComponent.vue
export default {
    created() {
        var el = app.getElement('.selector');
        console.log(el);
    }
}

但我在这里遇到了一个错误:

未捕获的类型错误:cb 不是函数

我也尝试使用 Promise 而不是简单的回调。

// app.js
var app = new Vue({
    el: '#root',
    methods: {
        getElement(selector, cb()){
            var el = $(selector);
            if(el.length){
                return new Promise((resolve) => {
                    // I SEE THIS ELEMENT HERE
                    console.log(el);

                    resolve(el);
                });
            }else{
                setTimeout(() => {
                    this.getElement(selector);
                }, 10);
            }
        };
    }
});



// ExampleComponent.vue
export default {
    created() {
        app.getElement('.selector').then((el) => {
            console.log(el)
        });
    }
}

但是 getElement 返回 undefined 并且我有一个错误:

Uncaught (in promise) TypeError: Cannot read property 'then' of undefined

对我如何访问元素有什么建议吗?

【问题讨论】:

  • 您想在哪里/何时获得它?从 Vue 组件内部?在事件生命周期中的什么时候?
  • 是的,在 vue 组件中,在“创建”方法中。我有路由器,它将我的组件加载到 中。加载此组件时,我需要在组件内部的元素上初始化 jquery 插件。

标签: jquery dom vue.js


【解决方案1】:

【讨论】:

  • 第二个很有用。总结一下:如果您使用的是 v-if 那么 dom 元素不存在。但是,v-show 解决了这个问题。
【解决方案2】:

在根 Vue 实例中,组件和其中的 HTML 元素不能直接使用,并且您没有机会控制代码在组件正确创建后运行。我认为那是一条死胡同。你提到的另一件事在高层次上是正确的。但是,您的代码似乎不正确。 export default created() { 位困扰着我。

假设您有一个.vue 文件。那么它应该看起来像这样:

<template>
  <!-- using refs is an easier way of getting elements -->
  <div ref="theElementYouWant"> ... </div>
</template>

<script>
export default {
  name: 'MyComponent',
  data () {
    return {
      myvar: 0
    }
  },
  methods: { /* your methods here */ },
  created () {
    // using refs is an easier way of getting elements
    const e = this.$refs.theElementYouWant
    console.log(e)
  }
}
</script>

如果你真的需要 jQuery,你可以将它作为脚本部分 (import JQuery from 'jquery') 中的第一件事导入,但你真的不需要它来查找元素。

【讨论】:

  • 是的,我有一个 .vue 文件组件。问题是我的模板主体上有 v-if 条件而不是 i-show 。当 jQuery 尝试访问元素时,v-if 正在呈现。但如果我使用 v-show,元素已经渲染。
猜你喜欢
  • 1970-01-01
  • 2012-07-20
  • 2016-03-30
  • 2012-11-03
  • 2018-08-14
  • 2021-05-28
  • 2015-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多