vue基础七

路由路径和组件的映射关系

单页面应用(SPA): 所有功能在一个html页面上实现

vue-router本质是一个第三方包

vue-router(vue2)版本使用步骤:

  1. 下载vue-router模块到当前工程
  2. 在main.js中引入VueRouter函数
  3. 添加到Vue.use()身上 – 注册全局RouterLink和RouterView组件
  4. 创建路由规则数组 – 路径和组件名对应关系
  5. 用规则生成路由对象
  6. 把路由对象注入到new Vue实例中
  7. 用router-view作为挂载点, 切换不同的路由页面
    import Vue from 'vue'
    import App from './App.vue'
    
    import Find from '@/views/Find'
    import My from '@/views/My'
    import Part from '@/views/Part'
    
    import VueRouter from 'vue-router'
    
    Vue.use(VueRouter)
    
    const routes = [
        {
            path: '/',
            redirect: '/find',
        },
        {
            path: '/find',
            name: 'find',
            component: Find,
        },
        {
            path: '/my',
            name: 'Mys',
            component: My,
        },
        {
            path: '/part',
            name: 'Part',
            component: Part,
        },
        {
            path: '/part/:username',
            component: Part,
        },
        // 最下面设置找不到页面的规则
        {
            path: '*',
            component: NotFind,
        },
    ]
    
    const router = new VueRouter({
        routes,
        // mode:'history'
    })
    
    Vue.config.productionTip = false
    new Vue({
        router,
        render: (h) => h(App),
    }).$mount('#app')
    

声明式导航用组件router-link来替代a标签

  1. vue-router提供了一个全局组件 router-link
  2. router-link实质上最终会渲染成a链接 to属性等价于提供 href属性(to无需#)
  3. router-link提供了声明式导航高亮的功能(自带类名)
    <template>
        <div>
            <div class="footer_wrap">
                <router-link to="/find">发现音乐</router-link>
                <router-link to="/my">我的音乐</router-link>
                <router-link to="/part">朋友</router-link>
            </div>
            <div class="top">
             <router-view></router-view>
            </div>
        </div>
    </template>

声明式导航 – 类名区别:

  • router-link-exact-active (精确匹配) url中hash值路径, 与href属性值完全相同, 设置此类名
  • router-link-active (模糊匹配) url中hash值, 包含href属性值这个路径

声明式导航 - 跳转传参:

  1. to="/path?参数名=值"(接收:$route.query.参数名)
  2. 路由规则path上定义 /path/:参数名;to="/path/值"(接收:$route.params.参数名)
    <template>
        <div>
            <div class="footer_wrap">
                <router-link to="/find">发现音乐</router-link>
                <router-link to="/my">我的音乐</router-link>
                <router-link to="/part?name=小红">朋友</router-link>
                 <router-link to="/part/小蓝">朋友</router-link>
            </div>
            <div class="top">
             <router-view></router-view>
            </div>
        </div>
    </template>
    ------------------------------------------------------------------
     <p>用户:{{$route.query.name}} {{$route.params.username}}</p>
    ------------------------------------------------------------------
        {
            path: '/part/:username',
            component: Part,
        },

路由 - 重定向:匹配path后, 强制跳转path路径

  • 网页打开url默认hash值是/路径
  • redirect是设置要重定向到哪个路由路径
    {
        path: '/',
        redirect: '/find',
    },
-----------------------------
    {
        path: '*',
        component: NotFind,
    },

路由 - 404:找不到路径给个提示页面

  • 路由最后, path匹配*(任意路径) – 前面不匹配就命中最后这个

全局前置守卫:路由跳转之前, 会触发一个函数

语法:router.beforeEach((to,from,next)=>{//路由跳转之前会先执行这里,决定是否跳转})

  • 参数1:要跳转到的路由(路由对象信息)目标
  • 参数2:从哪里跳转的路由(路由对象信息)来源
  • 参数3:函数体next()才会让路由正常跳转切换,next(false)在原地停留,next(强制跳转到另一个路由路径上)

注意:如果不调用next(),页面会留在原地

const isLogin = false
router.beforeEach((to, from, next) => {
    if (to.path == '/my' && isLogin == false) {
        alert('请登录')
        next(false)
    } else {
      next()
    }
})

路由 - 模式设置:修改路由在地址栏的模式

  • hash路由例如: http://localhost:8080/#/home
  • history路由例如: http://localhost:8080/home (以后上线需要服务器端支持, 否则找的是文件夹)
const router = new VueRouter({
    routes,
    // mode:'history'
})

路由 - 路由嵌套:现有的一级路由下, 再嵌套二级路由

  • 一级路由path从/开始定义
  • 二级路由往后path直接写名字, 无需/开头
  • 嵌套路由在上级路由的children数组里编写路由信息对象

步骤:

  1. 创建需要的二级页面组件
  2. 路由规则里children中配置二级路由规则对象
  3. 一级页面中设置router-view显示二级路由页面
    {
        path: '/find',
        name: 'find',
        component: Find,
        children: [
            { path: 'recommend', component: recommend },
            { path: 'ranking', component: ranking },
            { path: 'songlist', component: songlist },
        ],
    },

编程式导航用JS代码来进行跳转

语法:

  • this.$router.push({path:"路由路径"})
  • this.$router.push({name:"路由名"})

注意:虽然用name跳转,但是url的hash值还是切换path路径值

场景:方便修改:name路由名(在页面上看不见随便定义),path可以在url的hash值看到

编程式导航 -跳转传参:JS跳转路由, 传参

  • params(接收$route.params.参数名)
  • query(接收$route.query.参数名)

注意:

  • path会自动忽略params
  • 推荐name+query方式传参
  • 如果当前url上的hash值和?参数与你要跳转到的hash值和?参数一致,爆出冗余导航的问题,不会跳转路由。
<template>
    <div>
        <div class="footer_wrap">
            <span @click="fn('/find', 'find')">发现音乐</span>
            <span @click="fn('/my', 'Mys')">我的音乐</span>
            <span @click="onebtn">朋友</span>
            <span @click="twobtn">朋友</span>
        </div>
        <div class="top">
            <router-view></router-view>
        </div>
    </div>
</template>

<script>
export default {
    methods: {
        fn(gpath, pname) {
            this.$router.push({
                // path:gpath
                name: pname,
            })
        },
        onebtn() {
            this.$router.push({
                name: 'Part',
                params: {
                    username: '小红',
                },
            })
        },
        twobtn() {
            this.$router.push({
                name: 'Part',
                query: {
                    name: '小蓝',
                },
            })
        },
    },
}
</script>
//@input事件方法中可以使用$event事件对象,拿到value值
<a-input :value='inputValue' 
@input="changeInputValue($event.target.value)" placeholder="请输入任务" class="my_ipt" />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值