2021-06-21 Vue Router的完整Demo

理论基于
https://router.vuejs.org/zh/installation.html
学习这个vue-router有2种写demo的方法:

  1. 写一个html,把html和javascript写在一个文件里
  2. 以模块的形式,在一个完整的项目里实现
    以下分别是这2种方法的完整代码:
    第一种方法的实现: 我给这个html取名为simple-version.html
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Vue Router Demo</title>
</head>
<body>
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
    <h1>Hello App!</h1>
    <p>
        <!-- use router-link component for navigation. -->
        <!-- specify the link by passing the `to` prop. -->
        <!-- <router-link> will be rendered as an `<a>` tag by default -->
        <router-link to="/foo">Go to Foo</router-link>
        <router-link to="/bar">Go to Bar</router-link>
    </p>
    <!-- route outlet -->
    <!-- component matched by the route will render here -->
    <router-view></router-view>
</div>
<script>
    // 0. If using a module system, call Vue.use(VueRouter)

    // 1. Define route components.
    // These can be imported from other files
    const Foo = { template: '<div>foo</div>' }
    const Bar = { template: '<div>bar</div>' }

    // 2. Define some routes
    // Each route should map to a component. The "component" can
    // either be an actual component constructor created via
    // Vue.extend(), or just a component options object.
    // We'll talk about nested routes later.
    const routes = [
        { path: '/foo', component: Foo },
        { path: '/bar', component: Bar }
    ]

    // 3. Create the router instance and pass the `routes` option
    // You can pass in additional options here, but let's
    // keep it simple for now.
    const router = new VueRouter({
        routes
    })

    // 4. Create and mount the root instance.
    // Make sure to inject the router with the router option to make the
    // whole app router-aware.
    const app = new Vue({
        router
    }).$mount('#app')

    // Now the app has started!
</script>
</body>
</html>

然后在浏览器打开这个文件即可体会vue-router的功能:
点击'Go to Foo', 下面会出现foo字眼,点击‘Go to Bar’, 下面会出现bar字眼,这是因为在点击router的过程中, <router-view></router-view> 切换嵌入相应的component的内容。

image.png

第二种方法的实现:新建一个vue项目,在项目里以模块化的方式实现
2.1 我用的是webstorm 这个工具,先创建一个vue project:
image.png

2.2
整个实现过程的步骤大概是这样,除了1. 2 其他步骤可以不必按照顺序来。 接下来我解释下这几个步骤在干嘛。
image.png

1.和 2. 给项目安装vue-router, 安装完后,vue-router的信息会被记录到package.json,以便项目安装使用

npm install vue-router
  1. 创建Foo.vue, Bar.vue 这两个组件,如果放到正式项目中,就是我们想要展示的某个子页面。
    他们的内容分别是
<template>
    <div>foo</div>
</template>

<script>
    export default {
        name: "Foo"
    }
</script>

<style scoped>

</style>
<template>
    <div>bar</div>
</template>

<script>
    export default {
        name: "Bar"
    }
</script>

<style scoped>

</style>
  1. 组件创建好了后,那么就可以写要路由到这两个组件的路由信息了。
    修改router.js, 写入路由信息,再此,我要利用创建vue项目默认自带的HelloWorld.vue组件.
import Vue from 'vue'
import VueRouter from 'vue-router'
import HelloWorld from '../components/HelloWorld.vue'
import Foo from '../components/Foo.vue'
import Bar from '../components/Bar.vue'
Vue.use(VueRouter)

const routes = [
    { path: '/foo', component: Foo },
    { path: '/bar', component: Bar },
    { path:'/helloWorld', component: HelloWorld}
]

const router = new VueRouter({
    routes // (缩写) 相当于 routes: routes
})
 export default router
  1. 默认main.js 挂载的组件为id='app'的组件,即App.vue, 方便起见,我们就修改App.vue,在这上面放路由页面, <router-link> 意味着这里是个路由连接,会检索路由配置;检索到的路由所对应的component信息会被渲染到<router-view></router-view> 这更像一个占位符:
<template>
  <div id="app">
<!--    <img alt="Vue logo" src="./assets/logo.png">-->
<!--    <HelloWorld msg="Welcome to Your Vue.js App"/> 我们不在这个页面直接使用HelloWorld了,而到router里使用它-->
<!--    <h1>Hello App!</h1>-->
    <p>
      <!-- 使用 router-link 组件来导航. -->
      <!-- 通过传入 `to` 属性指定链接. -->
      <!-- <router-link> 默认会被渲染成一个 `<a>` 标签 -->
      <router-link to="/foo">Go to Foo</router-link>
      <router-link to="/bar">Go to Bar</router-link>
      <router-link to="/helloWorld">HelloWorld</router-link>
    </p>
    <!-- 路由出口 -->
    <!-- 路由匹配到的组件将渲染在这里 -->
    <router-view></router-view>
  </div>
</template>

<script>
// import HelloWorld from './components/HelloWorld.vue' //去掉原本导入的HelloWorld组件,因为此时我们已经在router导入,而通过router-link 就可以导向到HelloWorld.vue了,这里是多余代码

export default {
  name: 'App',
  // components: { //同上,我们不需要在这个页面引用HelloWorld组件
  //   HelloWorld
  // }
}
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
  margin-top: 60px;
}
</style>
  1. 万事俱备,路由信息已经编写完整,但是现在你看不到路由信息,因为main.js 为入口的地方,生成vue实例的地方,并不知道有router的存在,所以接下来要做的是将router注入到vue实例中:
    router.js 的目的是要利用vue-router生成一个router对象,返回给main.js,在生成vue组件的时候注入使用。
import Vue from 'vue'
import App from './App.vue'
import router from './router/router'

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App),
}).$mount('#app')

到这里,你可以在命令行里启动这个项目了:
如何启动呢?查看package.json, 你可以知道启动命令:

  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "lint": "vue-cli-service lint"
  },

为了测试,我们的命令是npm run serve. 细节需要自己查看package.json scripts节点的作用。

启动完成后,因为我们的项目没有明确指定要绑定的web端口,因此会自动被绑定一个可以用的端口,比如我的是8083
然后可以访问测试了。 以下是分别点击3个链接所出现的结果。


image.png

image.png

image.png

完。

注意: 在项目模式里,不能用html模式里的component:你的router不能写箭头部分


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容