循环 (v-for) 不适用于 keen-slider

Loop (v-for) doesn't work with keen-slider

提问人:Michael 提问时间:11/8/2023 更新时间:11/8/2023 访问量:57

问:

我正在使用 https://keen-slider.io,我正在尝试遍历幻灯片,每张幻灯片都有一个组件。但是,它不是显示所有幻灯片,而是只显示一张幻灯片,看起来很糟糕。<ItemCard/><ItemCard/><ItemCard/>

<template>
        <div class="keen-slider" ref="container">
            <div
                class="keen-slider__slide"
                v-for="recipe in storeRecipe.data"
                :key="recipe.id">
                <ItemCard :data="recipe" :pending="storeRecipe.pending" />
            </div>
        </div>
    </template>
    
<script setup>
import { useKeenSlider } from 'keen-slider/vue';
import { onMounted } from 'vue';
import { useStoreRecipe } from '@/store/storeRecipe';

import ItemCard from '@/component/ItemCard.vue';

const storeRecipe = useStoreRecipe();

const [container] = useKeenSlider({
    loop: true,
    spacing: 40,
    slidesPerView: 3,
});

onMounted(async () => {
    await storeRecipe.loadRecipes();
});
</script>

<style lang="scss">
@import url('keen-slider/keen-slider.css');
</style>

我还尝试添加第二个参数,然后动态添加一个类,但它也不起作用:indexv-for:class="'number-slide' + (index + 1)"

<template>
    <div class="keen-slider" ref="container">
        <div
            class="keen-slider__slide"
            :class="'number-slide' + (index + 1)"
            v-for="(recipe, index) in storeRecipe.data"
            :key="recipe.id">
            <ItemCard :data="recipe" :pending="storeRecipe.pending" />
        </div>
    </div>
</template>

有什么解决办法吗?

javascript vue.js 循环 vuejs3 滑块

评论

0赞 Estus Flask 11/8/2023
它显然不支持跟踪容器内容,特别是因为它不是原生的 vue lib 并且不知道 vue 生命周期。考虑到初始化时间是固定的 github.com/rcbyr/keen-slider/blob/master/src/vue.ts#L31 ,尝试在 dom 中准备好幻灯片时更新它,例如 nextTick(() => slider.value.update())
0赞 DinhTX 11/8/2023
keen-slider 在加载 Recipe 之前渲染,所以现在 slider = undefine。我认为您应该在渲染 keen-slider 之前添加以检查食谱列表<div v-if="storeRecipe.data.lenght" class="keen-slider" ref="container">
0赞 Michael 11/8/2023
@DinhTX没有用。
0赞 Michael 11/8/2023
@EstusFlask这变得太困难了。我一直在寻找一个适用于 Vue 3 的滑块,而 keen-slider 的文档说它适用于它。但是,添加太多代码会使这个包变得毫无意义(编写我自己的滑块更容易)。如果有一个简单的解决方案而不添加太多代码,请告诉我。
1赞 Estus Flask 11/8/2023
@Michael 你选择了 Vue 中没有实现的那个,只是一个包装器。在这一点上,你可以直接使用任何一个普通的 js 库,并将其与 vue 生命周期集成,这是一件常见且合理的事情,你不局限于 vue 3 生态系统,这是缺乏的。你需要在链接包装器中看到的代码量,这就像几行没有 TS 特定的东西。只需将 onMounted 中的 nextTick 添加到该 im[lementation 中即可修复 v-for,仅此而已。我手头没有,primevue 有轮播,但我不确定是否值得为单个组件添加整个库

答: 暂无答案