Vue Router 新手入门指南(1):路由怎么使用?

概念

我们要知道的是Vue是单页应用,整个项目只有一个html文件。在public目录下的index.html文件是整个项目中唯一的html文件。在vue中我们写的每一个页面其实都是一个html代码片段,通过特殊的手段实现每次只让一个代码片段生效,也就模拟成了多个html文件一样的效果。其实大概意思就是,比如说:

假设我们要实现三个页面home,detail和user的效果,那么我们把写好的它们三个的代码片段都放在一个html中,当我们要看到home页面的时候,我们就只让home的代码片段生效,另外的不生效,我们要去user页面的时候,就让user的代码片段生效其他的完全不显示。

那我们为什么要创建单页面应用,而不是多个页面就多个html文件来实现呢?举个例子:

掘金的每个页面都有这个导航栏头部,那这么多个页面,岂不是每个页面都要写一遍这个头部的代码,这样代码的复用性就会极低。

还有就是,如果是多页应用,你每去到一个新的页面,浏览器都要新开一个窗口,如果网络没那么好,每新到一个页面都要先空白一下才加载出来,其实这对用户的体验是非常不好的。而单页应用只有一个html,你去到其他页面不用新开窗口,当你看到一个页面的时候,其他页面的代码也是加载了的,只不过是不显示,那么你去到别的页面就不耗时,因为已经加载好了。

讲到这里,我们终于要进入正题了。我们说通过特殊的手段实现每次只让一个代码片段生效,这个特殊手段,就是今天的主角路由。

准备

首先我新建一个叫vue-router的vue项目,建好后就会生成这些文件:

然后右键vue-router打开它的终端,输入npm run serve命令将项目运行起来,Ctrl+单击 第一个地址:

我们就会在浏览器中看到src目录下的App.vue页面:

来到项目的最后一个文件vue.config.js中,把代码校验lintOnSave设为false,记得保存代码:

php 复制代码
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave: false
})

把创建这个项目给我们生成的一些展示性代码删掉:components目录下的HelloWorld.vue可以删掉,App.vue里面的内容全部删除,然后vb+回车快捷键(需要安装Vue VSCode Snippets插件)生成以下代码:

然后将style里的scss改成基础的css,给div中加个类名nav,再输入首页 沸点 课程,保存后就能在浏览器上看到页面变成了这样:

xml 复制代码
<template>
  <div>
    首页
    沸点
    课程
  </div>
</template>

<script>
  export default {

  }
</script>

<style lang="css" scoped>

</style>

如何使用路由

现在我们需要点击首页就能去到首页页面,点击沸点就能去到沸点页面,点击课程就能去到课程页面。我们首先要先创建这三个页面,在src中新建一个文件夹views,然后在views中新建文件Home.vue、Class.vue、Hot.vue:

此时我们还没给它配路由,其实它们还不算是页面,只能说是组件。在Home.vue中输入以下代码,其他两个类似,使用快捷键vb+回车的话要记得将style中的scss改成css:

xml 复制代码
<template>
    <div>
        home page
    </div>
</template>

<script>
    export default {

    }
</script>

<style lang="css" scoped>

</style>

现在我们在终端中Ctrl+c将项目终止,输入npm install vue-router@4指令安装路由,安装好后我们就能在和src目录同级的node_modules文件夹下找到我们刚刚安装的vue-router了:

路由怎么用呢?

我们先在src目录下新建文件夹router,在router中新建文件index.js。我们要在里面使用路由,我们就要先引入路由import {createRouter} from 'vue-router',然后创建一个空数组routes,再定义一个router等于createRouter()的执行结果,router就是路由的实例对象,在createRouter()中放一个对象,里面有routes和history两个属性,history属性的值为createWebHistory(),此时我们还要从vue-router中引入createWebHistory。要让这个路由实例能被别的地方使用,我们还要抛出它export default router

javascript 复制代码
import { createRouter,createWebHistory } from 'vue-router'

const routes = []

const router = createRouter({
    routes: routes,   // 右边的值routes为我们上面定义的数组routes
    history: createWebHistory()
})

export default router

抛出后要能被使用,还需要引入,我们来到与router同级的main.js文件下引入import router from './router/index.js',还要使用它.use(router),注意要放在mount之前:

javascript 复制代码
import { createApp } from 'vue'
import App from './App.vue'
import router from './router/index.js'

createApp(App).use(router).mount('#app')

现在我们写的这个路由文件就能生效了,接下来我们来配置路由。

来到router下的index.js文件。我们要把什么定义成页面就把什么引入进来,我们需要把views文件夹中的Home.vue定义成页面,那么就引入import Home from '../views/Home.vue',接下来配置它的路由,在routes数组中添加一个对象,放一个path,路径为'/home',再放一个component,值为Home,就是我们要引入进来的组件Home,其他两个页面类似:

javascript 复制代码
import {createRouter,createWebHistory} from 'vue-router'
import Home from '../views/Home.vue'


const routes = [
    {
        path:'/home',
        component:Home,
    },
    {
        path:'/hot',
        component:()=>import('../views/Hot.vue') // 另一种写法,无需在顶部引入
    },
    {
        path:'/class',
        component:()=>import('../views/Class.vue')
    }
]

const router = createRouter({
    routes,
    history:createWebHistory()
})

export default router

之后到App.vue文件中,添加一个路由路口<router-view></router-view>,所有配了路由的页面都会在该口子上展示:

我们在终端npm run serve将项目重新运行起来,在浏览器的地址栏手动加上我们之前给Home页面配置的路径'/home',回车后就能看到页面变成了这样,Home页面的内容在路由路口的位置展示出来了:

我们再给首页加上<router-link></router-link>标签,在标签里加to="/home"属性,其他两个类似:

xml 复制代码
<template>
  <div>
    <router-link to="/home">首页</router-link>
    <router-link to="/hot">沸点</router-link>
    <router-link to="/class">课程</router-link>
  </div>
  <!-- 路由路口 -->
  <router-view></router-view>

</template>

这一步完成后,我们到浏览器页面上就会发现,点击哪个,就会出现对应页面的内容:

现在的页面有点简陋,我们稍微加一点点样式:

xml 复制代码
<template>
  <div class="nav">
    <router-link to="/home">首页</router-link>
    <router-link to="/hot">沸点</router-link>
    <router-link to="/class">课程</router-link>
  </div>
  <!-- 路由路口 -->
  <div class="page">
    <router-view></router-view>
  </div>

</template>

<script>
  export default {

  }
</script>

<style lang="css" scoped>

.nav{
  width: 800px;
  background-color: #bfecc6;
  margin: 0 auto;
  font-size: 30px;
  padding: 10px 20px;

}
a{
  text-decoration: none;
  margin-right: 30px;
}
.page{
  width: 1000px;
  margin: 0 auto;
  background-color: #eaf8f2;
  height: 1000px;
  font-size: 24px;
  padding: 30px;
}
</style>

现在是这个效果:

二级路由

如果我们想要像掘金首页那样,到首页后还有推荐和最新两个页面可以切换,就要用到二级路由了。

首先创建这两个页面,在views中创建一个homeChild文件夹,在文件夹中创建Suggest.vue和Newest.vue文件,在Suggest文件中写以下代码,添加了一个列表,另外一个文件类似,内容可以你们自己定义:

xml 复制代码
<template>
    <div>
        <ul>
            <li>html</li>
            <li>css</li>
            <li>js</li>
        </ul>
    </div>
</template>

<script>
    export default {

    }
</script>

<style lang="css" scoped>

</style>

再去给他们配二级路由,到路由的配置文件index.js里,在配置Home页面路由的对象中加一个children属性,值为数组,在数组中配置这两个页面的路由:

javascript 复制代码
const routes = [
    {
        path:'/home',
        component:Home,
        children:[
            {
                path:'/home/suggest',
                component:()=>import('@/views/homeChild/Suggest.vue') // @表示src文件夹
            },
            {
                path:'newest',
                component:()=>import('@/views/homeChild/Newest.vue')
            }
        ]
    },
    {
        path:'/hot',
        component:()=>import('../views/Hot.vue')
    },
    {
        path:'/class',
        component:()=>import('../views/Class.vue')
    }
]

在Home.vue中添加路由入口和链接:

xml 复制代码
<template>
    <div class="home">
        <h2>这是首页</h2>
        <nav>
            <router-link to="/home/suggest">推荐</router-link>
            <router-link to="newest">最新</router-link>
        </nav>

        <router-view></router-view>


    </div>
</template>

<script>
    export default {

    }
</script>

<style lang="css" scoped>
nav a{
    margin-left:20px;
}
</style>

那么现在到浏览器上点击推荐,页面就会变成这个样子了:

现在还有个小问题就是,如果我点去了沸点,然后点回首页,这个时候是需要能让我们看到推荐的内容的,但现在的效果我们是看不到的,必须得我们手动点击推荐,推荐页面的内容才会出来。同样的,我们需要浏览器上一打开就能出现首页的内容,而不是光秃秃的只有一个导航栏,点击首页才出现首页的内容。有什么办法能帮我们解决这个问题吗?有,那就是重定向。

重定向

我们在配置路由的index.js中,加上以下重定向的代码就好啦:

javascript 复制代码
const routes = [
    {
      path:'/',
      redirect:'/home'  //重定向,默认到这个页面
    },
    {
        path:'/home',
        component:Home,
        children:[
            {
                path:'',
                redirect:'/home/suggest'//重定向 路径得写全
            },
            {
                path:'/home/suggest',
                component:()=>import('@/views/homeChild/Suggest.vue')
            },
            {
                path:'newest',
                component:()=>import('@/views/homeChild/Newest.vue')
            }
        ]
    },
    {
        path:'/hot',
        component:()=>import('../views/Hot.vue')
    },
    {
        path:'/class/:id',
        name:'class',
        component:()=>import('../views/Class.vue')
    }
]

现在就已经实现了我们想要的效果。

本文路由怎么使用的知识到这就讲完啦,欢迎下次再来一起学习ヾ(◍°∇°◍)ノ゙!!下篇将讲述路由跳转及如何携带参数。

相关推荐
李鸿耀18 小时前
仅用几行 CSS,实现优雅的渐变边框效果
前端
码事漫谈18 小时前
解决 Anki 启动器下载错误的完整指南
前端
im_AMBER18 小时前
Web 开发 27
前端·javascript·笔记·后端·学习·web
聪明的笨猪猪19 小时前
Java Redis “缓存设计”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
蓝胖子的多啦A梦19 小时前
低版本Chrome导致弹框无法滚动的解决方案
前端·css·html·chrome浏览器·版本不同造成问题·弹框页面无法滚动
玩代码19 小时前
vue项目安装chromedriver超时解决办法
前端·javascript·vue.js
訾博ZiBo19 小时前
React 状态管理中的循环更新陷阱与解决方案
前端
StarPrayers.19 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
聪明的笨猪猪19 小时前
Java Redis “运维”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
一壶浊酒..20 小时前
ajax局部更新
前端·ajax·okhttp