Laravel VueJS-将延迟加载添加到组件v-for
我想在我的网站上增加加载时间。我现在有一个我所有项目的列表,所有项目都在第一页加载。我想实现对这些组件的延迟加载,但我似乎找不到一种方法来实现 我有一个名为Laravel VueJS-将延迟加载添加到组件v-for,laravel,vue.js,vuejs2,vue-component,Laravel,Vue.js,Vuejs2,Vue Component,我想在我的网站上增加加载时间。我现在有一个我所有项目的列表,所有项目都在第一页加载。我想实现对这些组件的延迟加载,但我似乎找不到一种方法来实现 我有一个名为项目卡的组件: <project-card v-bind:project="project" v-bind:key="project.id" v-if="projects" v-for="project in filteredProjects"><
项目卡的组件
:
<project-card v-bind:project="project" v-bind:key="project.id" v-if="projects" v-for="project in filteredProjects"></project-card>
模板文件:
<template>
<div class="project-card rounded dark:bg-gray-800 bg-white overflow-hidden shadow-lg rounded-lg flex flex-col relative">
<img class="w-full h-64 object-cover" :src="'/uploads/' + project.image" alt="">
<div class="px-6 py-4 h-full flex flex-col">
<div class="project-info block min-h-8">
<div class="w-full">
<p class="tracking-widest text-xs title-font font-medium dark:text-white text-gray-500 mb-1">{{ project.language }}</p>
</div>
</div>
<div class="project-language flex-1">
<div class="w-5/6 float-left">
<p class="font-bold dark:text-white gilroy text-xl">{{ project.name }}</p>
</div>
</div>
<div class="project-description flex-2 space-y-4 py-3 h-full">
<p class="dark:text-white ">{{ project.description | str_limit(128) }}</p>
</div>
<div class="read-more mt-auto">
<div class="flex items-center flex-wrap ">
<button type="button" @click="openModal" class="font-bold text-sm text-indigo-600 hover:text-indigo-500 transition duration-150 ease-in-out hover:text-indigo-900 read-more-button flex items-center focus:outline-none">
Lees meer <span class="read-more-arrow ml-2">→</span>
</button>
<span class="text-gray-600 mr-3 inline-flex items-center lg:ml-auto md:ml-0 ml-auto leading-none text-sm pr-3 py-1 border-r-2 border-gray-300">
</span>
<span class="text-gray-600 inline-flex items-center leading-none text-sm">
<svg xmlns="http://www.w3.org/2000/svg" fill="none" stroke="currentColor" stroke-width="2" viewBox="0 0 24 24" stroke-linecap="round" stroke-linejoin="round" class="w-4 h-4 mr-1">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z" />
</svg>
{{ project.stargazers_count }}
</span>
</div>
<project-card-modal :project="project" ref="projectModal"></project-card-modal>
</div>
</div>
</div>
</template>
<script>
import projectCardModalComponent from "./projectCardModalComponent";
export default {
components: {
projectCardModalComponent
},
methods: {
openModal() {
this.$refs.projectModal.show = true;
}
},
props: ['project']
}
</script>
{{project.language}
{{project.name}
{{project.description | str_limit(128)}
利斯梅尔→
{{project.stargazers_count}
从“/projectCardModalComponent”导入projectCardModalComponent;
导出默认值{
组成部分:{
projectCardModalComponent
},
方法:{
openModal(){
此.$refs.projectModal.show=true;
}
},
道具:[“项目”]
}
目前,它看起来像这样,所以它给出了一个想法,它应该如何变成。但是我想实现对这个组件的延迟加载。我怎样才能做到这一点
APP.JS
import Vue from "vue";
require('./bootstrap');
window.Vue = require('vue');
Vue.component('project-card', require('./components/projectCardComponent.vue').default);
Vue.component('project-card-modal', require('./components/projectCardModalComponent.vue').default);
Vue.component('contact-form', require('./components/contactFormComponent.vue').default);
Vue.component('contact-form-flash', require('./components/contactFormFlashComponent.vue').default);
Vue.component('project-language-filter-button', require('./components/projectLanguageButtonFilterComponent.vue').default);
Vue.component('project-language-filter-dropdown', require('./components/projectLanguageDropdownFilterComponent.vue').default);
Vue.component('education', require('./components/educationComponent.vue').default);
Vue.component('work-experience', require('./components/workExperienceComponent.vue').default);
Vue.component('sidebar', require('./components/dashboard/dashboardSidebarComponent.vue').default);
Vue.component('projects', require('./components/dashboard/dashboardProjectsComponent.vue').default);
import MugenScroll from 'vue-mugen-scroll'
const app = new Vue({
el: '#app',
data: {
showModal: false,
projects: [],
filteredProjects: [],
languages: [],
languageFilterKey: 'all',
workExperiences: [],
educations: [],
search: '',
pageSizeBegin: 0,
pageSizeEnd: null,
projectsLoading: false,
},
mounted: function() {
this.getProjects();
this.getWorkExperiences();
this.getAllEducations();
this.getProjectLanguages();
},
created() {
this.getFilteredProjects();
},
methods: {
getProjects: function() {
axios.get('/api/get/projects')
.then(response => {
this.filteredProjects = this.projects = response.data
}).catch(err => {
console.log(err)
});
},
getFilteredProjects: function() {
for(let i = 0; i < 6; i++) {
let count = this.filteredProjects.length + i
}
},
getProjectLanguages: function() {
axios.get('/api/get/project/languages')
.then(response => {
this.languages = response.data
}).catch(err => {
console.log(err)
});
},
selectedLanguage: function() {
if(this.languageFilterKey !== null) {
this.languages.forEach((item) => {
item.active = item.language === this.languageFilterKey;
});
} else {
this.languageFilterKey = null
}
},
filterProjectsByLanguage () {
if(this.languageFilterKey === 'all') {
this.filteredProjects = this.projects;
} else {
this.filteredProjects = this.projects.filter((project) => {
return this.languageFilterKey === project.language
});
}
},
getWorkExperiences: function() {
axios.get('/api/get/workexperiences')
.then(response => {
this.workExperiences = response.data
}).catch(err => {
console.log(err)
});
},
getAllEducations: function() {
axios.get('/api/get/educations')
.then(response => {
this.educations = response.data
}).catch(err => {
console.log(err)
});
},
amountOnChange(event) {
if(!event.target.value) {
this.pageSizeEnd = null;
} else {
this.pageSizeEnd = event.target.value;
}
}
},
computed: {
filteredList() {
if(!this.pageSizeEnd) {
return this.projects.filter((project) => {
return project.name.toLowerCase().includes(this.search.toLowerCase()) || project.language.toLowerCase().includes(this.search.toLowerCase())
})
}
return this.projects.filter((project) => {
return project.name.toLowerCase().includes(this.search.toLowerCase()) || project.language.toLowerCase().includes(this.search.toLowerCase())
}).slice(this.pageSizeBegin, this.pageSizeEnd)
},
}
})
Vue.filter('str_limit', function (value, size) {
if (!value) return '';
value = value.toString();
if (value.length <= size) {
return value;
}
return value.substr(0, size) + '...';
});
从“Vue”导入Vue;
需要('./引导');
window.Vue=require('Vue');
Vue.component('project-card',require('./components/projectCardComponent.Vue')。默认值);
Vue.component('project-card-modal',require('./components/projectCardModalComponent.Vue')。默认值);
组件('contact-form',require('./components/contactFormComponent.Vue')。默认值);
组件('contact-form-flash',require('./components/contactFormFlashComponent.Vue')。默认值);
组件('project-language-filter-button',require('./components/projectLanguageButtonFilterComponent.Vue')。默认值);
组件('project-language-filter-dropdown',require('./components/projectLanguageDropdownFilterComponent.Vue')。默认值);
Vue.component('education',require('./components/educationComponent.Vue')。默认值);
Vue.component('work-experience',require('./components/workExperienceComponent.Vue')。默认值);
组件('sidebar',require('./components/dashboard/dashboardSidebarComponent.Vue')。默认值);
组件('projects',require('./components/dashboard/dashboardProjectsComponent.Vue')。默认值);
从“vue mugen scroll”导入MugenScroll
const app=新的Vue({
el:“#应用程序”,
数据:{
showModal:错,
项目:[],
筛选项目:[],
语言:[],
languageFilterKey:'全部',
工作经历:[],
教育:[],
搜索:“”,
pageSizeBegin:0,
pagesizend:null,
项目阅读:错误,
},
挂载:函数(){
这个.getProjects();
这是getWorkExperiences();
这个。getAllEducations();
这是.getProjectLanguages();
},
创建(){
这个.getFilteredProjects();
},
方法:{
getProjects:function(){
axios.get('/api/get/projects')
。然后(响应=>{
this.filteredProjects=this.projects=response.data
}).catch(错误=>{
console.log(错误)
});
},
getFilteredProjects:function(){
for(设i=0;i<6;i++){
让计数=this.filteredProjects.length+i
}
},
getProjectLanguages:function(){
axios.get(“/api/get/project/languages”)
。然后(响应=>{
this.languages=response.data
}).catch(错误=>{
console.log(错误)
});
},
selectedLanguage:function(){
if(this.languageFilterKey!==null){
this.languages.forEach((项)=>{
item.active=item.language===this.languageFilterKey;
});
}否则{
this.languageFilterKey=null
}
},
filterProjectsByLanguage(){
if(this.languageFilterKey=='all'){
this.filteredProjects=this.projects;
}否则{
this.filteredProjects=this.projects.filter((项目)=>{
返回此.languageFilterKey===project.language
});
}
},
getWorkExperiences:function(){
axios.get(“/api/get/workexperiences”)
。然后(响应=>{
this.workExperiences=response.data
}).catch(错误=>{
console.log(错误)
});
},
getAllEducations:function(){
axios.get(“/api/get/educations”)
。然后(响应=>{
this.educations=response.data
}).catch(错误=>{
console.log(错误)
});
},
AmontonChange(事件){
如果(!event.target.value){
this.pagesizend=null;
}否则{
this.pagesizend=event.target.value;
}
}
},
计算:{
过滤器列表(){
如果(!this.pagesizend){
返回此.projects.filter((项目)=>{
返回project.name.toLowerCase().includes(this.search.toLowerCase())| | project.language.toLowerCase().includes(this.search.toLow