当前位置:首页 > 技术分析 > 正文内容

深入理解vue-router原理

ruisui884个月前 (01-12)技术分析29

说到vue-router就表明他只适合于vue和vue是强绑定的关系;不适合其他框架;

现在我们模仿实现一个VueRouter;

1.要使页面刷新;借助vue本身的响应式原理;

import Home from "./views/Home";
import About from "./views/About";
import Vue from "vue";   
class VueRouter{
    constructor(options){
        this.$options = options;
        this.routeMap = {}

        // 路由响应式 其实很重要的一部分是借助了 vue 的响应式原理 ; 强绑定 ; 必须用在vue上
        this.app = new Vue({
            data:{
                current:"/"
            }
        })
    }
}

VueRouter.install=function(Vue){
    //mixin 混入
    Vue.mixin({
        beforeCreate() {
            // this 是vue 实咧
            if(this.$options.router){  // 只在跟组件执行一次
                Vue.prototype.$router = this.$options.router;
                this.$options.router.init()
            }
        },
    }) 

}
Vue.use(VueRouter)
export default new VueRouter({
    routes: [{ path: "/", component: Home }, { path: "/about", component: About }]
})

2.执行上面的init函数;初始化

//这里主要三件事;监听url变化;解析路由配置;实现两个组件
init(){
        this.bindEvents() ; //监听url变化
        this.createRouteMap(this.$options) ; //解析路由配置
        this.initComponent() ; //实现两个组件 router-view  router-link
    }

3.监听url变化;更新数据

  bindEvents(){
        window.addEventListener('load',this.onHashChange.bind(this))
        window.addEventListener('hashchange',this.onHashChange.bind(this))
    }
    onHashChange(){
        this.app.current = window.location.hash.slice(1) || '/';  // #/about  ==> /about
    }

4.解析路由配置;

//这个好理解;就是把传进来的路由配置;解析成path-->component的key:value形式
createRouteMap(options){
        options.routes.forEach(item=>{
            this.routeMap[item.path] = item.component
        })
  }

5.实现router-link 和 router-view两个组件

 initComponent(){
        // router-view router-link
        Vue.component('router-link',{  
            props:{to:String},
            render(h) {
                // h => createElement  h(tag,data,children)
                return h('a',{attrs:{href:'#'+this.to}},[
                    this.$slots.default
                ])
            },
        });
        Vue.component('router-view',{     //这里没有解决路由嵌套的问题   // 全局的组件 任意data 的都会出发全局组件的跟新
            render:h=>{
                console.log(this.routeMap[this.app.current])
                const comp = this.routeMap[this.app.current]
                return h(comp)
            },
        })
    }

vue-router的hash模式主要就是监听了hashchange方法;改变当前的路径,再利用vue自身的响应式原理;来刷新视图;

vue-history模式;要服务器配合;访问进来是指向同一个html;代码上处理原理我想和hash应该类似;大家可以自己研究一下;


人到了一定的年龄,一定要懂得,把心情和脾气调成静音模式,然后不动声色打理自己,过好余生每一天。一路风雨兼程,只为遇见更好的自己,真正能够带你走出黑暗,能够给你带来改变的,就是你自己的内心自信,光明,有拯救自己的责任感动力

扫描二维码推送至手机访问。

版权声明:本文由ruisui88发布,如需转载请注明出处。

本文链接:http://www.ruisui88.com/post/227.html

标签: vue路由传值
分享给朋友:

“深入理解vue-router原理” 的相关文章

gitlab常用命令大全

GitLab常用命令大全GitLab是一个基于Git的Web平台,它不仅提供代码托管,还集成了持续集成/持续交付(CI/CD)、代码审查、问题追踪等功能。在日常使用GitLab的过程中,我们常常需要使用一系列命令来管理代码仓库、处理分支和标签等。以下是GitLab常用的Git命令大全,并附上详细解释...

「干货」FPGA设计中深度约束技巧及调试经验总结

今天跟大家分享的内容很重要,也是我们调试FPGA经验的总结。随着FPGA对时序和性能的要求越来越高,高频率、大位宽的设计越来越多。在调试这些FPGA样机时,需要从写代码时就要小心谨慎,否则写出来的代码可能无法满足时序要求。另外,最近跟网友聊天时,有谈到公众号寿命的问题,我觉得网络交换FPGA公众号应...

你感动了吗?佳能超规格镜头 RF 24-105mm F2.8深度测评

如果要你选一支用作多题材创作的挂机镜头,那我相信很多人会选择24-105mm这个焦段的镜头。作为一支可以实现从广角到长焦的变焦镜头,24-105mm有着丰富的焦段选择。只是基于镜头体积以及光学结构上的限制,此前的24-105mm镜头只能恒定在F4的光圈。而佳能打破了这一限制,将实用焦段和恒定光圈完美...

Python中的11 种数组算法

1. 创建数组 创建数组意味着留出一个连续的内存块来存储相同类型的元素。在大多数语言中,您可以在创建数组时指定数组的大小。假设您正在书架上整理一组书籍,并且您需要为正好 10 本书预留空间。功能架上的每个空间都对应于数组中的一个索引。# Example in Python arr = [1, 2,...

vue中router常见的三种传参方式

目录:我们在使用vue开发的过程中使用router跳转的时候肯定会遇到传参的情况;一般情况就三种传参是最常见的;那我们就来看看都有那几种传参方式吧!第一种:{ path: '/mall:id', name: 'Mall', component:...

一套代码,多端运行——使用Vue3开发兼容多平台的小程序

介绍Vue3发布已经有一段时间了,从目前来看,其生态还算可以,也已经有了各种组件库给予了支持,但是不管是Vue3还是Vue2都无法直接用来开发小程序,因此国内一些技术团队针对Vue开发了一些多端兼容运行的开发框架,今天来体验一下使用Taro来体验一下使用Vue3开发多平台运行的小程序,以便于兼容各大...