• Vue基础(八)——路由


    1、之前讲解的所有的功能都是在一个页面中完成的;

    2、真正的web应用一定是有多个页面的,这就需要路由

    一、创建template项目

    1、创建template项目

     

    按下【空格键】,勾选Router。

     

     

    剩下全部默认。 

    2、创建成功,查看项目目录,发现多了两个文件夹:router、views。

    (1)views文件夹里面定义了页面

     

    components和views的区别:

    整体的页面放在views,小的组件放在component。

    (2)router目录下有index.js文件,这里面会定义整体路由跳转的方式。

    1. import Vue from 'vue'
    2. import VueRouter from 'vue-router'
    3. import HomeView from '../views/HomeView.vue'
    4. Vue.use(VueRouter)
    5. const routes = [
    6. {
    7. path: '/',
    8. name: 'home',
    9. component: HomeView
    10. },
    11. {
    12. path: '/about',
    13. name: 'about',
    14. // route level code-splitting
    15. // this generates a separate chunk (about.[hash].js) for this route
    16. // which is lazy-loaded when the route is visited.
    17. component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
    18. }
    19. ]
    20. const router = new VueRouter({
    21. mode: 'history',
    22. base: process.env.BASE_URL,
    23. routes
    24. })
    25. export default router

    3、查看页面:

    (1)App.Vue:

    1. <template>
    2. <div id="app">
    3. <nav>
    4. <router-link to="/">Homerouter-link> |
    5. <router-link to="/about">Aboutrouter-link>
    6. nav>
    7. <router-view/>
    8. div>
    9. template>

    (2) 页面

    当前页为首页,点击about会跳转到about页面。 

     

     

      

    两个链接是【router-link】标签。

    点击链接,通过【to】属性,跳转到对应的url。

    然后再通过router文件,找到url对应的组件。

    把组件从【router-view】标签的位置显示出来。

    二、简易博客系统

    1、App.vue

    1. <template>
    2. <div id="app">
    3. <nav>
    4. <router-link to="/">首页router-link> |
    5. <router-link to="/blog">博客router-link> |
    6. <router-link to="/video">视频router-link>
    7. <span v-if="showUser"> || 欢迎:{{username}}
    8. <button @click="logout">注销button>
    9. span>
    10. nav>
    11. <router-view />
    12. div>
    13. template>
    14. <script>
    15. export default {
    16. data() {
    17. return {
    18. username: localStorage.getItem("usr"),
    19. showUser: localStorage.getItem("usr"),
    20. };
    21. },
    22. watch: {
    23. //路由发生变化时,执行函数
    24. //这样就不用手动刷新才显示登录名了
    25. "$route.path": function () {
    26. this.username = localStorage.getItem("usr");
    27. this.showUser = localStorage.getItem("usr");
    28. },
    29. },
    30. methods: {
    31. logout() {
    32. localStorage.clear();
    33. this.$router.push("/login");
    34. },
    35. },
    36. };
    37. script>

    2、index.js:

    1. import Vue from 'vue'
    2. import VueRouter from 'vue-router'
    3. import HomeView from '../views/HomeView.vue'
    4. import Blog from "../views/BlogView.vue"
    5. import Video from "../views/VideoView.vue"
    6. import Login from "../views/LoginView.vue"
    7. Vue.use(VueRouter)
    8. const routes = [{
    9. path: '/',
    10. name: 'home',
    11. component: HomeView
    12. }, {
    13. path: '/blog',
    14. name: 'Blog',
    15. component: Blog
    16. }, {
    17. path: '/video',
    18. name: 'Video',
    19. component: Video
    20. }, {
    21. path: '/login',
    22. name: 'Login',
    23. component: Login
    24. }]
    25. const router = new VueRouter({
    26. mode: 'history',
    27. base: process.env.BASE_URL,
    28. routes
    29. })
    30. //导航守卫
    31. router.beforeEach((to, from, next) => {
    32. //跳转到非登录页时
    33. if (to.path != "/login") {
    34. //如果有值,不拦截
    35. if (localStorage.getItem("usr")) {
    36. next();
    37. } else {
    38. //重定向到登录页
    39. next("/login")
    40. }
    41. } else {
    42. //跳转到登录页时,不拦截
    43. next();
    44. }
    45. })
    46. export default router

    3、首页:

    1. <template>
    2. <div class="home">
    3. <h1>首页h1>
    4. div>
    5. template>
    6. <script>
    7. export default {
    8. }
    9. script>

    4、博客页:

    1. <template>
    2. <div>
    3. <h1>博客h1>
    4. <ul>
    5. <li>
    6. <router-link to="">JavaScript教程router-link>
    7. li>
    8. <li>
    9. <router-link to="">Python教程router-link>
    10. li>
    11. <li>
    12. <router-link to="">Vue教程router-link>
    13. li>
    14. ul>
    15. div>
    16. template>

    5、视频页:

    1. <template>
    2. <div>
    3. <video src="" controls>video>
    4. div>
    5. template>

    6、登录页:

    1. <template>
    2. <div>
    3. <form @submit.prevent="doLogin">
    4. <input type="text" v-model="username">
    5. <input type="text">
    6. <button>登录button>
    7. form>
    8. div>
    9. template>
    10. <script>
    11. export default {
    12. data() {
    13. return {
    14. username: "",
    15. };
    16. },
    17. methods: {
    18. doLogin() {
    19. //本地存储
    20. localStorage.setItem("usr", this.username);
    21. //路由跳转,Vue的路由提供了一个编程式导航的功能
    22. this.$router.push("/");
    23. },
    24. },
    25. };
    26. script>

    7、效果: 

    (1)没登录时,无法跳转到首页、博客页、视频页:

    关键代码:

    1. //导航守卫
    2. router.beforeEach((to, from, next) => {
    3. //跳转到非登录页时
    4. if (to.path != "/login") {
    5. //如果有值,不拦截
    6. if (localStorage.getItem("usr")) {
    7. next();
    8. } else {
    9. //重定向到登录页
    10. next("/login")
    11. }
    12. } else {
    13. //跳转到登录页时,不拦截
    14. next();
    15. }
    16. })

    (2)登录成功,显示用户名,并且跳转到首页:

    关键代码:

    1. <span v-if="showUser"> || 欢迎:{{username}}
    2. <button @click="logout">注销button>
    3. span>
    4. <script>
    5. export default {
    6. data() {
    7. return {
    8. username: localStorage.getItem("usr"),
    9. showUser: localStorage.getItem("usr"),
    10. };
    11. },
    12. watch: {
    13. //路由发生变化时,执行函数
    14. //这样就不用手动刷新才显示登录名了
    15. "$route.path": function () {
    16. this.username = localStorage.getItem("usr");
    17. this.showUser = localStorage.getItem("usr");
    18. },
    19. },
    20. };
    21. script>

    路由跳转:【$router.push("")】 

    1. doLogin() {
    2. //本地存储
    3. localStorage.setItem("usr", this.username);
    4. //路由跳转,Vue的路由提供了一个编程式导航的功能
    5. this.$router.push("/");
    6. },

    (3)点击注销,返回到登录页:

    关键代码:

    1. logout() {
    2. localStorage.clear();
    3. this.$router.push("/login");
    4. },

    8、项目目录: 

  • 相关阅读:
    【深度学习前沿应用】文本分类Fine-Tunning
    图解LeetCode——面试题 01.08. 零矩阵(难度:中等)
    asp.net网站的建立及运行
    MySQL -- 复合查询及内外连接
    大家有没有觉得学机械的人很可怕?
    如何在数据库中存储小数:FLOAT、DECIMAL还是BIGINT?
    【数据科学】Scikit-learn[Scikit-learn、加载数据、训练集与测试集数据、创建模型、模型拟合、拟合数据与模型、评估模型性能、模型调整]
    应用程序处理:TCP模块的处理
    钉钉打卡作弊软件非法获利近 500 万元,CEO 被判刑 5 年 6 个月
    Nginx | nginx配置https
  • 原文地址:https://blog.csdn.net/qq_41523175/article/details/126637196