VueJS:在 jquery 插件中使用嵌套组件

Posted

技术标签:

【中文标题】VueJS:在 jquery 插件中使用嵌套组件【英文标题】:VueJS: Using nested components within jquery plugin 【发布时间】:2016-05-06 16:13:12 【问题描述】:

所以我尝试在 vue 组件中使用 slick.js 轮播插件。这在没有嵌套的 vue 组件时有效。但是,我尝试使用 slick 用于幻灯片轨道的嵌套 div 包装的那一刻是构建的,但在重复之外。基本上专辑只是迭代专辑列表并将所有参数传递给子专辑。一切都已启动,光滑工作,组件工作,但它们不在滑轨内,这意味着它们没有得到轮播处理。

我研究了指令、插槽等,但无济于事,没有关于此的信息。

这是我的 html

<div class="albums-component">
    <div class="albums-container" v-slick>
        <album v-for="album in albums.data"
               :album="album"
               file-types="audio,video,image"
               :fixed-size="fixedSize"
               :show-rotator="showRotator"
               :display-limit="3"
               :columns-lg="columnsLg"
               :columns-md="columnsMd"
               :columns-sm="columnsSm"
               :center-images="centerImages"
               :presenter-enabled="true"
               :manage-enabled="manageEnabled">
        </album>
    </div>
    <button class="left add-button" v-on:click="createAlbum"> + </button>
</div>

这是我的 slick 指令:

Vue.directive('slick', 
twoWay: true,
priority: 1000,

params: ['options'],

bind: function () 
    var self = this;
    setTimeout(function()
        $(self.el).slick(
            slidesToShow: 1,
            slidesToScroll: 1,
            elementsExist: true,
            arrows: false,
            fade: true
        );
    , 1000);

,
update: function (value)


,
unbind: function ()



);

我不会发布专辑组件以保持这篇文章简短,因为它很长(在道具、方法等方面)

任何关于我如何在不使用 VueJS 编写新的轮播组件的情况下实现这一点的见解将不胜感激!

我能够通过添加具有 500 毫秒延迟的 setTimeout() 来使其工作...不过,这似乎不太可靠,是否有一个钩子可以说明何时编译直接组件以及所有子组件?

【问题讨论】:

还想指出,我尝试这样做。$nextTick() 用于启动插件,但仍然无法使其正常工作。 您是否尝试在不使用指令的情况下使用 attach() 挂钩?示例:attached () this.els.slickEl.slick(...) ,我只是建议这样做,因为它通常可以正常工作而且我从未使用过指令。 是的,我也试过了 激活阶段有可能是自顶向下的,需要等待子组件被激活/渲染。如果这是问题所在,并且您找到了解决方案,请发布(可能有用),我会尝试先在 activate 中使用 Vue.nextTick()。 我会尝试将v-slick 指令转换为组件,并在初始化后将album 组件$dispatch 设为一个事件。一旦slick 组件接收到所有预期的初始化事件,然后初始化 slick。 【参考方案1】:

也许这个例子对你有帮助。

https://jsfiddle.net/ycmnnx9k/2/

HTML

<div id="app">
  <album v-for="(album, index) in albums" :key="index" :album="album"></album>

  <button type="button" @click="addAlbum">
    add album
  </button>
</div>

<script type="text/x-template" id="album">
  <div>
    <div v-for="item in album.items">
        <img v-bind:src="item.url">
    </div>
  </div>
</script>

JS

new Vue(
  el: '#app',
  methods: 
    addAlbum () 
      let newAlbum = Object.assign(, this.newAlbum)
      this.albums.push(newAlbum)
    
  ,
  data: 
    albums: [],
    newAlbum: 
        items: [
        name: 1, url: 'https://placeimg.com/200/100/any',
        name: 2, url: 'https://placeimg.com/200/100/people',
        name: 3, url: 'https://placeimg.com/200/100/tech',
        name: 4, url: 'https://placeimg.com/200/100/nature',
        name: 5, url: 'https://placeimg.com/200/100/arch'
      ]
    
  
)

Vue.component('album', 
    template: '#album',
    props: ['album'],
    mounted: function () 
      $(this.$el).slick(
        infinite: true,
        slidesToShow: 3,
        slidesToScroll: 3
      )
    
)

【讨论】:

以上是关于VueJS:在 jquery 插件中使用嵌套组件的主要内容,如果未能解决你的问题,请参考以下文章

Vuejs jquery 数据表直接插件无法正常工作

Vuejs - 啥时候应该初始化 jquery 插件

未检测到 vuejs 插件。 ReferenceError: jQuery 没有在 eval 中定义

vue引入依赖jquery的第三方插件

如何在 Vuejs 中从其父组件设置嵌套组件的样式?

具有单文件组件的 Vuejs 嵌套组件