关闭

[置顶] Vue.js系列之vue-router(中)(4)

标签: vuevue-router路由配置懒加载
7041人阅读 评论(0) 收藏 举报
分类:

说明:

我们项目现在用的是:vue2.0 + vue-cli + webpack + vue-router2.0 + vue-resource1.0.3
如果大家在实践的过程中与本文所说的内容有较大区别的话看看是不是版本问题。
本文是一系列文章,在我对Vue有了更深刻的理解认识之后会对文章及时进行修改或更正。欢迎大家批评指出错误。以下是已完成的文章列表。

1. Vue.js系列之项目搭建(1)
2. Vue.js系列之项目结构说明(2)
3. Vue.js系列之vue-router(上)(3)


补充

对于上篇分享的router.js文件补充以下三点:

1.新建好的router.js文件要想起作用,需要在main.js中import进来。

/*引入路由设置*/
import "./routers.js"

2.如果你在options里声明了挂载的el,就不用再手动mount了

var app = new Vue({
    el: '#app',  //不需要
    router,
    render: h => h(App) //新添加的函数操作
}).$mount('#app');

3.第二点看到,我们新加了render: h => h(App) 一开始我没看懂,直接注释运行看下,结果<div id="app"></div> 这个容器里面就啥也没有渲染出来。我也不怎么理解,如果有大牛清楚的恳请留言指导一下啊。但是我还是查了一下资料。

//=> 是ES6的箭头语法
// ES5  
(function (h) {  
  return h(App);  
});  

// ES6  
h => h(App); 

官方文档说明1:

render: function (createElement) {
    return createElement(
      'h' + this.level,   // tag name 标签名称
      this.$slots.default // 子组件中的阵列
    )
  }

官方文档说明2:
render
类型:Function
详细:字符串模板的代替方案,允许你发挥 JavaScript 最大的编程能力。render 函数接收一个 createElement 方法作为第一个参数用来创建 VNode。
我是这么理解的,我们的路由跳转时,定位到了一个组件进行渲染,但是之前app这个容器里面是有其他组件的,我们不能直接添加进去,只能把app里面的模板文件替换掉,所以用这个字符串模板的代替方案render(不知道对不对,真心请大神指出,大家这里略过吧)。

懒加载

懒加载的必要性:

1.解决样式冲突问题
2.解决页面资源加载问题
3.路由被访问时才加载对应组件,提高应用加载效率

具体代码写法

关键我们要做的就是把之前普通import进来的组件定义成异步组件。
前:

import home form "./components/home"  
import login form "./components/login" 

后:

const home = resolve => require(['./home.vue'], resolve)
const login = resolve => require(['./login.vue'], resolve)

Router构造详细配置

const router = new VueRouter({
    mode: 'history',//history: 依赖 HTML5 History API 和服务器配置。
    base: __dirname,
    linkActiveClass:'link-active',
    scrollBehavior (to, from, savedPosition) {
      if (savedPosition) {
        return savedPosition
      } else {
        return { x: 0, y: 0 }
      }
    }
    routes
}) 

mode
默认’hash’值,但是hash看起来就像无意义的字符排列,不太好看也不符合我们一般的网址浏览习惯。
当你使用 history 模式时,URL 就像正常的 url,例如 http://wx.hq88.com/lms/,也好看!

base
默认值: “/”,应用的基路径,一般就是项目的根目录,webpack中有配置好。

var projectRoot = path.resolve(__dirname, '../')

linkActiveClass
默认值: “router-link-active”,就是当前组件被激活,相应路由会自动添加类”router-link-active”,这里是为了全局设置激活类名,如果不设置,直接用默认的也是可以的。

scrollBehavior
通过这个这个属性(是个函数),可以让应用像浏览器的原生表现那样,在按下 后退/前进 按钮时,简单地让页面滚动到顶部或原来的位置。

完整路由代码

const scrollBehavior = (to, from, savedPosition) => {
      if (savedPosition) {
        return savedPosition
      } else {
        return { x: 0, y: 0 }
      }
    }

routes: [
    {
      path: '/',
      name: 'home',
      component: function(reslove){
        return require(['./components/home'],reslove)
      }
    },
    {
      path: '/login',
      name: 'login',
      component: function(reslove){
        return require(['./components/login/login'],reslove)
      }
    }
 ]
// 创建一个路由器实例,并且配置路由规则
const router = new VueRouter({
    mode: 'history',
    base: __dirname,
    linkActiveClass:'link-active',
    scrollBehavior,
    routes
});
//创建和挂载根实例
const app = new Vue({
  router: router,
  render: h => h(App)
}).$mount('#app');

总结

中篇主要对上篇遗漏的点进行了补充,分享了 懒加载的实现以及Router构造详细配置,最终形成了我们项目中用的router.js。下篇我将继续分享路由知识,主要是一些小的知识点,但是在应用的过程中不可或缺。

1.当前路由添加激活状态active-class
2.路由跳转时添加过渡动效
3.路由传参及命名路由
4.编程式导航
5.router-link的其他表现形式

2
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:135953次
    • 积分:2281
    • 等级:
    • 排名:第16569名
    • 原创:82篇
    • 转载:11篇
    • 译文:0篇
    • 评论:61条
    最新评论