J'essaie de faire fonctionner cet exemple Flickity (CodePen) dans un VueJS composant.
HTML
mounted () { flkty.on('dragStart', function () { this.stageDragging = true console.log('stageDragging: ' + this.stageDragging) }) flkty.on('dragEnd', function () { this.stageDragging = false console.log('stageDragging: ' + this.stageDragging) })
JS
import Flickity from 'flickity' var flkty = new Flickity('.carousel') export default { data () { return { flickityOptions: { dragThreshold: 50, initialIndex: 1, prevNextButtons: false, pageDots: false, wrapAround: false, hash: true, percentPosition: false },
J'obtiens cette erreur:
mauvais élément pour Flickity: carrousel
Ma version ne fonctionne pas :
Données JS ()
var flkty = new Flickity('.carousel'); flkty.on( 'dragStart', function() { console.log('dragStart'); });
JS monté ()
<div class="carousel"> <div class="carousel-cell"></div> <div class="carousel-cell"></div> <div class="carousel-cell"></div> <div class="carousel-cell"></div> <div class="carousel-cell"></div> </div>
Comment utiliser cet exemple Flickity dans un composant VueJS?
3 Réponses :
<link href="https://npmcdn.com/flickity@2/dist/flickity.css" rel="stylesheet"/> <script src="https://npmcdn.com/flickity@2/dist/flickity.pkgd.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script> <div id="app"> <div class="carousel"> <div v-for="item in itemsCount" class="carousel-cell">{{ item }}</div> </div> </div>
* { box-sizing: border-box; } body { font-family: sans-serif; } .carousel { background: #FAFAFA; } .carousel-cell { width: 66%; height: 200px; margin-right: 10px; background: #8C8; border-radius: 5px; counter-increment: carousel-cell; } .carousel-cell:before { display: block; text-align: center; content: counter(carousel-cell); line-height: 200px; font-size: 80px; color: white; }
var app = new Vue({ el: '#app', data() { return { options: { dragThreshold: 50, initialIndex: 1, prevNextButtons: false, pageDots: false, wrapAround: false, hash: true, percentPosition: false, }, itemsCount: 5, flkty: null, } }, mounted: function () { this.flkty = new Flickity(`#${this.$el.id} .carousel`); this.flkty.on( 'dragStart', function() { console.log('dragStart'); }); } }) Vue.config.devtools = false; Vue.config.productionTip = false;
Dans votre section , le JavaScript s'exécute avant que le modèle n'ait été rendu dans le document, donc Flickity ne pourrait pas trouver
.carousel
s'il est appelé à l'extérieur d'un crochet. Les instances Vue ont un monté ()
hook de cycle de vie qui est appelé lorsque son modèle est rendu, c'est là que vous devez créer le carrousel Flickity:
// template <div ref="carousel"> // script new Flickity(this.$refs.carousel)
Aussi, au lieu de passer le nom de classe .carousel
à Flickity, passez un ref
à l'élément .carousel
dans afin d'éviter de saisir un élément .carousel
inattendu dans le document (par exemple, si vous aviez plusieurs instances de composant).
// const flkty = new Flickity(...) // DON'T DO THIS HERE export default { mounted() { this.$nextTick(() => { const flkty = new Flickity(...) // ... }); } }
Cas spécifique de Rails:
l'invite d'erreur car j'ai eu une double fois la balise de script CDN et le code JS sur mon Javascript / Packs
sur le même layout.html.erb
<%= javascript_pack_tag 'flickity' %> <script src="https://unpkg.com/flickity@2/dist/flickity.pkgd.min.js"></script>
Vous devrez probablement envisager d'utiliser ref pour accéder à l'élément / composant respectif ou au minimum créer une instance de
Flickity
dans un hook de cycle de vie tel quemonté ()
lorsque l'élément est réellement disponible dans le DOM. Cela étant dit, il existe des bibliothèques / composants conçus pour Vue qui utilisent Flickity.