VUE框架CLI组件化配置Router路由局部守卫path和componet和router完整项目实现------VUE框架

<template>
    <div>
        <!-- 组件分为普通组件和路由组件 -->
        <div class="s2">
            <h2>县区</h2>
            <ul>
                <!-- query形式接收 -->
                <!-- <li>{{ $route.query.a1 }}</li>
                <li>{{ $route.query.a2 }}</li>
                <li>{{ $route.query.a3 }}</li> -->
                <!-- params形式接收 -->
                <li>{{ a1 }}</li>
                <li>{{ a2 }}</li>
                <li>{{ a3 }}</li>
                <!-- 遍历query的方式 -->
                <!-- <li v-for="propertyValue,propertyName in $route.query" :key="propertyName">{{ propertyValue }}</li> -->
                <!-- 遍历params的方式 -->
                <!-- <li v-for="propertyValue,propertyName in $route.params" :key="propertyName">{{ propertyValue }}</li> -->
            </ul>
        </div>
    </div>
</template>

<script>
export default {
    name : "City",
    // 因为我们的组件是通过路由唤醒的,因此路由会把这个配置props传递过来
    // 我们就可以在这里拿到props
    props : ['a1','a2','a3'],
    mounted(){
        // 所有的路由组件都有一个$route,通过这个属性可以获取到路由组件关联的路由对象
        console.log(this.$route);
        // 路由对象中有一个query属性,通过这个query属性可以接收到query方式传过来的数据
        console.log(this.$route.query);
        // 接收的params数据
        console.log(this.$route.params);
    },
    // 使用计算属性的方式
    computed : {
        params(){
            return this.$route.params;
        }
    },
    // 代码写在哪里局部路由守卫之component守卫,写到组件之中
    // 以下两个方法执行时机
    // 进入组件前
    // 只有路由组件才会触发
    beforeRouteEnter(to,from,next){
        console.log(`进入路由组件:${to.meta.title}`);
        next();
    },
    // 执行时机
    // 离开路由组件前
    beforeRouteLeave(to,from,next){
        console.log(`离开路由组件:${from.meta.title}`);
        next();
    }
}
</script>

<style>

</style>

<template>

    <div>

        <!-- 组件分为普通组件和路由组件 -->

        <div class="s2">

            <h2>县区</h2>

            <ul>

                <!-- query形式接收 -->

                <!-- <li>{{ $route.query.a1 }}</li>

                <li>{{ $route.query.a2 }}</li>

                <li>{{ $route.query.a3 }}</li> -->

                <!-- params形式接收 -->

                <li>{{ a1 }}</li>

                <li>{{ a2 }}</li>

                <li>{{ a3 }}</li>

                <!-- 遍历query的方式 -->

                <!-- <li v-for="propertyValue,propertyName in $route.query" :key="propertyName">{{ propertyValue }}</li> -->

                <!-- 遍历params的方式 -->

                <!-- <li v-for="propertyValue,propertyName in $route.params" :key="propertyName">{{ propertyValue }}</li> -->

            </ul>

        </div>

    </div>

</template>

<script>

export default {

    name : "City",

    // 因为我们的组件是通过路由唤醒的,因此路由会把这个配置props传递过来

    // 我们就可以在这里拿到props

    props : ['a1','a2','a3'],

    mounted(){

        // 所有的路由组件都有一个$route,通过这个属性可以获取到路由组件关联的路由对象

        console.log(this.$route);

        // 路由对象中有一个query属性,通过这个query属性可以接收到query方式传过来的数据

        console.log(this.$route.query);

        // 接收的params数据

        console.log(this.$route.params);

    },

    // 使用计算属性的方式

    computed : {

        params(){

            return this.$route.params;

        }

    },

    // 代码写在哪里局部路由守卫之component守卫,写到组件之中

    // 以下两个方法执行时机

    // 进入组件前

    // 只有路由组件才会触发

    beforeRouteEnter(to,from,next){

        console.log(`进入路由组件:${to.meta.title}`);

        next();

    },

    // 执行时机

    // 离开路由组件前

    beforeRouteLeave(to,from,next){

        console.log(`离开路由组件:${from.meta.title}`);

        next();

    }

}

</script>

<style>

</style>

// 导入vue-router对象
import VueRouter from "vue-router";
import Hebei from "../pages/hebei.vue";
import Henan from "../pages/henan.vue";
import City from "../pages/city.vue";
// 创建路由器对象(在这个路由器对象中配置路由)
const router = new VueRouter({
    // 在这里配置所有的路由规则
    routes : [
        // 这就是一个路由
        {
            // 路由由path和component组成
            // 这个看作key
            // 只要路径检测到的是/hebei就切换到这个组件
            path : "/hebei",
            // 这个就是路由的value,路由的value是一个组件
            component : Hebei,
            meta : {
                title : "河北省"
            },
            // children子路由
            children : [
                // 配置子路由
                {
                    // 对于子路由来说,path不用添加/,以/开始
                    // 系统会自动添加
                    // path : "/hebei/shijiazhuang",
                    name : "shi",
                    path : "sjz/:a1/:a2/:a3",
                    // :形式可以将后续的内容视为数据
                    component : City,
                    // 在路由中进行的配置
                    // props : {
                    //     x : 'Jack',
                    //     y : 'Rose'
                    // }
                    // props含有函数式写法
                    // props($route){
                    //     // 当前路由对象会被自动传递过来
                    //     // 将来取值时会自动调用函数
                    //     // 调用这个函数对象会获取到当前路由对象
                    //     return {
                    //         a1 : $route.params.a1,
                    //         a2 : $route.params.a2,
                    //         a3 : $route.params.a3
                    //     }
                    //     // 需要在方法最后返回对象
                    // }
                    // 这种方式只支持params方式的传参,不支持query方式
                    // 原理是将params直接内部转为props对象
                    props : true,
                    // 给路由对象添加自定义属性的话,需要在路由对象的meta路由源中定义
                    // 需要鉴权的属性
                    meta : {
                        isAuth : true,
                        title : "石家庄"
                    }
                },
                {
                    // 可以给路由起名字,用来防止过长导致path写一大串
                    name : "han",
                    // 数据是动态传过来的,我们只负责接收,所以两个子路由可以共享一个组件
                    path : "hd/:a1/:a2/:a3",
                    component : City,
                    // props($route){
                    //     return {
                    //         a1 : $route.params.a1,
                    //         a2 : $route.params.a2,
                    //         a3 : $route.params.a3
                    //     }
                    // }
                    props : true,
                    meta : {
                        isAuth : true,
                        title : "邯郸"
                    }
                }
            ]
        },
        {
            path : "/henan",
            component : Henan,
            meta : {
                title : '河南省'
            },
            // 这个局部路由守卫,写到route里面
            // beforeEnter本身就是一个函数,参数没有回调函数
            // 对于beforeEnter参数依旧是to from next
            // 这个这个路由之前会被调用这个钩子函数
            beforeEnter(to,from,next){
                let loginName = "Rose";
                if(loginName === "Jack"){
                    next();
                }
                else{
                    alert("无法访问");
                }
            }
        }
    ]
});

// 全局前置守卫,在暴露之前创建之后即可
// beforeEach中的callback什么时候被调用呢,在每一次切换任意路由组件之前
// callback没有要求,可以是普通函数也可以是箭头函数
// from是一个路由对象
// callback函数有三个参数,to from next
// from是一个路由对象有name,path,component等属性就是上面的路由对象,这里表示的是起点路由
// to表示往哪去,也是一个路由对象,表示到哪去
// next参数是一个函数,调用这个函数以后,表示放行
router.beforeEach((to,from,next) => {
    // 页面初始化的时候,from和to相同
    // 每一次切换路由组件都会执行
    let loginName = "Rose";
    // 目前需要鉴定权限的路由少,如果多会导致这里繁琐
    if(to.meta.isAuth){
        if(loginName === "Rose"){
            // 有权限才修改名字
            // document.title = to.meta.title;
            // 放行
            next();
        }
        else{
            alert("您没有权限");
        } 
    }
    else{
        // 有权限才修改名字
        // document.title = to.meta.title;
        // 放行
        next();
    }
});

// 全局后置路由首位
// 初始化执行一次,以后每次切换执行一次,以后每一次切换任意一个路由组件调用一次
// 这个回调函数只有to和from,没有放行用的next
router.afterEach((to,from) => {
    // 相对于前置修改方式,切换动作稍慢一点,但是代码复用率更高,不会造成大量冗余
    // 短路或,初始值为false就执行后半句
    // 如果前面为true不考虑后面,因为前面有值而不是undefined(被视为false)
    document.title = to.meta.title || "欢迎使用本系统";
});

// 导出路由器对象
export default router;

// 导入vue-router对象

import VueRouter from "vue-router";

import Hebei from "../pages/hebei.vue";

import Henan from "../pages/henan.vue";

import City from "../pages/city.vue";

// 创建路由器对象(在这个路由器对象中配置路由)

const router = new VueRouter({

    // 在这里配置所有的路由规则

    routes : [

        // 这就是一个路由

        {

            // 路由由path和component组成

            // 这个看作key

            // 只要路径检测到的是/hebei就切换到这个组件

            path : "/hebei",

            // 这个就是路由的value,路由的value是一个组件

            component : Hebei,

            meta : {

                title : "河北省"

            },

            // children子路由

            children : [

                // 配置子路由

                {

                    // 对于子路由来说,path不用添加/,以/开始

                    // 系统会自动添加

                    // path : "/hebei/shijiazhuang",

                    name : "shi",

                    path : "sjz/:a1/:a2/:a3",

                    // :形式可以将后续的内容视为数据

                    component : City,

                    // 在路由中进行的配置

                    // props : {

                    //     x : 'Jack',

                    //     y : 'Rose'

                    // }

                    // props含有函数式写法

                    // props($route){

                    //     // 当前路由对象会被自动传递过来

                    //     // 将来取值时会自动调用函数

                    //     // 调用这个函数对象会获取到当前路由对象

                    //     return {

                    //         a1 : $route.params.a1,

                    //         a2 : $route.params.a2,

                    //         a3 : $route.params.a3

                    //     }

                    //     // 需要在方法最后返回对象

                    // }

                    // 这种方式只支持params方式的传参,不支持query方式

                    // 原理是将params直接内部转为props对象

                    props : true,

                    // 给路由对象添加自定义属性的话,需要在路由对象的meta路由源中定义

                    // 需要鉴权的属性

                    meta : {

                        isAuth : true,

                        title : "石家庄"

                    }

                },

                {

                    // 可以给路由起名字,用来防止过长导致path写一大串

                    name : "han",

                    // 数据是动态传过来的,我们只负责接收,所以两个子路由可以共享一个组件

                    path : "hd/:a1/:a2/:a3",

                    component : City,

                    // props($route){

                    //     return {

                    //         a1 : $route.params.a1,

                    //         a2 : $route.params.a2,

                    //         a3 : $route.params.a3

                    //     }

                    // }

                    props : true,

                    meta : {

                        isAuth : true,

                        title : "邯郸"

                    }

                }

            ]

        },

        {

            path : "/henan",

            component : Henan,

            meta : {

                title : '河南省'

            },

            // 这个局部路由守卫,写到route里面

            // beforeEnter本身就是一个函数,参数没有回调函数

            // 对于beforeEnter参数依旧是to from next

            // 这个这个路由之前会被调用这个钩子函数

            beforeEnter(to,from,next){

                let loginName = "Rose";

                if(loginName === "Jack"){

                    next();

                }

                else{

                    alert("无法访问");

                }

            }

        }

    ]

});

// 全局前置守卫,在暴露之前创建之后即可

// beforeEach中的callback什么时候被调用呢,在每一次切换任意路由组件之前

// callback没有要求,可以是普通函数也可以是箭头函数

// from是一个路由对象

// callback函数有三个参数,to from next

// from是一个路由对象有name,path,component等属性就是上面的路由对象,这里表示的是起点路由

// to表示往哪去,也是一个路由对象,表示到哪去

// next参数是一个函数,调用这个函数以后,表示放行

router.beforeEach((to,from,next) => {

    // 页面初始化的时候,from和to相同

    // 每一次切换路由组件都会执行

    let loginName = "Rose";

    // 目前需要鉴定权限的路由少,如果多会导致这里繁琐

    if(to.meta.isAuth){

        if(loginName === "Rose"){

            // 有权限才修改名字

            // document.title = to.meta.title;

            // 放行

            next();

        }

        else{

            alert("您没有权限");

        }

    }

    else{

        // 有权限才修改名字

        // document.title = to.meta.title;

        // 放行

        next();

    }

});

// 全局后置路由首位

// 初始化执行一次,以后每次切换执行一次,以后每一次切换任意一个路由组件调用一次

// 这个回调函数只有to和from,没有放行用的next

router.afterEach((to,from) => {

    // 相对于前置修改方式,切换动作稍慢一点,但是代码复用率更高,不会造成大量冗余

    // 短路或,初始值为false就执行后半句

    // 如果前面为true不考虑后面,因为前面有值而不是undefined(被视为false)

    document.title = to.meta.title || "欢迎使用本系统";

});

// 导出路由器对象

export default router;

<template>
    <h1>路由与路由器</h1>
</template>

<script>
export default {
    name : "MyHeader"
}
</script>

<style>

</style>

<template>

    <h1>路由与路由器</h1>

</template>

<script>

export default {

    name : "MyHeader"

}

</script>

<style>

</style>

// 这句话就等同于我们写的<script src="vue.js">
// 这就是在引入vue
import Vue from 'vue';
// 然后下一步是导入我们的根组件
import App from './App.vue';
// 导入混入
import {mix1} from './mixin.js';
import {mix2} from './mixin.js';
import {mix3} from './mixin.js';
// 导入插件
import {p1} from './plugins';
import VueResource from 'vue-resource';
// 导入Vue-Router插件
import VueRouter from 'vue-router';
// 导入路由器对象
import router from "./router/index.js"
// 导入vuex对象
import store from "./vuex/store.js"

//全局混入
Vue.mixin(mix1);
Vue.mixin(mix2);
Vue.mixin(mix3);

// 插件的使用通常放在创建Vue对象之前
// 插上插件
Vue.use(p1,1,2,3,4);
// 使用这个插件后,所有的vm和vc都会多一个叫$http的属性
Vue.use(VueResource);
// 一旦使用了这个插件那么创建vue对象的时候就可以传递一个配置项router
// router对象用来接收一个路由器对象
Vue.use(VueRouter);

// 这是关闭生产提示信息
Vue.config.productionTip = false

// 创建一个共享的VueComponent构造函数
// const VueComponentConstructor = Vue.extend({});
// 创建一个共享的VC对象
// const globalvc = new VueComponentConstructor();


// 创建VUE实例对象VM
const vm = new Vue({
  // 配置路由器配置
  router : router,
  // 增加了一个全新的配置项,store
  store : store,
  // 加上这个配置项之后,vm及其所有的vc对象上都会有这个属性$store
  // 以后vm和vc的$store都可以获取到这个store对象
  // 删除render函数就会导致报错
  // 因为没有可用的模板翻译器
  // 使用完整的vue.js或使用render函数才能解决这个问题
  // 为什么采用模板编译器的Vue.js放到脚手架呢?
  // 目的是减小体积,VUE.js包括两类,核心和模板编译器
  // 模板编译器可能占用vue.js体积的三分之一
  // 将来打包的时候,模板编译器没有存在的必要了
  // 体积大就会影响速度
  // render函数被自动调用,且会自动传过来一个参数
  // 这个参数是一个函数,createElement是一个函数
  // 这个函数可以用来创建元素
  // 用这个来创建元素就可以省掉我们的vue模板编译器了
  // render(createElement)
  // {
  //   return createElement(App);
  // }
  // 简写就是这个箭头函数
  render: h => h(App),
  // 利用生命周期机制,在对象创建时把我们的vm作为这个对象
  beforeCreate(){
    Vue.prototype.$bus = this;
  }
}).$mount('#app');
// 这里用的是$mount的方式绑定和el的方式是一样的

console.log(vm);

// 这句话就等同于我们写的<script src="vue.js">

// 这就是在引入vue

import Vue from 'vue';

// 然后下一步是导入我们的根组件

import App from './App.vue';

// 导入混入

import {mix1} from './mixin.js';

import {mix2} from './mixin.js';

import {mix3} from './mixin.js';

// 导入插件

import {p1} from './plugins';

import VueResource from 'vue-resource';

// 导入Vue-Router插件

import VueRouter from 'vue-router';

// 导入路由器对象

import router from "./router/index.js"

// 导入vuex对象

import store from "./vuex/store.js"

//全局混入

Vue.mixin(mix1);

Vue.mixin(mix2);

Vue.mixin(mix3);

// 插件的使用通常放在创建Vue对象之前

// 插上插件

Vue.use(p1,1,2,3,4);

// 使用这个插件后,所有的vm和vc都会多一个叫$http的属性

Vue.use(VueResource);

// 一旦使用了这个插件那么创建vue对象的时候就可以传递一个配置项router

// router对象用来接收一个路由器对象

Vue.use(VueRouter);

// 这是关闭生产提示信息

Vue.config.productionTip = false

// 创建一个共享的VueComponent构造函数

// const VueComponentConstructor = Vue.extend({});

// 创建一个共享的VC对象

// const globalvc = new VueComponentConstructor();


 

// 创建VUE实例对象VM

const vm = new Vue({

  // 配置路由器配置

  router : router,

  // 增加了一个全新的配置项,store

  store : store,

  // 加上这个配置项之后,vm及其所有的vc对象上都会有这个属性$store

  // 以后vm和vc的$store都可以获取到这个store对象

  // 删除render函数就会导致报错

  // 因为没有可用的模板翻译器

  // 使用完整的vue.js或使用render函数才能解决这个问题

  // 为什么采用模板编译器的Vue.js放到脚手架呢?

  // 目的是减小体积,VUE.js包括两类,核心和模板编译器

  // 模板编译器可能占用vue.js体积的三分之一

  // 将来打包的时候,模板编译器没有存在的必要了

  // 体积大就会影响速度

  // render函数被自动调用,且会自动传过来一个参数

  // 这个参数是一个函数,createElement是一个函数

  // 这个函数可以用来创建元素

  // 用这个来创建元素就可以省掉我们的vue模板编译器了

  // render(createElement)

  // {

  //   return createElement(App);

  // }

  // 简写就是这个箭头函数

  render: h => h(App),

  // 利用生命周期机制,在对象创建时把我们的vm作为这个对象

  beforeCreate(){

    Vue.prototype.$bus = this;

  }

}).$mount('#app');

// 这里用的是$mount的方式绑定和el的方式是一样的

console.log(vm);

<template>
    <div>
        <MyHeader></MyHeader>
        <div>
            <!-- 因此对于我们普通的组件来说一共有九个回调函数 -->
            <!-- 八个生命周期和nextTick() -->
            <!-- nextTick在dom下一次渲染的时候执行 -->
            <!-- 路由组件还要多两个分别是激活和未激活两个钩子函数 -->
            <h1>省份</h1>
            <!-- 在默认的情况下,我们切换组件会导致原组件被销毁 -->
            <button @click="forward()">前进</button>
            <button @click="back()">后退</button>
            <button @click="forwardTwo()">前进2步</button>
            <button @click="backTwo()">后退2步</button>
            <ul>
                <!-- 如果使用的是路由方式,就不能使用a标签超链接了 -->
                <!-- 需要使用vue-router提供的标签router-link -->
                <!-- <li><a href="/hebei">河北省</a></li> -->
                <!-- <li><a href="/henan" class="selected">河南省</a></li> -->
                <!-- router-link将来会被自动编译为a标签 -->
                <!-- active-class点中激活,点中的时候激活这个样式 -->
                <li><router-link to="/hebei" active-class="selected">河北省</router-link></li>
                <li><router-link to="/henan" active-class="selected">河南省</router-link></li>
            </ul>
        </div>
        <!-- 路由视图,起到一个占位的作用 -->
        <!-- <keep-alive>
            这个标签下所有的组件在组件切换的时候都不会被杀死
            这个标签下所有的组件切换都不会遭到销毁
            <router-view></router-view>
        </keep-alive> -->
        <!-- <keep-alive include="Hebei"> -->
        <keep-alive :include="['Hebei','Henan']">
            <!-- 这样两个组件就都可以保持了 -->
            <!-- 把组件的配置的name属性下的名字放到这里可以保证这个组件切换不被杀死 -->
            <!-- 这个组件不会被销毁,会保留状态 -->
            <!-- 如果需要保持多个组件的状态则应该给予一个数组 -->
            <router-view></router-view>
        </keep-alive>
    </div>
</template>

<script>
import MyHeader from "./components/MyHeader";
export default {
    name : "App",
    components : {MyHeader},
    methods : {
        forward(){
            this.$router.forward();
        },
        back(){
            this.$router.back();
        },
        forwardTwo(){
            this.$router.go(2);
        },
        backTwo(){
            this.$router.go(-2);
        }
    }
}
</script>

<style>
    .s1{
        margin-left: 100px;
    }
    .s2{
        margin-left: 100px;
    }
    .selected{
        background-color: aqua;
    }
</style>

<template>

    <div>

        <MyHeader></MyHeader>

        <div>

            <!-- 因此对于我们普通的组件来说一共有九个回调函数 -->

            <!-- 八个生命周期和nextTick() -->

            <!-- nextTick在dom下一次渲染的时候执行 -->

            <!-- 路由组件还要多两个分别是激活和未激活两个钩子函数 -->

            <h1>省份</h1>

            <!-- 在默认的情况下,我们切换组件会导致原组件被销毁 -->

            <button @click="forward()">前进</button>

            <button @click="back()">后退</button>

            <button @click="forwardTwo()">前进2步</button>

            <button @click="backTwo()">后退2步</button>

            <ul>

                <!-- 如果使用的是路由方式,就不能使用a标签超链接了 -->

                <!-- 需要使用vue-router提供的标签router-link -->

                <!-- <li><a href="/hebei">河北省</a></li> -->

                <!-- <li><a href="/henan" class="selected">河南省</a></li> -->

                <!-- router-link将来会被自动编译为a标签 -->

                <!-- active-class点中激活,点中的时候激活这个样式 -->

                <li><router-link to="/hebei" active-class="selected">河北省</router-link></li>

                <li><router-link to="/henan" active-class="selected">河南省</router-link></li>

            </ul>

        </div>

        <!-- 路由视图,起到一个占位的作用 -->

        <!-- <keep-alive>

            这个标签下所有的组件在组件切换的时候都不会被杀死

            这个标签下所有的组件切换都不会遭到销毁

            <router-view></router-view>

        </keep-alive> -->

        <!-- <keep-alive include="Hebei"> -->

        <keep-alive :include="['Hebei','Henan']">

            <!-- 这样两个组件就都可以保持了 -->

            <!-- 把组件的配置的name属性下的名字放到这里可以保证这个组件切换不被杀死 -->

            <!-- 这个组件不会被销毁,会保留状态 -->

            <!-- 如果需要保持多个组件的状态则应该给予一个数组 -->

            <router-view></router-view>

        </keep-alive>

    </div>

</template>

<script>

import MyHeader from "./components/MyHeader";

export default {

    name : "App",

    components : {MyHeader},

    methods : {

        forward(){

            this.$router.forward();

        },

        back(){

            this.$router.back();

        },

        forwardTwo(){

            this.$router.go(2);

        },

        backTwo(){

            this.$router.go(-2);

        }

    }

}

</script>

<style>

    .s1{

        margin-left: 100px;

    }

    .s2{

        margin-left: 100px;

    }

    .selected{

        background-color: aqua;

    }

</style>

<template>
    <div>
        <!-- 组件分为普通组件和路由组件 -->
        <div class="s1">
            <!-- 栈数据结构 -->
            <!-- stack栈一种数据结构,当我们的元素进入称为入栈,或压栈push -->
            <!-- 进入的第一个元素在栈底部的我们称之为栈底元素 -->
            <!-- 默认情况下,栈当中是一个指针的,这个指针在默认情况下指向栈顶元素 -->
            <!-- 每次有新的元素入栈后,栈的指针都会自动向上移动指向栈顶的那个元素 --> 
            <!-- 栈顶元素先出栈,出栈,弹栈pop -->
            <!-- 栈数据结构特点,遵循先进后出,后进先出原则 -->
            <h2>市区</h2>
            <ul>
                <li>洛阳</li>
                <li>开封</li>
                <li>安阳</li>
                <li>郑州</li>
            </ul>
            <!-- 浏览器的历史记录就是存在栈这种数据结构里面的 -->
            <!-- 历史记录存放到栈有两种不同的模式 -->
            <!-- 第一种,push模式 -->
            <!-- 以追加的方式入栈 -->
            <!-- 第二种,replace模式 -->
            <!-- 以替换栈顶元素的方式入栈 -->
            <!-- 浏览器默认的模式是push模式 -->
            <!-- 操作浏览器上的前进后退并不会删除栈当中的历史记录,只是向前和向后移动指针 -->
            <!-- 只是移动了指针指向的元素 -->
            <!-- 栈内的元素没有发生变化,变化的只有指针位置 -->
        </div>
        <router-view></router-view>
    </div>
</template>

<script>
export default {
    name : "Henan",
    beforeDestroy(){
        console.log("啊,组件去世了!")
    },
}
</script>

<style>

</style>

<template>

    <div>

        <!-- 组件分为普通组件和路由组件 -->

        <div class="s1">

            <!-- 栈数据结构 -->

            <!-- stack栈一种数据结构,当我们的元素进入称为入栈,或压栈push -->

            <!-- 进入的第一个元素在栈底部的我们称之为栈底元素 -->

            <!-- 默认情况下,栈当中是一个指针的,这个指针在默认情况下指向栈顶元素 -->

            <!-- 每次有新的元素入栈后,栈的指针都会自动向上移动指向栈顶的那个元素 -->

            <!-- 栈顶元素先出栈,出栈,弹栈pop -->

            <!-- 栈数据结构特点,遵循先进后出,后进先出原则 -->

            <h2>市区</h2>

            <ul>

                <li>洛阳</li>

                <li>开封</li>

                <li>安阳</li>

                <li>郑州</li>

            </ul>

            <!-- 浏览器的历史记录就是存在栈这种数据结构里面的 -->

            <!-- 历史记录存放到栈有两种不同的模式 -->

            <!-- 第一种,push模式 -->

            <!-- 以追加的方式入栈 -->

            <!-- 第二种,replace模式 -->

            <!-- 以替换栈顶元素的方式入栈 -->

            <!-- 浏览器默认的模式是push模式 -->

            <!-- 操作浏览器上的前进后退并不会删除栈当中的历史记录,只是向前和向后移动指针 -->

            <!-- 只是移动了指针指向的元素 -->

            <!-- 栈内的元素没有发生变化,变化的只有指针位置 -->

        </div>

        <router-view></router-view>

    </div>

</template>

<script>

export default {

    name : "Henan",

    beforeDestroy(){

        console.log("啊,组件去世了!")

    },

}

</script>

<style>

</style>

<template>
    <div>
        <!-- 组件分为普通组件和路由组件 -->
        <div class="s1">
            <!-- router-link被称为声明式的路由导航,只适合超链接一种形式 -->
            <h2>市区</h2>
            <ul>
                <!-- 写死信息方式传递 -->
                <!-- <li><router-link to="/hebei/city?a1=新华区&a2=裕华区&a3=长安区" active-class="selected">石家庄</router-link></li>
                <li><router-link to="/hebei/city?a1=邯山区&a2=丛台区&a3=复兴区" active-class="selected">邯郸</router-link></li> -->
                <!-- 动态拼接字符串形式传递 -->
                <!-- <li><router-link :to="`/hebei/city?a1=${sjz[0]}&a2=${sjz[1]}&a3=${sjz[2]}`" active-class="selected">石家庄</router-link></li>
                <li><router-link :to="`/hebei/city?a1=${hd[0]}&a2=${hd[1]}&a3=${hd[2]}`" active-class="selected">邯郸</router-link></li> -->
                <!-- <li>
                    // 对象形式传参实现
                    <router-link active-class="selected" :to="{
                        // name的形式不支持字符串拼接,只支持对象形式
                        // 因为子组件有了名字,就可以写名字而不是path地址嵌套了
                        name : 'shi',
                        // path : '/hebei/sjz',
                        query : {
                            a1 : sjz[0],
                            a2 : sjz[1],
                            a3 : sjz[2]
                        }
                    }">石家庄
                    </router-link>
                </li> -->
                <!-- 写死的形式 -->
                <!-- <li>
                    <router-link active-class="selected" to="/hebei/sjz/裕华区/新华区/长安区">
                    石家庄
                    </router-link>
                </li> -->
                <!-- 拼接的形式 -->
                <!-- <li>
                    <router-link active-class="selected" :to="`/hebei/sjz/${sjz[0]}/${sjz[1]}/${sjz[2]}`">
                    石家庄
                    </router-link>
                </li> -->
                <!-- 对象形式params传参 -->
                <li><input type="checkbox"/>
                    <!-- 当我们在router-link中设置replace=true的时候,就可以开启replace模式 -->
                    <!-- 实际上是push加replace模式 -->
                    <!-- 这个带有replace标签的route-link会替代栈顶部的标签元素 -->
                    <router-link :replace="true" active-class="selected" :to="{
                        // params形式传参,不能有path
                        // 这里只能使用name 
                        // path : '/hebei/sjz',
                        name : 'shi',
                        params : {
                            a1 : sjz[0],
                            a2 : sjz[1],
                            a3 : sjz[2]
                        }
                    }">
                    石家庄
                    </router-link>
                    <button @click="goSjz()">石家庄</button>
                </li>
                <!-- <li>
                    <router-link active-class="selected" :to="{
                        // 全都用名字来代替
                        name : 'han',
                        // path : '/hebei/hd',
                        query : {
                            a1 : hd[0],
                            a2 : hd[1],
                            a3 : hd[2]
                        }
                    }">邯郸
                    </router-link>
                </li> -->
                <!-- 字符串拼接形式 -->
                <!-- <li>
                    <router-link active-class="selected" to="/hebei/hd/邯山区/丛台区/复兴区">邯郸
                    </router-link>
                </li> -->
                <!-- params字符串拼接方式实现 -->
                <!-- <li>
                    <router-link active-class="selected" :to="`/hebei/hd/${hd[0]}/${hd[1]}/${hd[2]}`">邯郸
                    </router-link>
                </li> -->
                <!-- params对象形式实现 -->
                <li><input type="checkbox"/>
                    <router-link replace active-class="selected" :to="{
                        name : 'han',
                        params : {
                            a1 : hd[0],
                            a2 : hd[1],
                            a3 : hd[2]
                        }
                    }">邯郸
                    </router-link>
                    <button @click="goHD()">邯郸</button>
                </li>
                <li><input type="checkbox"/>保定</li>
                <li><input type="checkbox"/>唐山</li>
            </ul>
        </div>
        <!-- 区组件 -->
        <router-view></router-view>
    </div>
</template>

<script>
export default {
    name : "Hebei",
    data(){
        return {
            sjz : ["新华区","裕华区","长安区"],
            hd : ["邯山区","丛台区","复兴区"]
        }
    },
    mounted(){
        // 挂载完毕之后
        // 创建一个定时器
        // this.timer = setInterval(() => {
        //     console.log("我是一个定时器");
        // },1000);
    },
    // 只有路由组件才有这两个钩子函数
    activated(){
        console.log("我激活了");
        // 创建一个定时器
        this.timer = setInterval(() => {
            console.log("我是一个定时器");
        },1000);
    },
    deactivated(){
        console.log("我被切换走了");
        // 删除定时器
        clearInterval(this.timer);
    },
    beforeDestroy(){
        console.log("啊,组件去世了!");
        // 删除定时器
        // clearInterval(this.timer);
    },
    methods : {
        goSjz(){
            // 在这里编写代码完成组件的切换
            // 这种通过编程的方式完成组件切换被称为:编程式路由导航
            // 调用现有的api就可以完成路由组件的切换
            // 首先我们需要获取路由器对象,不是路由对象this.$route是路由对象
            // this.$router这样就可以获取到共享的路由器对象,一般一个项目只有一个
            this.$router.push({
                // params形式传参,不能有path
                // 这里只能使用name 
                // path : '/hebei/sjz',
                name : 'shi',
                params : {
                    a1 : this.sjz[0],
                    a2 : this.sjz[1],
                    a3 : this.sjz[2]
                }
                // 正常来说需要编写这两个函数,一个是成功一个是失败
            },() => {},() => {});
        },
        goHD(){
            // 这个为replace模式
            // 同级的我们考虑使用replace切换
            this.$router.replace({
                name : 'han',
                // 在我们使用编程式的路由导航的时候
                // push或者promise会返回一个Promise对象
                // Promise对象期望你能通过参数的方式给它两个回调函数,一个是成功的回调函数
                // 一个是失败的回调函数
                // 如果没有给出这两个回调函数,则会爆出这个错误
                // 在参数上给出两个回调函数即可
                params : {
                    a1 : this.hd[0],
                    a2 : this.hd[1],
                    a3 : this.hd[2]
                }
            },() => {},() => {});
        }
    }
}
</script>

<style>

</style>

<template>

    <div>

        <!-- 组件分为普通组件和路由组件 -->

        <div class="s1">

            <!-- router-link被称为声明式的路由导航,只适合超链接一种形式 -->

            <h2>市区</h2>

            <ul>

                <!-- 写死信息方式传递 -->

                <!-- <li><router-link to="/hebei/city?a1=新华区&a2=裕华区&a3=长安区" active-class="selected">石家庄</router-link></li>

                <li><router-link to="/hebei/city?a1=邯山区&a2=丛台区&a3=复兴区" active-class="selected">邯郸</router-link></li> -->

                <!-- 动态拼接字符串形式传递 -->

                <!-- <li><router-link :to="`/hebei/city?a1=${sjz[0]}&a2=${sjz[1]}&a3=${sjz[2]}`" active-class="selected">石家庄</router-link></li>

                <li><router-link :to="`/hebei/city?a1=${hd[0]}&a2=${hd[1]}&a3=${hd[2]}`" active-class="selected">邯郸</router-link></li> -->

                <!-- <li>

                    // 对象形式传参实现

                    <router-link active-class="selected" :to="{

                        // name的形式不支持字符串拼接,只支持对象形式

                        // 因为子组件有了名字,就可以写名字而不是path地址嵌套了

                        name : 'shi',

                        // path : '/hebei/sjz',

                        query : {

                            a1 : sjz[0],

                            a2 : sjz[1],

                            a3 : sjz[2]

                        }

                    }">石家庄

                    </router-link>

                </li> -->

                <!-- 写死的形式 -->

                <!-- <li>

                    <router-link active-class="selected" to="/hebei/sjz/裕华区/新华区/长安区">

                    石家庄

                    </router-link>

                </li> -->

                <!-- 拼接的形式 -->

                <!-- <li>

                    <router-link active-class="selected" :to="`/hebei/sjz/${sjz[0]}/${sjz[1]}/${sjz[2]}`">

                    石家庄

                    </router-link>

                </li> -->

                <!-- 对象形式params传参 -->

                <li><input type="checkbox"/>

                    <!-- 当我们在router-link中设置replace=true的时候,就可以开启replace模式 -->

                    <!-- 实际上是push加replace模式 -->

                    <!-- 这个带有replace标签的route-link会替代栈顶部的标签元素 -->

                    <router-link :replace="true" active-class="selected" :to="{

                        // params形式传参,不能有path

                        // 这里只能使用name

                        // path : '/hebei/sjz',

                        name : 'shi',

                        params : {

                            a1 : sjz[0],

                            a2 : sjz[1],

                            a3 : sjz[2]

                        }

                    }">

                    石家庄

                    </router-link>

                    <button @click="goSjz()">石家庄</button>

                </li>

                <!-- <li>

                    <router-link active-class="selected" :to="{

                        // 全都用名字来代替

                        name : 'han',

                        // path : '/hebei/hd',

                        query : {

                            a1 : hd[0],

                            a2 : hd[1],

                            a3 : hd[2]

                        }

                    }">邯郸

                    </router-link>

                </li> -->

                <!-- 字符串拼接形式 -->

                <!-- <li>

                    <router-link active-class="selected" to="/hebei/hd/邯山区/丛台区/复兴区">邯郸

                    </router-link>

                </li> -->

                <!-- params字符串拼接方式实现 -->

                <!-- <li>

                    <router-link active-class="selected" :to="`/hebei/hd/${hd[0]}/${hd[1]}/${hd[2]}`">邯郸

                    </router-link>

                </li> -->

                <!-- params对象形式实现 -->

                <li><input type="checkbox"/>

                    <router-link replace active-class="selected" :to="{

                        name : 'han',

                        params : {

                            a1 : hd[0],

                            a2 : hd[1],

                            a3 : hd[2]

                        }

                    }">邯郸

                    </router-link>

                    <button @click="goHD()">邯郸</button>

                </li>

                <li><input type="checkbox"/>保定</li>

                <li><input type="checkbox"/>唐山</li>

            </ul>

        </div>

        <!-- 区组件 -->

        <router-view></router-view>

    </div>

</template>

<script>

export default {

    name : "Hebei",

    data(){

        return {

            sjz : ["新华区","裕华区","长安区"],

            hd : ["邯山区","丛台区","复兴区"]

        }

    },

    mounted(){

        // 挂载完毕之后

        // 创建一个定时器

        // this.timer = setInterval(() => {

        //     console.log("我是一个定时器");

        // },1000);

    },

    // 只有路由组件才有这两个钩子函数

    activated(){

        console.log("我激活了");

        // 创建一个定时器

        this.timer = setInterval(() => {

            console.log("我是一个定时器");

        },1000);

    },

    deactivated(){

        console.log("我被切换走了");

        // 删除定时器

        clearInterval(this.timer);

    },

    beforeDestroy(){

        console.log("啊,组件去世了!");

        // 删除定时器

        // clearInterval(this.timer);

    },

    methods : {

        goSjz(){

            // 在这里编写代码完成组件的切换

            // 这种通过编程的方式完成组件切换被称为:编程式路由导航

            // 调用现有的api就可以完成路由组件的切换

            // 首先我们需要获取路由器对象,不是路由对象this.$route是路由对象

            // this.$router这样就可以获取到共享的路由器对象,一般一个项目只有一个

            this.$router.push({

                // params形式传参,不能有path

                // 这里只能使用name

                // path : '/hebei/sjz',

                name : 'shi',

                params : {

                    a1 : this.sjz[0],

                    a2 : this.sjz[1],

                    a3 : this.sjz[2]

                }

                // 正常来说需要编写这两个函数,一个是成功一个是失败

            },() => {},() => {});

        },

        goHD(){

            // 这个为replace模式

            // 同级的我们考虑使用replace切换

            this.$router.replace({

                name : 'han',

                // 在我们使用编程式的路由导航的时候

                // push或者promise会返回一个Promise对象

                // Promise对象期望你能通过参数的方式给它两个回调函数,一个是成功的回调函数

                // 一个是失败的回调函数

                // 如果没有给出这两个回调函数,则会爆出这个错误

                // 在参数上给出两个回调函数即可

                params : {

                    a1 : this.hd[0],

                    a2 : this.hd[1],

                    a3 : this.hd[2]

                }

            },() => {},() => {});

        }

    }

}

</script>

<style>

</style>

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值