【问题标题】:VueJS: Using nested components within jquery pluginVueJS:在 jquery 插件中使用嵌套组件
【发布时间】: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。

标签: javascript jquery vue.js


【解决方案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
      })
    }
})

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 2017-12-18
    • 2021-01-07
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2017-08-10
    • 2021-12-29
    相关资源
    最近更新 更多