5.0 路由组件的使用

一、概述

路由器:路由器管理路由;

路由:路由是一种映射关系,一个key对应一个value,key是path,对于后台路由,

      value是处理请求的回调函数,对于前台路由value是组件。

说明:
1) 官方提供的用来实现 SPA(单个页面) 的 vue 插件
2) github: https://github.com/vuejs/vue-router
3) 中文文档: http://router.vuejs.org/zh-cn/
4) 下载: npm install vue-router --save

1. 路由的使用:

(1) VueRouter(): 用于创建路由器的构建函数
  new VueRouter({  // 创建路由器实例
    // 多个配置项(配置对象)
  })

(2)路由配置
  routes: [
    { // 一般路由
      path: ‘/about‘,  
      component: About
    },
    { // 自动跳转路由
      path: ‘/‘,
      redirect: ‘/about‘
    }
  ]

(3)注册路由器
  import router from ‘./router‘
  new Vue({
    router
  })

(4)使用路由组件标签
   <router-link>: 用来生成路由链接(当点击路由连接的时候需要在界面上显示当前路由组件)
   eg: <router-link to="/home">Go to home</router-link>

      <router-link to="/about">Go to about</router-link>

   <router-view>: 用来显示当前路由组件界面
   eg: <div> 

      <router-view></router-view>  //表示如果点击了路由链接(/about),则该路由链接的界面显示在这里,即显示在这个div里面.

    </div>

2. 缓存路由组件对象

正常情况下,一个路由组件被切换的时候,这个路由组件就会死亡,在切换回来时,又重先创建。

路由组件的缓存就是,在切换的时候将路由组件进行缓存,不要让它死亡。实现:

<keep-alive>
  <router-view></router-view>   // 缓存路由组件对象,只是平时我们会说缓存路由组件  (这里为保持About和Home活着)
</keep-alive>

现象:在如下图About组件的输入框输入abc后,切换到Home组件,然后在切回About组件,此时输入框还显示abc。

3. 向路由组件传递参数

方式一:  路由路径携带参数(param/query)

这里的参数有两种类型,param参数和query参数(这两种参数的传递等效),以下实例为param参数的传递,如果要使用query参数类型

传递参数,则不需要写下面的:id占位符,<router-link>路由链接中,路径的拼接方式和以前一样如: xxxx?id=1
1) 配置路由
children: [
  {
    path: ‘mdetail/:id‘,  //占位符
    component: MessageDetail
  }
]
2) 路由路径
  <router-link :to="‘/home/message/mdetail/‘+m.id">{{m.title}}</router-link>
3) 路由组件中读取请求参数
  this.$route.params.id

方式二:<router-view>属性携带数据

<router-view :msg="msg"></router-view>

以下实例中App.vue通过msg属性将数据传递至About组件中。

4. 编程式路由导航

相关 API
1) this.$router.push(path): 相当于点击路由链接(可以返回到当前路由界面)
2) this.$router.replace(path): 用新路由替换当前路由(不可以返回到当前路由界面)
3) this.$router.back(): 请求(返回)上一个记录路由
4) this.$router.go(-1): 请求(返回)上一个记录路由
5) this.$router.go(1): 请求下一个记录路由

二、使用(基本路由/嵌套路由)

先下载vue-router包:npm install vue-router --save

非路由组件一般放在components文件夹下,路由组件一般放在views|pages文件夹下; 

1. 路由的使用步骤:

步骤一: 定义路由组件

index.html:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <link rel="stylesheet" href="/static/css/bootstrap.css">
  <title>vue_demo</title>

  <style> /*设置选择路由时的样式,!important表示 提高指定样式规则的应用优先权*/
    .router-link-active {
      color: red !important;
    }
  </style>
</head>
<body>
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>

App.vue:

<template>
  <div>
    <div class="row">
      <div class="col-xs-offset-2 col-xs-8">
        <div class="page-header"><h2>Router Test</h2></div>
      </div>
    </div>

    <div class="row">
      <!--左边部分-->
      <div class="col-xs-2 col-xs-offset-2">
        <div class="list-group">
          <!--5.使用路由标签-->
          <!-- 生成路由链接 -->
          <router-link to="/about" class="list-group-item">About</router-link>
          <router-link to="/home" class="list-group-item">Home</router-link>
        </div>
      </div>

      <!--右边部分-->
      <div class="col-xs-6">
        <div class="panel">
          <div class="panel-body">
            <!-- 显示当前组件 -->
            <keep-alive>
              <!--传递一个属性,值为abc,如果写成:msg="abc", 则abc为变量-->
              <router-view msg="abc"></router-view>
            </keep-alive>
          </div>
        </div>
      </div>

    </div>
  </div>
</template>

<!--根组件-->
<script>
  export default {}
</script>

<style>

</style>

About.vue/Home.vue:用户演示基本路由

<template>
  <div>
    <h2>About</h2>
    <p>{{msg}}</p>
    <input type="text">
  </div>
</template>

<!--About组件-->
<script>
  export default {
    // 接收一个属性,这个属性是由App组件路由传递过来的
    props: {
      msg: String
    }
  }
</script>

<style>

</style>

<template>
  <div>
    <h2>Home</h2>
    <div>
      <ul class="nav nav-tabs">
        <!--使用路由:路由链接-->
        <li><router-link to="/home/news">News</router-link></li>
        <li><router-link to="/home/message">Message</router-link></li>
      </ul>

      <!--使用路由:当前路由-->
      <router-view></router-view>
    </div>
  </div>
</template>

<!--Home组件-->
<script>
  export default {}
</script>

<style>

</style>

News.vue/Message.vue:Home下的子路由,用户演示嵌套路由

<template>
  <ul>
    <li v-for="(news, index) in newsArr" :key="index">{{news}}</li>
  </ul>
</template>

<script>
  export default {
    data () {
      return {
        newsArr: [‘News001‘, ‘News002‘, ‘News003‘]
      }
    }
  }
</script>

<style>

</style>

<template>
  <!--根标签div:只能有一个-->
  <div>
    <ul>
      <!-- :key一般写index,如果这个对象里面有标识属性,则最好写标识属性-->
      <li v-for="m in messages" :key="m.id">
        <!--要拼接字符串得是js语法,不能是html的语法,所以,这里是:to="" , 如果用es5的语法则为 :to="‘‘", 如果用es6的语法则为:to="``"-->
        <router-link :to="`/home/message/detail/${m.id}`">{{m.title}}</router-link>
        <button @click="pushShow(m.id)">push查看</button>
        <button @click="replaceShow(m.id)">replace查看</button>
      </li>
    </ul>
    <button @click="$router.back()">回退</button>
    <hr>
    <router-view></router-view>
  </div>
</template>

<script>
  export default {
    data () {
      return {
        messages: [
          /* {id: 1, title: ‘Message001‘},
           {id: 3, title: ‘Message003‘},
           {id: 5, title: ‘Message005‘}*/
        ]
      }
    },

    mounted () { // 用于异步操作
      // 模拟ajax请求从后台获取数据,注意:回调函数要用箭头函数
      setTimeout(() => {
        const messages = [
          {id: 1, title: ‘Message001‘},
          {id: 3, title: ‘Message003‘},
          {id: 5, title: ‘Message005‘}
        ]
        this.messages = messages
      }, 1000)
    },

    methods: {
      pushShow (id) {
        this.$router.push(`/home/message/detail/${id}`)
      },

      replaceShow (id) {
        this.$router.replace(`/home/message/detail/${id}`)
      }
    }
  }
</script>

<style>

</style>

MessageDetail.vue: Message下的子路由

<template>
  <ul>
    <!--$route表示当前路由-->
    <li>id: {{$route.params.id}}</li>
    <li>title: {{detail.title}}</li>
    <li>content: {{detail.content}}</li>
  </ul>
</template>

<script>
  /*这里面就没有做异步了,真实的情况应该是详情页面根据传递过来的id去后台查询*/
  const messageDetails = [
    {id: 1, title: ‘Message001‘, content: ‘message content00111....‘},
    {id: 3, title: ‘Message003‘, content: ‘message content00222....‘},
    {id: 5, title: ‘Message005‘, content: ‘message content00333....‘}
  ]
  export default {
    data() {
      return {
        detail: {}  // 里面的属性不用列举
      }
    },
    mounted () {// 改变当前路由组件参数数据时, 不会重新创建组件对象, mounted不会重新执行,所以这里需要用watch去监视
      // 模拟异步到后台查询数据
      setTimeout(() => {
        const id = this.$route.params.id // 这是传递过来的id,有可能传递过来后就变成文本了,乘以1后就变成数字了
        this.detail = messageDetails.find(detail => detail.id===id*1)
      }, 1000)
    },

    watch: {
      // 方法一
      // $route: function () { // 改变当前路由组件参数数据时自动调用(组件对象有$route这个属性)
      //   console.log(‘$route()‘)
      //   const id = this.$route.params.id
      //   this.detail = messageDetails.find(detail => detail.id===id*1)
      // }
      $route: function (value) { // 方式二
        console.log(value);
        const id = value.params.id
        console.log(id);
        this.detail = messageDetails.find(detail => detail.id===id*1)
      }
    }
  }
</script>

<style>

</style>

步骤二:注册路由组件(将路由组件映射成路由)

router/ index.js:

/*
路由器对象模块
 */
import Vue from ‘vue‘ //引入vue
import VueRouter from ‘vue-router‘ //1. 引入vue的路由器组件

import About from ‘../pages/About.vue‘ //引入路由组件
import Home from ‘../pages/Home.vue‘
import News from ‘../pages/News.vue‘
import Message from ‘../pages/Message.vue‘
import MessageDetail from ‘../pages/MessageDetail.vue‘

Vue.use(VueRouter) // 2.声明使用vue-router插件

// 3.对外暴露路由器对象(这里为默认暴露,默认暴露,引入时可以使用任何名字)
export default new VueRouter({
  routes: [   // 注册应用中所有的路由
    {
      path: ‘/about‘,
      component: About
    },
    {
      path: ‘/home‘,
      component: Home,
      children: [  // 配置子路由组件
        {
          path: ‘/home/news‘, // path最左侧的/永远代表根路由
          component: News
        },
        {
          path: ‘message‘, // 这是简化写法
          component: Message,
          children: [
            {
              path: ‘detail/:id‘,  // :id表示占位符
              component: MessageDetail
            }
          ]
        },
        {
          path: ‘‘, // 设置子路由的默认显示,代表当前,这里为/home,因为这是/home下的自路由
          redirect: ‘/home/news‘
        }
      ]
    },
    {
      path: ‘/‘,  // 设置默认请求about,即当请求根路径的时候
      redirect: ‘/about‘ // 重定向请求/about
    }
  ]
})

main.js:注册路由器

/*
入口JS
 */
import Vue from ‘vue‘
import App from ‘./App.vue‘
import router from ‘./router‘ //引入路由器(因为是index.js,所以这里直接写到./router就可以了)

new Vue({//配置对象的属性名都是一些确定的属性名,不能随便修改
  el: ‘#app‘,
  components: {App}, // 映射组件标签
  template: ‘<App/>‘, // 指定需要渲染到页面的模板
  router  // 4.注册路由器  等价于 router: router
})

步骤三:使用路由(标签)

关于路由的使用主要是使用路由标签-路由链接 <router-link> 、当前路由<router-view>,在以上实例中主要存在App.vue、

News.vue、Messages中。

效果图:

|

        图1                           图2

原文地址:https://www.cnblogs.com/shiyun32/p/10909141.html

时间: 2024-10-07 23:42:34

5.0 路由组件的使用的相关文章

VUE 路由组件左右滑动切换(移动端)

<template> <div id="headed"> <ul class="tab"> <li> <!-- @click="jump(index) index: 切换颜色 代表切换的路由文件 :class="{'active_color': index==0} 当index等于0的时候显示第一个,index:1 切换排球 --> <div class="body_bo

Vue2.0的变化(2)———vue2.0动画的变化、vue-2.0路由的变化

之前讲解的都是vue1.0的使用,现在我们开始介绍vue2.0,这里的介绍是在vue1.0的基础上进行介绍的,主要介绍的是同vue1.0版本相比2.0的变化 vue2.0动画的变化:现在变成: <transition> 运动东西(元素,属性,路由.....); </transition> class的定义: .fade-enter{} //初始状态 .fade-enter-active{} //变化成什么样 --当元素出来(显示) .fade-leave{} //可不写 .fade

vue2.0路由嵌套

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>vue2.0路由嵌套2</title> <script type="text/javascript" src="js/vue2.0.js" ></script> <script type="text/javascrip

vue2.0路由写法和传参

前置知识请戳这里 vue-routerCDN地址:https://unpkg.com/[email protected]/dist/vue-router.js vue-router下载地址:https://github.com/vuejs/vue-router/tree/dev/dist vue2.0路由基本写法 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title&

【共享单车】—— React后台管理系统开发手记:Router 4.0路由实战演练

前言:以下内容基于React全家桶+AntD实战课程的学习实践过程记录.最终成果github地址:https://github.com/66Web/react-antd-manager,欢迎star. 一.React Router 4.0核心概念 4.0版本中已不需要路由配置,一切皆组件 react-router:基础路由包 提供了一些router的核心api,包括Router,Route,Switch等 react-router-dom:基于浏览器的路由(包含react-router) 提供了

路由组件的传参

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

(尚043) vue_向路由组件传递数据+vue param和query两种传参方式

效果展示: ============================================================================ 应写成下图这种形式: :id为占位 现在是通过什么路径向路由组件传递数据的? 通过请求参数${message.id}传递的 请求参数有两种: 1).Param 2).Query  (?后面,类似于get) ================================================================

vue2.0路由

现在用vue-cli搭建的环境里面vue-router是下载好的 vue2.0路由方式和以前也有些不同 没了了map和start方法 目录结构如上图 这里有三个文件,app.vue显示,main.js控制路由,goods.vue为跳转页面 app.vue template> <div id="app"> <v-header></v-header> <div class="tab"> <div class=&

vue-router之路由钩子(组件内路由钩子必须在路由组件调用,子组件没用)

模式 vue-router中的模式选项主要在router实例化的时候进行定义的,如下 const router = new VueRouter({ mode: 'history', // 两种类型history 还有 hash routes: routes // 可以缩写成routes }) 有两种模式可供选择,history 和 hash,大致对比一下, 模式 优点 缺点 hash 使用简单.无需后台支持 在url中以hash形式存在,不会传到后台 history 地址明确,便于理解和后台处理