JQuery 不适用于 Vuejs

Posted

技术标签:

【中文标题】JQuery 不适用于 Vuejs【英文标题】:JQuery not working with Vuejs 【发布时间】:2016-12-26 13:56:04 【问题描述】:

我正在尝试将 JQuery 插件、owl carousel 添加到使用 Vuejs 呈现的列表中。

html

<h4>1. Vuejs rendered items with OWL Carousel (not working)</h4>
<div id="user" class="owl-carousel">
    <div class="item" v-for="user in users"> user.name </div>
</div>

<h4>2. Pure HTML with OWL Carousel (working)</h4>
<div class="owl-carousel">
    <div class="item">Sunny</div>
    <div class="item">Michel</div>
    <div class="item">Daneil</div>
    <div class="item">Sony</div>
</div>

JS

var list = new Vue(
    el: '#user',
    data: 
        users: []
    ,
    methods: 
        listUsers: function() 
            var users = [
            
                id: 1,
                name: 'John'
            ,
            
                id: 2,
                name: 'Deo'
            ,
            
                id: 3,
                name: 'Anjela'
            ,
            
                id: 4,
                name: 'Samantha'
            
            ];
            this.$set('users', users);
        ,

        installOWLcarousel: function() 
            $('.owl-carousel').owlCarousel();
        
    ,
    ready: function() 
        this.listUsers();
        this.installOWLcarousel();
    
);

您可以从以下位置找到完整代码:https://jsfiddle.net/v18yjmuq/12/

我似乎在 Vuejs 呈现列表之前 JQuery 已经完成。如何避免这个问题?我可以在完全渲染循环项目的 Vuejs 后运行 JQuery 吗?

【问题讨论】:

您按什么顺序放置脚本?你是通过 npm 安装 jquery 的吗?您是否尝试添加 require('jquery')?您是否尝试在 $(document).ready() 方法中包装 jquery 方法?这些是人们面临的 vue.js 和 jquery 最常见的问题。 @Pablo,感谢您的评论。我用的是JQuery CDN,可以吗? 只要你在你的应用脚本标签之前加载它,它就是。我建议您不要使用 cdn,除非是测试/实践/超小型项目。顺序应该是:jquery > vue.js > application.js @Pablo,这是一个学习Vuejs的测试项目。我的代码中的顺序是正确的:jquery > vue.js > application.js 你应该使用 $(document).ready() 来控制渲染。 【参考方案1】:

Vue.nextTick 在大多数情况下都可以工作,或者,您可以在内置的 updated() 方法中编写代码。

updated()
   // the method called when DOM gets updated
   // write jquery code here 

【讨论】:

【参考方案2】:

在使用需要准备好 DOM 的 jQuery 插件时,您应该使用 Vue.nextTick。

来自 vue.js 文档:

将回调推迟到下一个 DOM 更新周期后执行。采用 在您更改一些数据以等待 DOM 之后立即执行此操作 更新。

在您的情况下,您应该使用 ready() 方法的以下实现:

ready: function() 
    this.listUsers();
    Vue.nextTick(function () 
        this.installOWLcarousel();
    .bind(this))
 

编辑:对于 Vue 2,请使用 mounted()created()

【讨论】:

ready() 在 Vue 2 中已弃用 - 使用 mounted()created() 对于 Vue 3,请参阅 v3.vuejs.org/api/global-api.html#nexttick【参考方案3】:

像这样将 ref 属性添加到 #user 元素

<div id="user" class="owl-carousel" ref="carousel_or_anything">

然后在Vue组件中添加mounted方法:

...
mounted: function()
  jQuery(this.$refs.carousel_or_anything).owlCarousel();

...

【讨论】:

【参考方案4】:

这真的很有趣。我认为渲染 DOM 需要一些时间,因此 carousal 失败了。在这里,我添加了一个 setTimeout 以添加可忽略不计的延迟及其工作:

https://jsfiddle.net/v18yjmuq/13/

ready: function() 
    this.listUsers();
    var self = this;
    setTimeout(function() 
      self.installOWLcarousel();
    , 0);
  

【讨论】:

@Pablo - 这里我们不能依赖jQuery.ready(),因为 Vuejs 的渲染引擎是独立于 jQuery 的。 您只需包装您的 jquery 元素调用,应该可以使用它。 @Pablo - 请参阅此jsfiddle.net/v18yjmuq/14。它使用 $(document).ready() 仍然给出与 OP 相同的错误。你认为我们可以以其他方式使用它吗? 我想是的,一旦我回到家,我会调整 jsfiddle 并发布结果。 @vijayP 是的。它在使用 setTimeout() 和 setInterval() 时起作用。但是我们可以有任何事件来检查 vuejs 是否已完全加载?

以上是关于JQuery 不适用于 Vuejs的主要内容,如果未能解决你的问题,请参考以下文章

Jquery $.Post 适用于 Firefox 但不适用于 Chrome

jQuery延迟不适用于mouseout

JQuery 不适用于 Vuejs

CORS 不适用于 jQuery

Jquery显示/隐藏根本不适用于移动设备

jQuery .click 不适用于 jQuery 生成的按钮 [重复]