嗨,我有一个Firestore数据库,我从那里获得配置文件,然后使用v-for在一个页面上显示它们,但我想放一个无限的卷轴在更好的用户体验. 这是我的Java脚本可组合代码

import { projectFirestore } from "../Firebase/Config";
import { ref } from "vue"

const getPremium = () => {
    const Premium = ref([])
    const error = ref(null)

    
const load = async () => {
    try{
        const res = await projectFirestore.collection('Premium').limit(4).get()
        

        Premium.value = res.docs.map(doc => {
           console.log(doc.data())
           return {...doc.data(), id: doc.id}
        })
    }
    catch (err){
        error.value = err.message
        console.log(error.value)
    }
    const newPicturesCount = await load()
    if (newPicturesCount > 0) {
        return load() // More profiles to come
      }

      return console.log("done") // Done with the profiles
    }

    return { Premium, error, load }
}

export default getPremium

我所期望的是,它将然后v-对于其余的结果,并使它,以便第一个配置文件将加载,然后是下一个,以使用户体验更好,与较少的加载时间,但配置文件被记录在控制台,因为他们加载,但他们并没有出现在v-for语句中,正如我所预期的,它似乎得到相同的4个配置文件一遍又一遍,这不是我想要的,这里的VUE结束了完整的画面.

<div v-for =" Premiums in Premium" :key="Premiums.id" >
 <router-link :to="{ name: 'Samplepremium', params: { id: Premiums.id }}">
 <div class= "hover:scale-105 transition ease-in-out duration-300 bg-neutral-800 hover:bg-neutral-900 active:bg-neutral-900 text-neutral-400 font-bold rounded-xl">
  <br>
     <p class="text-xl">{{ Premiums.Name }}</p>
     <div class="relative">
     <img :src= "Premiums.Pic1"  class="object-contain px-1 inline-block w-96 h-44 md:w-60 md:h-80 lg:w-60 lg:h-80 xl:w-60 xl:h-80 2xl:w-60 2xl:h-80 transition ease-in-out duration-300">
     <p class="bg-red-700 text-slate-300 text-xl absolute top-0 w-full">{{ Premiums.detail1 }}</p>
     <p class="bg-red-700 text-slate-300 text-xl absolute bottom-0 w-full"> {{ Premiums.detail2 }} </p>
    </div>
     <div class="grid grid-cols-2 grid-rows-fit text-left ml-6">
     <p>Age:</p>
     <p>{{ Premiums.detail3 }}</p>
     <p>Location:</p>
     <p>{{ Premiums.detail4 }}</p>
     <p>Rates:</p>
     <p>{{ Premiums.detail5 }} /hr</p>
     <p>Phone:</p>
     <p>{{ Premiums.detail6 }}</p>
   
    </div><br>
  </div>
  </router-link>
  </div>
</template>

如果任何人有任何关于如何跟踪我的文档,以及如何在首字母for之后使用v-for配置文件的 idea ,我会非常感激的,谢谢.

推荐答案

可能您的实现是错误的.load()所做的是从Firebase获取四个配置文件,并使用从Firebase提供的值重新计算Premium的值.因此,通过调用Load,您每次都会获取相同的值,并且每次以前的数据都会覆盖到新的数据中,因此以前的数据会丢失.

您需要做的是使用游标,并将数据添加到Premium Value.

修改getPremium():

const getPremium = () => {
    const Premium = ref([])
    const error = ref(null)
    let lastDoc = null; 

    const load = async () => {
        try {
            let query = projectFirestore.collection('Premium').orderBy('id').limit(4)
            if (lastDoc) {
                query = query.startAfter(lastDoc)
            }

            const res = await query.get()

            if (!res.empty) {
                lastDoc = res.docs[res.docs.length - 1]

                // Add new results to exsiting ones

                Premium.value = [...Premium.value, ...res.docs.map(doc => {
                    console.log(doc.data())
                    return {...doc.data(), id: doc.id}
                })]
            }
        }
        catch (err){
            error.value = err.message
            console.log(error.value)
        }
    }

    return { Premium, error, load }
}

export default getPremium

记住要加import { projectFirestore } from "../Firebase/Config";import { ref } from "vue".

现在只需对您的html部分使用@scroll:

<div @scroll="checkScroll" style="overflow-y: auto; height: 100vh;">
    <div v-for="Premiums in Premium" :key="Premiums.id" >
        <!-- your html goes here -->
    </div>
    <button v-if="isLoading" type="button">Loading...</button>
</div>

以及:

checkScroll() {
    if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
            this.load(); 
    }
}

很直白,对吧? 希望这能帮助?

Javascript相关问答推荐

使用redux-toolet DelivercThunks刷新访问令牌

如何才能拥有在jQuery终端中执行命令的链接?

传递一个大对象以在Express布局中呈现

了解Node.js中的EventEums和浏览器中的addEventEums之间的关系

在nextjs服务器端api调用中传递认证凭证

用JavaScript复制C#CRC 32生成器

如何根据当前打开的BottomTab Screeb动态加载React组件?

我创建了一个创建对象的函数,我希望从该函数创建的对象具有唯一的键.我怎么能做到这一点?

Angular 订阅部分相互依赖并返回数组多个异步Http调用

连接到游戏的玩家不会在浏览器在线游戏中呈现

如何在DYGRAPS中更改鼠标事件和键盘输入

自定义确认组件未在vue.js的v菜单内打开

从逗号和破折号分隔的给定字符串中查找所有有效的星期几

Phaser3 preFX addGlow不支持zoom

在JS/TS中将复杂图形转换为数组或其他数据 struct

JavaScript将字符串数字转换为整数

如何在Highlihte.js代码区旁边添加行号?

是否有静态版本的`instanceof`?

暂停后只有一次旋转JS

单击时同时 Select 和展开可访问的行