mini-vue-router

// 该文件是用户引入我自己创建的 mini-router ,进行各种配置
import Vue from "vue";
// 这是我自己创建的配置文件
// import VueRouter from 'vue-router'
import VueRouter from "../mini-router";
import Home from "../views/Home.vue";
import About from "../views/About.vue";

// Vue.use 就是执行了 VueRouter 的 install 方法
// use  方法就是把 Vue 自己作为参数传给了 VueRouter 使用,mini-router.js 那边的 VueRouter.install 接收 Vue 作为参数作为全局去使用。
Vue.use(VueRouter);

const routes = [
  {
    path: "/",
    name: "Home",
    component: Home,
  },
  {
    path: "/about",
    name: "About",
    component: About,
  },
  // {
  //   path: "/about",
  //   name: "About",
  //   component: () => import("../views/About.vue"),
  // },
];

const router = new VueRouter({
  mode: "history",
  base: process.env.BASE_URL,
  routes,
});

export default router;

// 我们自己的 vue-router

// 创建全局组件 router-link  router-view

// VueRouter 是一个类

// VueRouter 必须有一个 install 方法

// main.js 内引入了 router 那么所有组件内都有
// $router 指的是 VueRouter 类

let Vue;
class VueRouter {
  // 默认会创建一些方法
  constructor(options) {
    this.options = options;
    console.log(this.options);
    console.log(Vue);

    // 实例的时候就已经写好了
    this.initComponents();
  }
  // 制作一个路由表 {'/':Home}
  // 两个事件
  // 进入页面
  // 页面地址值变化
  // this.routeMap = this.options.routes

  // 创建全局的两个组件 <router-link> <router-view>
  initComponents() {
    Vue.component("router-link", {
      render(h) {
        const { to, tag } = this;
        return <tag href={to}>{this.$slots.default}</tag>;
      },
      props: {
        to: {
          type: String,
        },
        tag: {
          type: String,
          default: "a",
        },
      },
    });
    Vue.component("router-view", {
      render(h) {
        return null;
      },
    });
  }
}

// install 方法会接受 Vue 类作为参数,那么在这将 Vue 暴露出去,当全局来使用
VueRouter.install = (_Vue) => {
  Vue = _Vue;

  // 给 vue 组件做全局配置
  // 这个操作给 Vue 整个 类添加 $router 属性
  // Vue.prototype.$router = 用户创建的路由;
  // 当再次 new Vue 的时候里面也有了 $router 这个其实是不对的
  // 正确的方法应该使用 混入mixin 添加 $router 属性
  Vue.mixin({
    beforeCreate() {
      // 所有组件都触发了, 给所有组件(除了根组件) 添加 $router 属性
      // 只有根组件的 $options 内添加了 router 之后所有子组件才添加 $router 属性
      // console.log(this);
      // 在 main.js 中 new Vue 传递的参数其实可以使用组件 this.$options 获取
      // this 是根组件,他有个方法 $options,如果传入了 router,那么就开始对他进行一些操作。
      // 现在只要记住在根组件下判断有没有这个 router 路由,如果有就给它添加一些东西。
      // 如果使用 Vue.prototype.$router = VueRouter; 直接添加的话,可能造成一些污染,下次在创建东西的时候也会添加 VueRouter,造成不必要的,所以选用 Vue.mixin。

      if (!this.$options.router) {
        // console.log(this, "根组件");
        // 判断如果不是根组件的话就往下操作,现在是进入到了App组件,现在又判断根组件内是否有实例,有的话就把根组件的实例给现在的App组件。
        if (this.$parent.$options.router) {
          this.$router = this.$parent.$options.router;
        } else {
          // 现在不是 App 组件,是其他组件,然后判断现在的这个其他组件他的父组件有没有实例,有实例的话就这个其他组件他就加上实例组件
          if (this.$parent.$router) {
            this.$router = this.$parent.$router;
          }
        }
      }

      // 先判断根组件是否接收 router 接收的话
    },
  });
  // 创建全局的两个组件
  // Vue.component("router-link", {
  //   render: (h) => <a herf={this.to}>{this.$sslots.default}</a>,
  //   props: {
  //     to: {
  //       type: String,
  //     },
  //   },
  // });
};

export default VueRouter;

import Vue from 'vue'
import App from './App.vue'
import router from './router'

Vue.config.productionTip = false

// new Vue 创建一个 vue 实例,其实就是一个 vue 组件,这个组件就是根组件,是属于 vue 内所有组件的祖先,也就是其他组件 (App Home About) 都会继承该组件
// 
// new Vue 传递的参数其实可以使用组件 this.$options 获取
// 先明白 Vue 里面有 router 会对 Vue 产生什么影响,会改变什么 
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

// Vue.prototype.$router = VueRouter; 不使用,添加了也没有用
new Vue({
  router,
  render: h => h(App)
}).$mount('#app')




这里是引用

这里是引用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值