how to lazy load elements on demands depending on the page visited?

Viewed 51

I am creating a Laravel project which embed many Vue components (using webpack+mix.js).

-In app.js I have:

import './bootstrap';

require('@fortawesome/fontawesome-free/js/all.js');

import Vue from "vue";

import router from './Router'
import store from './Store/index'
import vuetify from './vuetify.js'

import 'vuetify/dist/vuetify.min.css'
window.Vuetify = require('vuetify');
Vue.use(vuetify);


//import cartComponent from "./components/cartComponent";
// import cart from "./components/Cart";

import 'vuetify/dist/vuetify.min.css'
import Vuelidate from 'vuelidate'

Vue.use(Vuelidate)
import BTabs from 'bootstrap-vue'
import datePicker from "vue-bootstrap-datetimepicker";
//
Vue.use(datePicker);
Vue.use(BTabs)
const opts = {}
const my_components = document.getElementsByClassName("my-component-class-wrapper");

for (var i = 0; i <= my_components.length+1; i++) {

        new Vue({
            el: '#app' + i,
            vuetify, //not all pages require it !
            store, // *********************now store is shared between all the instances
            router,
            // opts,

            components: {
                cartComponent: () => import(/* webpackPrefetch: true */"./components/cartComponent"),
                addToCart: () => import('./components/addToCart'), //in productDetail: <add-to-cart>
                //cartComponent, //cart icon in navbar
                cart: () => import('./components/Cart'),//cartDetails page
                info: () => import('./components/Info') //info page
            },
            data: {},

            async created() { //if removed the cart icon will disapear
                store.dispatch('fetchProducts').then(_ => { //execute fetchProducts in vuex.
                }).catch((error) => console.log(error))
            },
            validations: {}
        });
    }

I am using looping, so I can share one store between elements.

The problem is the slowness of the webpages to finish loading. And I discovered that #app0,#app1, .etc. are All carried to every page I visit, getting a message saying:Cannot find element: #app1,#app2,... besides, not all the pages are using vuetify; another point, I don't need to fetch all the products in every page (async created()). Is there a way to fetch elements on demand depending on the page I visit ? maybe that will solve the slowness of the pages.

The way the vue component are embedded in pages are :

-page1.blade.php :

    <body>
     <div id="app0" class="my-component-class-wrapper">
      <info></info>
     </div>
      <script defer src="{{ mix('js/app.js') }}"></script>
    </body>

-page2.blade.php:

    <body>
      <div id="app1" class="my-component-class-wrapper">
       <add-to-cart></add-to-cart>
      </div>
    <script defer src="{{ mix('js/app.js') }}"></script>
   </body>  
0 Answers
Related