Skip to content

Vue

第一部分:引言

1.1 什么是Vue.js?

Vue.js是一款渐进式的JavaScript前端框架,于2014年由前Google工程师尤雨溪(Evan You)发布。与React和Angular等其他流行的前端框架相比,Vue.js以其简单易学和高度灵活的特点获得了广泛关注。它允许开发者以组件化的方式构建用户界面,同时提供了强大的数据绑定和状态管理功能。

案例

一个简单的Vue实例来展示文本:

javascript
new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
});

HTML:

html
<div id="app">
  {{ message }}
</div>

1.2 Vue.js的优势和局限

优势

  1. 简单易学:Vue的API和设计思想相对简单,新手容易上手。
  2. 高度灵活:不像Angular那样有很多“约定”,Vue更加灵活,可应用于各种大小的项目。
  3. 渐进式框架:你可以仅采用Vue.js的一部分,然后逐渐探索和应用更多的特性。
  4. 强大的生态系统:有丰富的插件和社区支持。

局限

  1. 缺乏大公司背书:虽然社区庞大,但没有像Facebook(React)或Google(Angular)这样的大公司支持。
  2. 可能过于灵活:对于大型项目,需要更多约定而非配置。

1.3 文章概述

本文章将详细介绍Vue.js的各个方面,从基础知识(如数据绑定和组件)到高级主题(如状态管理和服务端渲染)。文章旨在提供一个全面、结构化的指南,帮助读者了解如何有效地使用Vue.js进行前端开发。

接下来我们将探讨的主要话题包括:

  • 安装和环境设置
  • 基础与进阶功能
  • 状态管理与Vuex
  • 路由与Vue Router
  • 与后端交互
  • 测试与部署
  • 生态系统与社区

这样,即使你是Vue.js的新手,也能在阅读完本文后有所收获。

第二部分:安装和环境设置

2.1 Node.js和NPM

在开始使用Vue.js之前,首先需要确保你的系统已安装了Node.js和NPM(Node Package Manager)。

安装Node.js和NPM:

  • Windows用户可以访问Node.js官网下载安装包。

  • macOS和Linux用户可以使用包管理器进行安装。例如,在macOS上,可以使用Homebrew:

    bash
    brew install node

验证安装:

打开终端并输入以下命令:

bash
node -v
npm -v

这将显示Node.js和NPM的版本号,以确认它们已经成功安装。

2.2 使用Vue CLI进行项目初始化

Vue CLI是一个强大的脚手架工具,它可以帮助你快速地创建一个Vue.js项目。

安装Vue CLI:

bash
npm install -g @vue/cli

bash
yarn global add @vue/cli

创建新项目:

bash
vue create my-vue-project

这将启动一个交互式命令行界面,供你选择项目的配置选项。

2.3 环境配置

许多Vue项目还依赖于其他工具和库,如Webpack、Babel等。

Webpack:

Webpack是一个模块打包工具,用于组织和压缩你的代码。当你使用Vue CLI创建项目时,Webpack通常已经为你配置好了。

Babel:

Babel是一个JavaScript编译器,用于将ES6+代码转换为向后兼容的版本。同样,在使用Vue CLI创建项目时,通常已经为你配置好了。

.env文件:

在根目录下创建一个.env文件,你可以在其中设置环境变量:

text
VUE_APP_API_URL=https://api.example.com

在代码中,你可以这样访问这个变量:

javascript
console.log(process.env.VUE_APP_API_URL);

2.4 编辑器和插件

推荐使用Visual Studio Code(VS Code)作为开发编辑器,因为它有很多有用的插件和内置支持,如:

  • Vetur:Vue工具包,提供语法高亮、代码片段等。
  • ESLint:代码风格和错误检查。
  • Prettier:代码格式化。

第三部分:Vue.js基础

3.1 创建Vue实例

Vue应用程序都是通过构造函数 Vue 创建的Vue根实例开始的。

代码示例:

javascript
const app = new Vue({
  el: '#app',
  data: {
    message: 'Hello, Vue!'
  }
});

在HTML中:

html
<div id="app">
  {{ message }}
</div>

el 指定一个页面中已存在的DOM元素来挂载Vue实例。data 对象包含该实例的所有数据。

3.2 数据绑定和插值

Vue允许你使用简单的双大括号语法(Mustache语法)进行数据绑定。

代码示例:

html
<span>{{ message }}</span>

3.3 指令

Vue的指令是以 v- 作为前缀的特殊标记,用于在模板中执行一些操作。

常用指令:

  • v-bind: 用于绑定属性
  • v-on: 用于监听DOM事件
  • v-for: 用于渲染列表

代码示例:

html
<!-- v-bind 示例 -->
<a v-bind:href="url">Link</a>

<!-- v-on 示例 -->
<button v-on:click="doSomething">Click me</button>

<!-- v-for 示例 -->
<ul>
  <li v-for="item in items">{{ item.text }}</li>
</ul>

3.4 计算属性和侦听器

计算属性(Computed properties):

计算属性是一种更加灵活和可重用的数据绑定方式。

javascript
computed: {
  reversedMessage: function () {
    return this.message.split('').reverse().join('')
  }
}

侦听器(Watchers):

当需要在数据变化时执行异步操作或较大开销操作时,可以使用 watch

javascript
watch: {
  message: function (newMessage, oldMessage) {
    // 这里执行某些操作
  }
}

3.5 条件渲染

Vue提供了多种方式来根据条件渲染元素。

常用指令:

  • v-if
  • v-else-if
  • v-else

代码示例:

html
<p v-if="seen">现在你看到我了</p>

在这里,seen 是一个布尔值,当 seentrue 时,对应的 <p> 元素将会显示。

3.6 表单输入绑定

使用 v-model 指令可以轻松实现双向数据绑定。

代码示例:

html
<input v-model="message">

在这里,message 是 Vue 实例中 data 对象的一个属性。该输入框的值将绑定到 message,反之亦然。

3.7 组件系统

Vue允许你通过简单的组件系统构建大型应用。

代码示例:

javascript
// 定义一个名为 `button-counter` 的新组件
Vue.component('button-counter', {
  data: function () {
    return {
      count: 0
    }
  },
  template: '<button v-on:click="count++">You clicked me {{ count }} times.</button>'
})

在HTML中使用它:

html
<button-counter></button-counter>

3.8 生命周期钩子

Vue实例从创建到销毁的过程中,会经历一系列的初始化过程,这些过程称为生命周期。

常见的生命周期钩子:

  • created
  • mounted
  • updated
  • destroyed
javascript
new Vue({
  data: {
    message: "Hello, Vue!"
  },
  created: function() {
    console.log("Vue instance has been created");
  },
  mounted: function() {
    console.log("Vue instance has been mounted");
  }
})

3.9 指令和修饰符

Vue提供了许多有用的指令,这些指令通常带有前缀v-

  • v-bind: 用于绑定属性
  • v-on: 用于监听DOM事件
  • v-for: 用于渲染列表

修饰符是以半角句号.表示的特殊后缀,用于指出一个指令应该以特殊方式绑定。

代码示例:

html
<a v-bind:href="url">链接</a>
<button v-on:click="doSomething">点击我</button>

3.10 自定义指令

除了Vue的内建指令外,你还可以定义自己的指令。

代码示例:

javascript
Vue.directive('focus', {
  inserted: function (el) {
    el.focus()
  }
})

在这个示例中,我们定义了一个自动聚焦的指令。

3.11 计算属性和侦听器

Vue不仅提供了data,还提供了其他方式来控制你的数据。

  • 计算属性: 对于任何复杂逻辑,你都应该使用计算属性。

代码示例:

javascript
computed: {
  reversedMessage: function () {
    return this.message.split('').reverse().join('')
  }
}
  • 侦听器: watch 选项允许你执行异步操作或开销较大的操作。

代码示例:

javascript
watch: {
  message: function (newMessage, oldMessage) {
    debounceFunction(newMessage)
  }
}

3.12 Vue Router和状态管理

Vue Router用于构建单页应用。Vue Router是Vue.js官方的路由管理器。

代码示例:

javascript
const routes = [
  { path: '/home', component: Home },
  { path: '/about', component: About }
]

const router = new VueRouter({
  routes
})

状态管理通常通过Vuex进行。Vuex是一个专门为Vue.js应用程序开发的状态管理模式。

代码示例:

javascript
const store = new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})

3.13 组件通信

在Vue.js中,组件间的通信是非常重要的部分。Vue提供了多种方式以达到这个目的:

  • Props / Events: 父组件通过props传值给子组件,子组件通过事件给父组件传值。

代码示例:

html
<!-- Child component -->
<template>
  <div>
    {{ someProp }}
  </div>
</template>

<script>
export default {
  props: ['someProp']
};
</script>
html
<!-- Parent component -->
<template>
  <ChildComponent :someProp="parentData" />
</template>

<script>
import ChildComponent from './ChildComponent.vue';

export default {
  data() {
    return {
      parentData: 'Hello, World!'
    };
  },
  components: {
    ChildComponent
  }
};
</script>
  • Vuex: 共享状态管理。

代码示例:

javascript
// store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment (state) {
      state.count++
    }
  }
})
html
<!-- in component -->
<template>
  <button @click="increment">{{ count }}</button>
</template>

<script>
import { mapState, mapMutations } from 'vuex';

export default {
  computed: mapState(['count']),
  methods: mapMutations(['increment'])
};
</script>

3.14 测试和调试

当你的应用逐渐增长,进行测试变得尤为重要。Vue提供了一些测试工具和库,例如Vue Test Utils,Jest等。

代码示例:

javascript
// Using Jest to test a component methods
import { shallowMount } from '@vue/test-utils'
import MyComponent from '@/MyComponent.vue'

describe('MyComponent', () => {
  it('method should return true', () => {
    const wrapper = shallowMount(MyComponent)
    expect(wrapper.vm.someMethod()).toBe(true)
  })
})

3.15 服务端渲染(SSR)

对于需要SEO或首屏加载快的应用,你可能需要使用Vue的服务端渲染(SSR)。

代码示例:

javascript
// entry-server.js
import { createApp } from './app'

export default context => {
  return new Promise((resolve, reject) => {
    const { app, router } = createApp()

    router.push(context.url)

    router.onReady(() => {
      const matchedComponents = router.getMatchedComponents()

      if (!matchedComponents.length) {
        return reject({ code: 404 })
      }

      resolve(app)
    }, reject)
  })
}

3.16 自定义事件

Vue允许你通过自定义事件进行非父子组件间的通信。

代码示例:

javascript
// EventBus.js
import Vue from 'vue';
export const EventBus = new Vue();
javascript
// in Component A
import { EventBus } from './EventBus.js';
EventBus.$emit('my-event', 'Data from Component A');
javascript
// in Component B
import { EventBus } from './EventBus.js';
EventBus.$on('my-event', data => {
  console.log(`Received data: ${data}`);
});

3.17 插槽(Slots)

Vue插槽是另一种实现组件内容分发的方式,尤其是在构建UI库或组件库时非常有用。

代码示例:

html
<!-- Parent Component -->
<template>
  <ChildComponent>
    <template v-slot:header>
      <h1>Here might be a page title</h1>
    </template>

    <template v-slot:default>
      <p>A paragraph for the main content.</p>
    </template>
  </ChildComponent>
</template>
html
<!-- ChildComponent -->
<template>
  <div>
    <slot name="header"></slot>
    <slot></slot>
  </div>
</template>

3.18 Vue 3 新特性

Vue 3 引入了很多新特性,其中Composition API是最受关注的一点。

代码示例:

javascript
import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);

    function increment() {
      count.value++;
    }

    return {
      count,
      increment
    };
  }
};

3.19 过渡和动画

Vue还提供了多种过渡和动画的方法,包括同时使用第三方库。

代码示例:

html
<template>
  <transition name="fade" mode="out-in">
    <router-view></router-view>
  </transition>
</template>

<style>
.fade-enter-active, .fade-leave-active {
  transition: opacity .5s;
}
.fade-enter, .fade-leave-to {
  opacity: 0;
}
</style>

3.20 开发者工具

Vue Devtools是一个浏览器扩展,用于调试Vue.js应用程序。它允许你查看组件层次结构,查看状态、触发事件等。

这样,我们就基本涵盖了Vue.js的核心知识和高级特性。当然,还有很多其他知识点和工具库值得探索,比如Vue Router的高级用法、Vuex的模块化等,这些都可以作为进阶学习的材料。

第四部分:进阶功能

4.1 服务端渲染(SSR)

Vue支持服务端渲染,这可以提高首屏渲染速度,对SEO也有好处。

代码示例:

使用vue-server-renderer进行基础的服务端渲染。

javascript
const { createBundleRenderer } = require('vue-server-renderer')
const renderer = createBundleRenderer(serverBundle, {
  template
})

server.get('*', (req, res) => {
  renderer.renderToString({ url: req.url }, (err, html) => {
    if (err) {
      res.status(500).end('Internal Server Error')
      return
    }
    res.end(html)
  })
})

4.2 静态站点生成(Static Site Generation)

使用如Nuxt.js这样的框架可以方便地生成静态站点。

代码示例:

bash
nuxt generate

4.3 指令(Directives)

Vue提供了自定义指令的能力,比如用于自定义v-focus指令。

代码示例:

javascript
// 注册一个全局自定义指令 `v-focus`
Vue.directive('focus', {
  // 当绑定元素插入到 DOM 中。
  inserted: function (el) {
    // 聚焦元素
    el.focus()
  }
})

4.4 插件(Plugins)

Vue支持通过插件的方式来扩展功能。

代码示例:

javascript
// 使用vue-toast插件
import Toasted from 'vue-toasted';
Vue.use(Toasted, {
  duration: 2000
})

4.5 动态模块导入(Dynamic Module Import)

你可以在Vue中动态导入模块,从而实现代码分割和懒加载。

代码示例:

javascript
const UserComponent = () => import('./UserComponent.vue');

4.6 Vue 3 的 Composition API

Vue 3 提供了 Composition API 用于更灵活地管理组件的状态。

代码示例:

javascript
import { ref, computed } from 'vue';
export default {
  setup() {
    const count = ref(0);
    const doubled = computed(() => count.value * 2);

    return {
      count,
      doubled
    };
  }
}

4.7 TypeScript 支持

Vue 3 对 TypeScript 提供了更好的支持。

代码示例:

typescript
import { defineComponent } from 'vue';

export default defineComponent({
  props: {
    msg: String
  }
})

4.8 Mixins

Mixins 提供了一种灵活的方式来分发 Vue 组件中的可复用功能。

代码示例:

javascript
// mixin.js
export const myMixin = {
  created() {
    this.hello()
  },
  methods: {
    hello() {
      console.log('Hello from mixin!')
    }
  }
}

// 在组件中使用
import { myMixin } from './mixin'

export default {
  mixins: [myMixin]
}

4.9 Teleport

在 Vue 3 中,Teleport 提供了一种将子组件渲染到 DOM 树中任意位置的方法。

代码示例:

html
<!-- App.vue -->
<teleport to="#endofbody">
  <div> This will be teleported </div>
</teleport>

4.10 Filters

虽然 Vue 3 官方不再推荐使用 filters,但你仍然可以通过计算属性或方法来实现相同的功能。

代码示例:

javascript
computed: {
  formattedValue() {
    return this.value.toUpperCase();
  }
}

4.11 Custom Events

你可以通过 $emit 方法触发自定义事件。

代码示例:

javascript
this.$emit('custom-event', payload)

4.12 Scoped Slots

通过作用域插槽,你可以更灵活地自定义子组件中的内容。

代码示例:

html
<template #header="{ title }">
  <h1> Hello, {{ title }} </h1>
</template>

4.13 Suspense

Vue 3 的 Suspense 用于等待嵌套组件中的异步依赖项。

代码示例:

html
<Suspense>
  <template #default>
    <AsyncComponent />
  </template>
  <template #fallback>
    <div>Loading...</div>
  </template>
</Suspense>

4.14 Composition API

Vue 3引入了Composition API,这是一种全新的组织和管理组件逻辑的方式。

代码示例:

javascript
import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0);

    function increment() {
      count.value++;
    }

    return {
      count,
      increment
    };
  }
}

4.15 Vue Router 和 Vuex

在大型应用中,通常会使用 Vue Router 和 Vuex 进行状态管理和路由控制。

Vue Router 示例:

javascript
import { createRouter, createWebHistory } from 'vue-router';

const routes = [
  { path: '/', component: Home },
  { path: '/about', component: About }
];

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

Vuex 示例:

javascript
import { createStore } from 'vuex';

export default createStore({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  }
});

4.16 Custom Directives

Vue 允许你定义自己的指令。

代码示例:

javascript
app.directive('focus', {
  mounted(el) {
    el.focus()
  }
})

4.17 Server-Side Rendering (SSR)

Vue 也支持服务器端渲染,这对于SEO和性能优化非常有用。

Nuxt.js 示例:

javascript
// nuxt.config.js
export default {
  mode: 'universal',
}

4.18 Test Utilities

为了方便单元测试,Vue 提供了一系列测试工具。

代码示例:

javascript
import { mount } from '@vue/test-utils';
import MyComponent from './MyComponent.vue';

const wrapper = mount(MyComponent);
expect(wrapper.text()).toBe('Hello world');

4.19 Deployment Strategies

Vue 应用的部署也有多种策略,如静态站点生成或使用Docker。

Docker 示例:

dockerfile
FROM node:alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=build /app/dist /usr/share/nginx/html

4.20 Optimizing for Production

在构建生产环境下的应用时,性能优化是不可忽视的一环。

代码示例:

javascript
// 使用懒加载路由
const Foo = () => import('./Foo.vue')

4.21 Accessibility

访问性也是Vue应用需要考虑的方面之一。可以使用 ARIA 角色和其他属性来增强应用的可访问性。

代码示例:

html
<button @click="doSomething" aria-label="Do something">Click Me!</button>

4.22 Internationalization

Vue 通过使用第三方库如 vue-i18n 可以很容易地添加国际化支持。

代码示例:

javascript
import Vue from 'vue';
import VueI18n from 'vue-i18n';

Vue.use(VueI18n);

const messages = {
  en: {
    hello: 'Hello world'
  },
  ja: {
    hello: 'こんにちは、世界'
  }
};

const i18n = new VueI18n({
  locale: 'en',
  messages
});

4.23 Real-time Features

使用 WebSocket 或第三方服务(如 Firebase)可以在 Vue 应用中实现实时功能。

代码示例:

javascript
// 使用WebSockets
const socket = new WebSocket('ws://localhost:3000');

socket.addEventListener('message', function(event) {
  console.log('Message from server:', event.data);
});

4.24 Progressive Web Apps (PWA)

Vue CLI 提供了简单的方式来创建渐进式Web应用(PWA)。

代码示例:

json
// vue.config.js
module.exports = {
  pwa: {
    name: 'My App',
    themeColor: '#4DBA87'
  }
};

4.25 Final Thoughts

到这里,关于 Vue 的进阶功能的介绍就全部完成了。希望这个指南能为你提供一个全面、深入的了解,无论你是刚开始学习 Vue,还是希望提高现有的 Vue 技能。

第五部分:状态管理与Vuex

状态管理是前端开发中非常关键的一部分,尤其是当应用规模变得相当大或复杂时。Vue提供了一个专门为Vue应用设计的状态管理库——Vuex。

5.1 什么是状态管理

在一个大型应用中,多个组件需要共享状态或数据。状态管理是一种机制,用于在应用的不同部分之间保持状态的同步。

代码示例:

javascript
// 在没有状态管理的情况下,组件间共享状态
// Parent Component
data() {
  return {
    sharedState: 'I am a shared state'
  };
}

// Child Component
props: ['sharedState']

5.2 为什么需要Vuex

当应用规模增长时,你会发现仅使用 props 和事件无法满足需求。Vuex提供了一个中央存储,所有组件都可以访问。

代码示例:

javascript
// 安装 Vuex
npm install vuex

5.3 Vuex 基础

Vuex有几个核心概念,包括 state、getters、mutations 和 actions。

代码示例:

javascript
import Vue from 'vue';
import Vuex from 'vuex';

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    count: 0
  },
  mutations: {
    increment(state) {
      state.count++;
    }
  },
  actions: {
    increment(context) {
      context.commit('increment');
    }
  },
  getters: {
    getCount(state) {
      return state.count;
    }
  }
});

5.4 State

State 是 Vuex 存储的心脏。它包含了应用级别的状态数据。

代码示例:

javascript
// 访问 state
computed: {
  count() {
    return this.$store.state.count;
  }
}

5.5 Getters

Getters 用于计算或获取状态。

代码示例:

javascript
// 使用 getters
computed: {
  count() {
    return this.$store.getters.getCount;
  }
}

5.6 Mutations

Mutations 用于更改状态。它是唯一可以直接更改 state 的方法。

代码示例:

javascript
// 在组件中触发 mutation
methods: {
  increment() {
    this.$store.commit('increment');
  }
}

5.7 Actions

Actions 类似于 mutations,但它们不直接更改状态。相反,它们提交(commit)mutations。Actions 可以包含异步操作。

代码示例:

javascript
// 在 store 中定义 actions
actions: {
  asyncIncrement(context) {
    setTimeout(() => {
      context.commit('increment');
    }, 1000);
  }
}

// 在组件中触发 action
methods: {
  increment() {
    this.$store.dispatch('asyncIncrement');
  }
}

5.8 Modules

对于大型应用,将所有状态保存在一个大对象中可能会变得难以管理。Vuex 允许我们通过 Modules 将 store 分割成模块。

代码示例:

javascript
// 在一个模块中
const moduleA = {
  state: { ... },
  mutations: { ... },
  actions: { ... },
  getters: { ... }
};

// 在主 store 中引用
new Vuex.Store({
  modules: {
    a: moduleA
  }
});

5.9 Vuex 插件

Vuex 还允许使用插件,这些插件可以监听每一次状态变化。

代码示例:

javascript
const myPlugin = store => {
  store.subscribe((mutation, state) => {
    console.log(mutation.type);
    console.log(mutation.payload);
  });
};

new Vuex.Store({
  plugins: [myPlugin]
});

5.10 实战案例:购物车示例

让我们通过一个简单的购物车示例来展示 Vuex 的威力。

代码示例:

javascript
// store.js
export default new Vuex.Store({
  state: {
    cart: []
  },
  mutations: {
    addToCart(state, product) {
      state.cart.push(product);
    }
  },
  actions: {
    addToCart(context, product) {
      context.commit('addToCart', product);
    }
  },
  getters: {
    cartItems(state) {
      return state.cart;
    },
    cartSize(state) {
      return state.cart.length;
    }
  }
});

// 在组件中
computed: {
  cartItems() {
    return this.$store.getters.cartItems;
  }
},
methods: {
  addToCart(product) {
    this.$store.dispatch('addToCart', product);
  }
}

第六部分:路由与Vue Router

6.1 什么是Vue Router?

Vue Router 是 Vue.js 的官方路由库。它集成在 Vue.js 核心中,允许在单页面应用(SPA)中轻松地添加路由功能。

代码示例:

javascript
// 安装
npm install vue-router

// 在 main.js 中引入和使用
import VueRouter from 'vue-router'
Vue.use(VueRouter)

6.2 基础路由

在 Vue Router 中,最基础的路由配置包括一个路径和一个组件。

代码示例:

javascript
const routes = [
  { path: '/home', component: Home },
  { path: '/about', component: About }
]

6.3 创建和安装Router实例

创建一个 router 实例,并通过 Vue 实例全局注册。

代码示例:

javascript
const router = new VueRouter({
  routes // short for `routes: routes`
})

const app = new Vue({
  router
}).$mount('#app')

6.4 路由跳转

在 Vue.js 应用中,使用 <router-link> 组件或编程式 API 来进行路由跳转。

代码示例:

javascript
<!-- 使用组件 -->
<router-link to="/home">Home</router-link>

<!-- 编程式 -->
this.$router.push('/home')

6.5 动态路由

Vue Router 支持动态路径参数,参数以冒号 : 开头。

代码示例:

javascript
const routes = [
  { path: '/user/:id', component: User }
]

// 访问 /user/1,组件中可以通过 this.$route.params.id 获取到 "1"

6.6 嵌套路由

嵌套路由允许我们在一个页面中嵌入多个视图。

代码示例:

javascript
const routes = [
  {
    path: '/user',
    component: User,
    children: [
      {
        path: 'profile',
        component: UserProfile
      },
      {
        path: 'posts',
        component: UserPosts
      }
    ]
  }
]