(一)Vue-路由

路由使用

  1. 静态路由
// 路由规则
const routes = [
  {
    path: '/',
    name: 'Index',
    component: Index
  },
  {
    path: '/blog',
    name: 'Blog',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "blog" */ '../views/Blog.vue')
  }
]
  1. 动态路由
    通过当前路由规则获取 或者 通过开启 props 获取, 建议通过props来解耦
// 路由规则
const routes = [
  {
    path: '/',
    name: 'Index',
    component: Index
  },
  {
    path: '/detail/:id',
    name: 'Detail',
    // 开启 props,会把 URL 中的参数传递给组件
    // 在组件中通过 props 来接收 URL 参数
    //  <!-- 方式2:路由规则中开启 props 传参 -->
    props: true,
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "detail" */ '../views/Detail.vue')
  }
]

// 页面
<template>
  <div>
    <!-- 方式1: 通过当前路由规则,获取数据 -->
    通过当前路由规则获取:{{ $route.params.id }}

    <br>
    <!-- 方式2:路由规则中开启 props 传参 -->
    通过开启 props 获取:{{ id }}
  </div>
</template>

<script>
export default {
  name: 'Detail',
  //  <!-- 方式2:路由规则中开启 props 传参 -->
  props: ['id']
}
</script>
<style>
</style>

3.嵌套路由

const routes = [
  {
    name: 'login',
    path: '/login',
    component: Login
  },
  // 嵌套路由
  {
    path: '/',
    component: Layout,
    children: [
      {
        name: 'index',
        // 外面的path 和 这里path拼接起来
        // 可以加/,也可以不加
        path: '',
        // 外面的Layout 和 这里Index拼接起来
        component: Index
      },
      {
        name: 'detail',
        path: 'detail/:id',
        props: true,
        component: () => import('@/views/Detail.vue')
      }
    ]
  }
]
  1. 路由跳转replace、push、go
<script>
export default {
  name: 'Index',
  methods: {
    replace () {
      // replace没有历史记录
      this.$router.replace('/login')
    },
    goDetail () {
      // 支持路由和name跳转
      // this.$router.push({ path: '/detail/1' })
      this.$router.push({ name: 'Detail', params: { id: 1 } })
    },
    go () {
      // 返回上面二层页面, 正数代表next, 负数代表previous
      this.$router.go(-2)
    }
  }
}
</script>

  1. hash VS History
  • hash 模式
    Vue Router 默认使用的是 hash 模式,使用 hash 来模拟一个完整的 URL,通过onhashchange 监听路径的变化。 有一个#号。
  • History 模式
    基于 History API ,没有#
// 改变地址栏,同时记录,但是不会跳转指定路径, IE10后支持
// 可以实现客户端路由
history.pushState() 
// 会发起服务端请求
history.replaceState() 
history.go()

需要开启 History 模式

const router = new VueRouter({ 
  // mode: 'hash', 
  mode: 'history', routes
})

History 需要服务器的支持
单页应用中,服务端不存在 http://www.testurl.com/login 这样的地址会返回找不到该页面
在服务端应该除了静态资源外都返回单页应用的 index.html

服务端开启history,刷新的时候。 其实是先给前端返回index页面,然后再跳转到对应login页面

路由基础实现

let _Vue = null
class JerryVueRouter {
    // 接收一个参数,也就是Vue类
    // Vue.use(你的插件)自动调用
    static install(Vue){
        console.log('Srs==>', Vue)
        //1 判断当前插件是否被安装
        if(JerryVueRouter.install.installed){
            return;
        }
        JerryVueRouter.install.installed = true
        //2 把Vue的构造函数记录在全局
        _Vue = Vue
        //3 把创建Vue的实例传入的router对象注入到Vue实例
        // _Vue.prototype.$router = this.$options.router
        _Vue.mixin({
            beforeCreate(){
                // 实例化为Vue 类时,会将 VueRouter 的实例传入,这个变量放在this.$options.router中
                // 判断是Vue实例才设置
                if(this.$options.router){
                    _Vue.prototype.$router = this.$options.router
                    
                }
            }
        })
    }
    constructor(options){
        // 包含路由规则
        this.options = options
        // 路由规则对下
        this.routeMap = {}
        // observable
        this.data = _Vue.observable({
            current:"/"
        })
        this.init()
    }
    init(){
        this.createRouteMap()
        this.initComponent(_Vue)
        this.initEvent()
    }
    createRouteMap(){
        //遍历所有的路由规则 吧路由规则解析成键值对的形式存储到routeMap中
        this.options.routes.forEach(route => {
            this.routeMap[route.path] = route.component
        });
    }
    initComponent(Vue){
        Vue.component("router-link",{
            props:{
                to:String
            },
            render(h){
                return h("a",{
                    attrs:{
                        href: this.to
                    },
                    on:{
                        click:this.clickhander
                    }
                }, [this.$slots.default])
            },
            methods:{
                // 重置点击事件, 默认会请求后台数据
                clickhander(e){
                    history.pushState({}, "", this.to)
                    // 响应事件,会重复view刷新
                    this.$router.data.current = this.to
                    e.preventDefault()
                }
            },
            // slot是插槽
            // 使用template需要完整版编译
            // 需要配置vue.config.js里面的runtimeCompiler
                // module.exports = {
                //     // 完整版view,默认是false。完整版带编译器,多10K
                //     runtimeCompiler: true
                // } 
            // template: "<a :href='to'><slot></slot><>"
        })
        const self = this
        Vue.component("router-view",{
            render(h){
                // self.data.current
                const cm = self.routeMap[self.data.current]
                return h(cm)
            }
        })
        
    }
    initEvent(){
        // 处理浏览器上返回 前进按钮
        window.addEventListener("popstate",()=>{
            this.data.current = window.location.pathname
        })
    }
}

export default JerryVueRouter
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容

  • 什么是路由 对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源; 对于单页面应用...
    wanminglei阅读 247评论 0 0
  • 路由 用 Vue.js + Vue Router 创建单页应用,是非常简单的。使用 Vue.js ,我们已经可以通...
    王蕾_fd49阅读 247评论 0 1
  • 路由可以分为前端路由和后端路由 后端路由: 概念:根据不同的用户url请求,返回不同的内容 本质:URL请求地址和...
    zhchhhemmm阅读 413评论 0 0
  • VUE能够利用理由进行单页面应用的开发我想是很多开发者选择它的一大原因。这都归功于vue-router的设计,让我...
    9d0edee7bcb0阅读 278评论 0 2
  • 后端路由:对于普通网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源;前端路由:对于单页面...
    哎呦呦胖子斌阅读 842评论 1 2