路由懒加载优化

首先得需要插件支持:syntax-dynamic-import

import Vue from 'vue'
import VueRouter from 'vue-router'
/*import First from '@/components/First'
import Second from '@/components/Second'*/
   
Vue.use(VueRouter)
//方案1
const first =()=>import(/* webpackChunkName: "group-foo" */ "../components/first.vue");
const second = ()=>import(/* webpackChunkName: "group-foo" */ "../components/second.vue");
const three = ()=>import(/* webpackChunkName: "group-fooo" */ "../components/three.vue");
const four = ()=>import(/* webpackChunkName: "group-fooo" */ "../components/four.vue");
//方案2
const first = r => require.ensure([], () => r(require('../components/first.vue')), 'chunkname1')
const second = r => require.ensure([], () => r(require('../components/second.vue')), 'chunkname1')
const three = r => require.ensure([], () => r(require('../components/three.vue')), 'chunkname2')
const four = r => require.ensure([], () => r(require('../components/four.vue')), 'chunkname2')
 
//懒加载路由
const routes = [
 {   //当首次进入页面时,页面没有显示任何组件;让页面一加载进来就默认显示first页面
 path:'/', //重定向,就是给它重新指定一个方向,加载一个组件;
 component:first
 },
 {
 path:'/first',
 component:first
 },
 {
 path:'/second',
 component:second
 }, {
 path:'/three',
 component:three
 },
 {
 path:'/four',
 component:four
 }
//这里require组件路径根据自己的配置引入
]
//最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。
   
 const router = new VueRouter({
 routes
})
   
export default router;

  https://www.zhihu.com/question/50121629

 

// 进入路由
  beforeRouteEnter (to, from, next) {
    getPost(to.params.id, post => {
      // 由于组件还没有初始化, this 不存在
      // next 接受一个回调, 用于切换路由后执行, 可以通过vm获取实例
      next(vm => {
        vm.post = post
      })
    })
  },
  // 路由变化
  beforeRouteUpdate (to, from, next) {
    getPost(to.params.id, (post) => {
      // 组件已经初始化, this 存在
      this.post = post
      next()
    })
  }

  如果我们需要使用 Vuex ,可能会遇到更多问题:

  • 无法获取 $store ( beforeRouteEnter中无法获取this )
  • 无法获取组件实例的 methods( beforeRouteEnter中无法获取this )
  • 无法控制 dispatch 流程

个人比较习惯这样解决:

首先封装 Promise 用于控制 dispatch 流。

// store.js
const generate = commit => (id, mutation) => {
  return new Promise((resolve, reject) => {
    getPost(id).then(data => {
      commit(mutation, data)
      resolve()
    })
  })
}

  正常使用 actions 和 mutations。

// store.js
[action.yourAction] ({ commit, state }) {
  return generate(commit)(yourId, mutation.yourMutation)
},
[mutation.yourMutation] (state, data) {
  state.yourPost = data
}

  在组件中使用引入store,并运用 Promise 控制流程。

// YourComponent.vue
import store from './yourRoute/store.js'

export default {
  beforeRouteEnter: (to, from, next) => {
    Promise.all([
      store.dispatch(types.yourModule.action.yourAction)
    ]).then(() => {
      next()
    })
  },
  computed: {
    ...mapGetters({
      yourPost: types.yourModule.getter.yourPost
    })
  },
}

  先异步请求数据,动态构建好router,再初始化App组件。index.html里面加个loading效果,App组件创建好会自动替换掉它。

import Vue  from  'vue'
import VueRouter  from  'vue-router'
/*import First from '@/components/First'
import Second from '@/components/Second'*/
   
Vue.use(VueRouter)
//方案1
const  first =()=>import( /* webpackChunkName: "group-foo" */  "../components/first.vue" );
const  second = ()=>import( /* webpackChunkName: "group-foo" */  "../components/second.vue" );
const  three = ()=>import( /* webpackChunkName: "group-fooo" */  "../components/three.vue" );
const  four = ()=>import( /* webpackChunkName: "group-fooo" */  "../components/four.vue" );
//方案2
const  first = r => require.ensure([], () => r(require( '../components/first.vue' )),  'chunkname1' )
const  second = r => require.ensure([], () => r(require( '../components/second.vue' )),  'chunkname1' )
const  three = r => require.ensure([], () => r(require( '../components/three.vue' )),  'chunkname2' )
const  four = r => require.ensure([], () => r(require( '../components/four.vue' )),  'chunkname2' )
 
//懒加载路由
const  routes = [
  {    //当首次进入页面时,页面没有显示任何组件;让页面一加载进来就默认显示first页面
  path: '/' //重定向,就是给它重新指定一个方向,加载一个组件;
  component:first
  },
  {
  path: '/first' ,
  component:first
  },
  {
  path: '/second' ,
  component:second
  }, {
  path: '/three' ,
  component:three
  },
  {
  path: '/four' ,
  component:four
  }
//这里require组件路径根据自己的配置引入
]
//最后创建router 对路由进行管理,它是由构造函数 new vueRouter() 创建,接受routes 参数。
   
  const  router =  new  VueRouter({
  routes
})
   
export  default  router;

转载于:https://www.cnblogs.com/smzd/p/8665676.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值