Vue-- 实现简单版 vue-router

实现简单版vue-router3

前置知识:

      1、vue 插件机制 :

               vue.use(arg)  arg可以是一个函数和对象,需要有一个install方法,如果是函数(没有install方法),则直接执行该函数。install 方法第一个参数是 Vue 构造函数

思路(以hash为例)

        1、监听hash值改变,触发 router-view 更新

        2、如何在每个router-view 中拿到 当前地址和组件的对应关系,以及如何在hash值改变时自          动更新(本文思路是将 routeOptions 挂载在Vue实例上)     

注:

     Vue.util.defineReactive(this, 'current', init) 

    此方法是为了实现current响应式,只有current是响应式数据, router-view 里面的 render 函数才会随着数据变化而变化(当路由变化的时候this.current 改变) 

let Vue
class VueRouter {constructor(options) {console.log(options)let init = '/'// Vue.util.defineReactive(this, 'current', window.location.hash.slice(1))Vue.util.defineReactive(this, 'current', init)  // 实现响应式this.current = '/'  // 当前路径this.routes = options.routes || []this.mode = options.mode || 'hash' // 路由模式 hash 或者 historythis.init()}init() {if (this.mode === 'hash') {location.hash = '/'// 项目第一次加载window.addEventListener('load', () => {this.current = location.hash.slice(1)})window.addEventListener('hashchange', () => {this.current = location.hash.slice(1)})}}}// install 居然在 constructor 先执行
VueRouter.install = function (_Vue) {console.log(_Vue)Vue = _Vue// 给调用组件添加一个属性routerVue.mixin({  // 每一个组件都会执行 beforeCreate 方法beforeCreate() {if (this.$options.router) { // 只有根实例才有 router 属性console.log('jbjbjb----->')Vue.prototype.$router = this.$options.router}}})// 全局组件// 创建全局组件 router-link Vue.component('router-link', {props: {to: { // router-link 的to 属性type: String,}},render(h) {console.log('router-link---->', this.to)return h('a', { attrs: { href: '#' + this.to } }, this.$slots.default)}})// 创建全局组件 router-view Vue.component('router-view', {render(h) { // 只有响应式数据变化才会 出发 render 方法console.log('router-view---->', this.$router)const current = this.$router.currentconst routes = this.$router.routeslet com = routes.find((item) => {return item.path === current})return h(com.component)}})
}export default VueRouter;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/744635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux进程状态

目录 1.R运行状态(running) 2.S睡眠状态(sleep) 3.T或t状态(stopped 或 tracing stop) 4.Z状态(zombie)(僵尸进程) 1.R运行状态(running&…

exec 和 xargs 命令的用法区别,优缺点

exec 和 xargs 都是用于执行命令的工具,但它们有不同的特点、用法和优缺点。 exec 命令特点和用法: 特点: exec 命令是由 find 命令提供的一个选项,它允许在 find 命令查找到的文件上执行指定的命令。exec 将对 find 查找到的每一…

通过Spring Boot 实现页面配置生成动态接口?

流程介绍 在Spring Boot中实现页面配置生成动态接口通常涉及几个关键步骤: 设计页面配置:首先,你需要设计一个用户界面(UI),允许用户通过此界面来配置接口的各种参数,例如HTTP方法(GET、POST等)、URL路径、请求参数、响应数据格式等。保存配置信息:当用户通过页面配置…

Self-supervised Contextual Keyword and Keyphrase Retrieval with Self-Labelling

文章目录 题目摘要方法数据集实验 题目 通过自我标记进行自我监督的上下文关键字和关键词短语检索 论文地址:https://www.preprints.org/manuscript/201908.0073/v1 项目地址:https://github.com/naister/Keyword-OpenSource-Data 摘要 在本文中&#x…

2023 年江苏省职业院校技能大赛(中职)网络搭建与应用赛项公开赛卷——技能要求

2023 年江苏省职业院校技能大赛(中职)网络搭建与应用赛项公开赛卷——技能要求 2023 年江苏省职业院校技能大赛(中职) 网络搭建与应用赛项公开赛卷——技能要求 竞赛说明 1. 竞赛内容分布 “网络搭建与应用”竞赛共分五个部…

反向传播 — 简单解释

一、说明 关于反向传播,我有一个精雕细刻的案例计划,但是实现了一半,目前没有顾得上继续充实,就拿论文的叙述这里先起个头,我后面将修改和促进此文的表述质量。 二、生物神经元 大脑是一个由大约100亿个神经元组成的复…

寄存器(内存访问)

文章目录 寄存器(内存访问)1 内存中字的存储2 DS和[address]3 字的传送4 mov、add、sub指令5 数据段6 栈7 CPU提供的栈机制8 栈顶超界的问题9 push、pop指令10 栈段 寄存器(内存访问) 1 内存中字的存储 CPU中,用16位寄…

css的严格模式和混杂模式区别?

在网页开发中,CSS 的严格模式(也称为标准模式)和混杂模式(也称为怪异模式或兼容模式)是两种不同的渲染模式,它们影响了浏览器对网页的解析和渲染方式,下面是它们之间的主要区别: 严格…

pycharm安装配置运行py代码与命令行运行

命令行(winr cmd python) 三个小箭头表示可以运行py代码 什么是解释器 文字翻译二进制 你对电脑说 我爱你 电脑不知道什么意思 你对电脑说 111001101000100010010001 111001111000100010110001 111001001011110110100000 电脑便知道了你爱它 那么如何给计算机说这些二进制串…

C++中的STL-string类

文章目录 一、为什么学习string类?1.1 C语言中的字符串 二、准库中的string类2.2 string类2.3 string类的常用接口说明2.4 string类对象的容量操作2.5 string类对象的访问及遍历操作2.5 string类对象的修改操作2.7 string类非成员函数2.8 模拟实现string 一、为什么…

字节飞书前端实习面试

属于是被字节狠狠地拷打了。面试官人很好,让人感觉有很沉稳的感觉。问了一大堆关于底层的问题,属于是把我整麻了。 项目部分问的不多,主要问的都是一些前端涉及的底层知识,层层递进。 1.vue3的响应式是如何实现的 2.computed和watch是什么,有什么应用场景 3.盒子模型 4.BF…

富文本配置渲染场景问题杂谈

背景 可视化页面搭建场景,需要支持配置富文本内容并在页面中渲染,富文本编辑器SDK采用了tinymce/tinymce-react。 问题场景 问题1 :文本数据转义 富文本编辑器生成的HTML富文本在服务端存储时会对字符串进行转义,比如&#xf…

配置服务器自启动极简方式 /etc/rc.d/rc.local

配置服务器自启动有三种方式,本文采用极简方式 1. 修改 脚本 /etc/rc.d/rc.local 设置启动应用的脚本 vim /etc/rc.d/rc.local --追加以下内容 /home/init.sh >> /var/log/my_init.log 2>&1 &exit 0 脚本注释:命令中 2>&…

css选择器nth-last-child(n)的学习理解

上一节我们介绍了:nth-child(n)的使用,这一节我们来介绍一下:nth-last-child(n) :nth-last-child(n):此选择器和nth-child(n)类似都是选择其父元素的第 n 个子元素,唯一的区别在于它是从父元素的子元素末尾开始往前数,一直到第一个…

多项式回归算法模拟

python3.6 环境 import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures# 生成随机数作为x变量,范围在-5到5之间,共100个样本 x np.random.un…

深度学习训练GPU显卡选型攻略

‍‍🏡博客主页: virobotics(仪酷智能):LabVIEW深度学习、人工智能博主 📑上期文章:『仪酷LabVIEW OD实战(5)——Object DetectionTensorRT工具包快速实现yolo目标检测』 🍻本文由virobotics(仪酷智能)原创…

Web框架开发-web框架

一、web框架 web框架(web framwork)是一种开发框架,用来支持动态网站,网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式,也为web行为提供了一套通用的方法。web框架已经实现了很多功能&…

51单片机的万年历闹钟及温度补偿

撰写一篇基于51单片机的万年历闹钟及温度补偿的论文,你需要按照学术论文的标准格式和结构来组织内容。以下是一个大致的论文框架和内容建议: 基于51单片机的万年历闹钟及温度补偿系统设计与实现 摘要: 简要介绍论文的研究背景、目的、方法、…

C++特性之一:继承

1. 派生类的成员变量、成员函数、构造、析构 2. 继承的切片 3. 重定义/隐藏 重定义/隐藏:派生类和基类有同名的成员,就叫隐藏。派生类的成员隐藏了基类的成员。 隐藏时可以通过类作用限定符来访问被隐藏的成员。 class Person { public:void Print(){…

代码学习记录19

随想录日记part19 t i m e : time: time: 2024.03.14 主要内容:今天的主要内容是二叉树的第七部分,主要涉及修剪二叉搜索树 ;将有序数组转换为二叉搜索树;把二叉搜索树转换为累加树。 669. 修剪…