• vue -- 路由精讲制作导航 -- 从无到有


    1.搭建脚手架

     因为全局安装vue-cli 脚手架,在之前就已经安装好了。所以我们直接在桌面的projects文件夹下创建新项目。

    在命令行输入:vue init webpack-simple pizza-app     然后cd pizza-app,  安装cnpm,最后运行。

    然后创建所需要的文件夹如下:

     

    2.制作导航

    1.来到   https://v4.bootcss.com    Bootstrap中文文档,将BootstrapCDN css 部分拷贝一份。把拷贝的 link 部分粘贴到 index.html 代码中。

    注意:

    加载bootstrap css 跨域问题

    使用这个<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css">,不用官网的。

    index.html 代码

     1 <!DOCTYPE html>
     2 <html lang="en">
     3   <head>
     4     <meta charset="utf-8">
     5     <title>pizza-app</title>
     6     <link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/4.0.0/css/bootstrap.min.css" 
            integrity
    ="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> 7 </head> 8 <body> 9 <div id="app"></div> 10 <script src="/dist/build.js"></script> 11 </body> 12 </html>

     2.在Header.vue文件中写入如下代码

     Header.vue代码

     1 <template>
     2     <header>
     3         <nav class="navbar navbar-expand-lg navbar-light bg-light">
     4             <a class="py-2" href="#">
     5               <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" 
              stroke-linecap
    ="round" stroke-linejoin="round" class="d-block mx-auto"><circle cx="12" cy="12" r="10"></circle><line x1="14.31" y1="8"
              x2
    ="20.05" y2="17.94"></line><line x1="9.69" y1="8" x2="21.17" y2="8"></line><line x1="7.38" y1="12" x2="13.12" y2="2.06"></line><line x1="9.69"
              y1
    ="16" x2="3.95" y2="6.06"></line><line x1="14.31" y1="16" x2="2.83" y2="16"></line><line x1="16.62" y1="12" x2="10.88" y2="21.94"></line></svg> 6 </a> 7 <a href="/" class="navbar-brand">Pizza点餐系统</a> 8 9 <ul class="navbar-nav"> 10 <li class="nav-item active"> 11 <a class="nav-link" href="#">主页</a> 12 </li> 13 <li class="nav-item active"> 14 <a class="nav-link" href="#">菜单</a> 15 </li> 16 <li class="nav-item active"> 17 <a class="nav-link" href="#">管理</a> 18 </li> 19 <li class="nav-item active"> 20 <a class="nav-link" href="#">关于我们</a> 21 </li> 22 </ul> 23 24 <ul class="navbar-nav ml-auto"> 25 <li class="nav-item active"> 26 <a class="nav-link" href="#">登录</a> 27 </li> 28 <li class="nav-item active"> 29 <a class="nav-link" href="#">注册</a> 30 </li> 31 </ul> 32 </nav> 33 </header> 34 </template>

    代码中"登录  注册" 的  ul 标签添加了一个类  ”ml-auto" ,表示  margin-left auto, 就会实现这一块内容在页面的最右侧。

    其中<nav>标签里面的class 是这样引入的。  来到   https://v4.bootcss.com    Bootstrap中文文档,点击  “快速入门” ,点击 “Components"  ,点击 "Navbar" . 找到这么个玩意,

    里面的nav 标签的class就是我们所需要的。  <nav class="navbar navbar-expand-lg navbar-light bg-light"> 这样导航栏的背景就有了。

    其中svg的矢量图是这样引入的。来到   https://v4.bootcss.com    Bootstrap中文文档。 点击 “ 实例” ,点击 “product".   会看到这个玩意

    我们查看网页源代码,把含有svg矢量图的<a>标签拷贝下来,这样svg矢量图就有了。

    3. 导航的样式已经写完了。接下来需要把子组件Header.vue和父组件App.vue相关联

    App.vue代码

     1 <template>
     2   <div id="app">
     3     <div class="container">
     4       <app-header></app-header>
     5     </div>
     6   </div>
     7 </template>
     8 
     9 <script>
    10 import Header from './components/Header.vue';
    11 export default {
    12   components:{
    13     //"app-header":Header
    14     appHeader:Header
    15   }
    16 }
    17 </script>
    18 
    19 <style>
    20 
    21 </style>

    其中components里面注册组件,有两种写法:1.  es6驼峰写法, 不需要引号   appHeader:Header   ;  2.  常规写法 ,需要引号 "app-header":Header

     4. 路由跳转准备工作

    在About.vue   Admin.vue 等等文件里面添加代码<template>  <h1>  about  </h1>   </template>,红色的部分任意改。  

    这部分就是为了下面代码中   点击按钮,实现跳转有页面显示而已。

    5.路由跳转

    安装路由,在IDE的Terminal中输入这句话: npm install vue-router --save-dev 来安装。

    配置路由,使用路由首先要在main.js当中进行设置,通过 import VueRouter from 'vue-router' 将我们的路由模块先引进来,然后在下面通过 Vue.use(VueRouter) 使用一下引用进来的模块。

    具体代码如下:

     main.js代码

     1 import Vue from 'vue'
     2 import VueRouter from 'vue-router'                         //引进路由
     3 import App from './App.vue'
     4 import Home from './components/Home.vue'                   //引入Home组件
     5 import Menu from './components/Menu.vue'                   //引入Menu组件
     6 import Admin from './components/Admin.vue'
     7 import About from './components/about/About.vue'
     8 import Login from './components/Login.vue'
     9 import Register from './components/Register.vue'
    10 
    11 
    12 
    13 Vue.use(VueRouter)                                     //使用路由
    14 
    15 const routes = [                                       //定义数组routes,里面包含许多对象
    16     {path:'/',component:Home},                         // 斜杠代表根路径  ”component:Home“ 表示点击 "主页" 的时候会展示Home组件的内容
    17     {path:'/menu',component:Menu},                     //跳转到Menu组件
    18     {path:'/admin',component:Admin},
    19     {path:'/about',component: About},
    20     {path:'/login',component:Login},
    21     {path:'/register',component:Register},
    22 ]
    23 
    24 const router = new VueRouter({                       //实例化router,然后把定义的数组routes放进去
    25     routes,
    26     mode:'history'                                   //去除地址栏的 '#' 
    27 })
    28 
    29 new Vue({
    30   el: '#app',
    31   router,                                         //Vue实例中使用router 
    32   render: h => h(App)
    33 })

      

    路由配置完毕后,实现跳转代码,在Header.vue中,如果使用 <a href=""></a> 标签,点击时候会跳转和刷新页面,而使用路由 <router-link to=""></router-link> 则不会,to跟a标签里的href是一样的.

     然后把<router-link to=""></router-link> 里面   to =" 这里填入前面配置好的path路径,比如:跳转到Home组件就是     ’ / ‘ ,跳转到Menu组件就是  ’ / menu‘    "  .

    最后在App.vue父组件中写入 <div class="container">   <router-view></router-view>   </div> ,        <router-view></router-view>表示你点击了哪个组件,哪个组件就会到这里来。

    6.路由跳转小细节

    a.    <router-link to=""></router-link> ,     router-link 在dom元素中默认为  a 标签,添加   tag 属性可以改为其他标签形式。比如  <router-link  tag="div"   to=""></router-link> 就改为div标签。

    b.   <router-link to=""></router-link> ,       to  可以绑定一个动态的路由地址。  具体代码实现如下:

     1 <template>
     2     <header>
     3             <ul class="navbar-nav">
     4                 <li class="nav-item active">
     5                    <router-link class="nav-link" :to="homeLink">主页</router-link>     //  :to="homeLink" ,使用冒号to去绑定一个变量 
     6                 </li>
     7             </ul>        
     8     </header>
     9 </template>
    10 
    11 <script>
    12     export default{
    13         data(){
    14             return{
    15                 homeLink:'/'          //设置属性替换内容,使用变量替换  '/' 
    16             }
    17         }
    18     }
    19 </script>

     c.  没有找到的路由,引导到主页面去。   比如用户想进入  http://localhost:8080/menu 这个menu菜单去,却打成了这样http://localhost:8080/muuuu,   那么会什么都没有。具体代码解决如下:

    在main.js中多加一个路由      {path:'*',redirect:'/'}    也就是 重定向

     

    3. 路由精讲之name属性及跳转方法

    前面路由跳转小细节中  <router-link to=""></router-link> ,       to  可以绑定一个动态的路由地址,也就是给to绑定一个属性,

    比如::to="homeLink",也就是给 to 起了一个动态的名字。但是上面跳转方法还要为  动态的名字 在 script标签里面 设置替换的内容。这样就很繁琐。

    我们可以直接在 main.js 路由中 使用 name属性 来定义一个名字。然后在 Header.vue 中 用to 绑定该名字,代码如下:

    main.js 代码

     1 import Vue from 'vue'
     2 import VueRouter from 'vue-router'
     3 import App from './App.vue'
     4 import Home from './components/Home.vue'
     5 import Menu from './components/Menu.vue'
     6 import Admin from './components/Admin.vue'
     7 import About from './components/about/About.vue'
     8 import Login from './components/Login.vue'
     9 import Register from './components/Register.vue'
    10 
    11 
    12 
    13 Vue.use(VueRouter)
    14 
    15 const routes = [
    16     {path:'/',      name:'homeLink',   component:Home},
    17     {path:'/menu',  name:'menuLink',   component:Menu},
    18     {path:'/admin', name:'adminLink',  component:Admin},
    19     {path:'/about', name:'aboutLink' , component: About},
    20     {path:'/login', name:'loginLink',  component:Login},
    21     {path:'/register', name:'registerLink', component:Register},
    22     {path:'*',redirect:'/'},
    23 ]
    24 
    25 const router = new VueRouter({
    26     routes,
    27     mode:'history'
    28 })
    29 
    30 new Vue({
    31   el: '#app',
    32   router,
    33   render: h => h(App)
    34 })

    Header.vue代码

     1 <template>
     2     <header>
     3         <nav class="navbar navbar-expand-lg navbar-light bg-light">
     4             <a class="py-2" href="#">
     5               <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="d-block mx-auto"><circle cx="12" cy="12" r="10"></circle><line x1="14.31" y1="8" x2="20.05" y2="17.94"></line><line x1="9.69" y1="8" x2="21.17" y2="8"></line><line x1="7.38" y1="12" x2="13.12" y2="2.06"></line><line x1="9.69" y1="16" x2="3.95" y2="6.06"></line><line x1="14.31" y1="16" x2="2.83" y2="16"></line><line x1="16.62" y1="12" x2="10.88" y2="21.94"></line></svg>
     6             </a>
     7             <a href="/" class="navbar-brand">Pizza点餐系统</a>
     8             
     9             <ul class="navbar-nav">
    10                 <!-- 方法一: -->
    11                 <!-- <li class="nav-item active">
    12                    <router-link class="nav-link" to="/">主页</router-link>
    13                 </li> -->
    14                 
    15                 <!-- 方法二: -->
    16                 <!-- <li class="nav-item active">
    17                    <router-link class="nav-link" :to=" homeLink">主页</router-link>
    18                 </li> -->
    19                 
    20                 <!-- 方法三: -->
    21                 <li class="nav-item active">
    22                    <router-link class="nav-link" :to="{name:'homeLink'}">主页</router-link>   ///to = "一个对象" ,并绑定该对象的names属性的值homeLink
    23                 </li>
    24                 <li class="nav-item active">
    25                    <router-link class="nav-link" :to="{name:'menuLink'}">菜单</router-link>
    26                 </li>
    27                 <li class="nav-item active">
    28                    <router-link class="nav-link" :to="{name:'adminLink'}">管理</router-link>
    29                 </li>
    30                 <li class="nav-item active">
    31                    <router-link class="nav-link" :to="{name:'aboutLink'}">关于我们</router-link>
    32                 </li>
    33             </ul>
    34             
    35             <ul class="navbar-nav ml-auto">
    36                 <li class="nav-item active">
    37                    <router-link class="nav-link" :to="{name:'loginLink'}">登录</router-link>
    38                 </li>
    39                 <li class="nav-item active">
    40                    <router-link class="nav-link" :to="{name:'registerLink'}">注册</router-link>
    41                 </li> 
    42             </ul>
    43         </nav>    
    44     </header>
    45 </template>
    46 
    47 <!-- <script>
    48      export default{
    49          data(){
    50              return{
    51                  homeLink:'/'          //设置属性替换内容,使用变量替换  '/' 
    52              }
    53          }
    54      }
    55 </script> -->

    下面讲解不同的方法进行路由的跳转。

    首先在Home.vue中写如下代码

     1 <template>
     2     <div>
     3         <h1>Home</h1>
     4         <button @click="goToMenu" class="btn btn-success">Let's  go!</button>
     5     </div>
     6 </template>
     7 
     8 <script>
     9     export default{
    10         methods:{
    11             goToMenu(){
    12                 //跳转到上一次浏览的界面
    13                 // this.$router.go(-1)
    14 
    15                 //指定跳转的地址
    16                 // this.$router.replace('/menu')
    17 
    18                 //指定跳转路由的名字下
    19                 // this.$router.replace({name:'menuLink'})
    20 
    21                 //通过push进行跳转
    22                 // this.$router.push('/menu')
    23                 this.$router.push({name:'menuLink'})
    24             }
    25         }
    26     }
    27 </script>
  • 相关阅读:
    投资理财知识小结1
    iOS中异常处理机制使用小结
    iOS中NSBundle使用小结
    ant design vue a-cascader 级联选择器 数据回显
    hbase数据存储及数据访问原理
    第15章: Prometheus监控Kubernetes资源与应用
    第14章:部署Java网站项目案例
    第13章:Kubernetes 鉴权框架与用户权限分配
    第12章:有状态应用部署
    第11章:Pod数据持久化
  • 原文地址:https://www.cnblogs.com/gshao/p/9415624.html
Copyright © 2020-2023  润新知