1. 关于Vue路由
Vue.js 是一个 MVVM 框架,常用于构建单页面应用程序 (SPA)。在单页面应用中,多个组件拼接成整个页面。Vue.js 中的路由机制允许我们通过 URL 来控制组件的显示和隐藏,从而实现单页面应用中的页面切换功能。Vue.js 的路由机制默认使用的是 Vue Router。Vue Router 是官方提供的路由管理器,可以用于构建 SPA。
Vue Router 非常的强大,不仅可以实现页面之间的路由跳转,还可以进行方便的参数传递、路由嵌套、路由拦截等诸多功能。其中,路由参数传递是实现页面数据共享的一种方式。
2. Vue路由中的参数传递
Vue Router提供了三种类型的参数传递:
- params 参数
- query 参数
- 动态路由
2.1 params 参数传递
params 是一种基于URL的参数传递方式, 参数会被设置到 $route.params 中。使用params进行传递参数时,必须在路由配置中声明这个参数,不然会导致参数丢失。
具体实现方式如下:
//router/index.js
{
path: '/user/:id',
name: 'user',
component: UserPage
}
//UserPage.vue
{
//...
}
在路由配置中声明参数id,可以在 UserPage 组件通过 $route.params.id 访问这个参数。示例代码如下:
//UserPage.vue
<template>
<div>
<p>用户ID: <strong>{{ $route.params.id }}</strong></p>
</div>
</template>
在上面的示例中,我们使用了路由参数来传递用户的id,然后在 UserPage 组件中通过 $route.params.id 获取了这个参数。这样,我们就可以在不同的页面之间传递参数了。
注意:params 是基于URL的参数传递,因此参数是以明文的形式展示的,传输的数据不够安全。不建议将敏感数据通过 params 传递。
2.2 query 参数传递
query 参数是通过 URL 参数传递的,可以通过 $route.query 访问这些参数。query 的参数不需要再路由配置中声明,因此比较灵活。
具体实现方式如下:
//router/index.js
{
path: '/product',
name: 'product',
component: ProductPage
}
//ProductPage.vue
<template>
<div>
<p>产品ID: <strong>{{ $route.query.id }}</strong></p>
</div>
</template>
//当通过以下的 URL 访问产品页面时,可以携带id这个参数
//https://example.com/product?id=123
在上面的示例中,我们在 URL 中携带了参数 id,然后在 ProductPage 组件中通过 $route.query.id 获取了这个参数。
2.3 动态路由参数传递
除了params和query参数传递外,Vue Router 还支持动态路由参数传递。
举个例子,我们可以设置一个 /books/:id 的路由规则,来匹配/books/1、/books/2、/books/3这样的 URL。其中,:id就是一个动态路由参数。
具体实现方式如下:
//router/index.js
{
path: '/books/:id',
name: 'books',
component: BooksPage
}
//BooksPage.vue
<template>
<div>
<p>书籍ID: <strong>{{ $route.params.id }}</strong></p>
</div>
</template>
//当通过以下的 URL 访问书籍页面时,可以携带id这个参数
//https://example.com/books/123
在上面的示例中,我们在路由规则中设置了动态路由参数 :id,然后在 BooksPage 组件中通过 $route.params.id 获取了这个参数。
3. 页面之间的数据共享
到这里,我们已经了解了 Vue Router 中三种参数传递方式。接下来,我们就可以利用这些技巧来实现页面之间的数据共享。
3.1 父子组件之间的数据传递
在 Vue.js 中,父子组件之间的数据共享非常方便,我们可以通过 props 属性来实现数据传递,也可以通过 $emit 这样的方法进行事件监听和传递数据。
3.2 Vuex 状态管理器
Vue.js 提供了一个 Vuex 状态管理器,用于管理应用程序中的状态数据。Vuex 中的状态数据可以在应用程序中的任何地方进行访问和修改,因此非常适合实现页面之间的数据共享。
预览在Vuex中定义状态的示例代码如下:
//store/index.js
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
const store = new Vuex.Store({
state: {
userInfo: null,
},
mutations: {
setUserInfo(state, info) {
state.userInfo = info
},
},
})
export default store
在上面的示例代码中,我们定义了一个名为 userInfo 的状态,使用 mutations 中的方法 setUserInfo 来修改这个状态。
预览在组件中获取和修改状态数据的示例代码如下:
//UserPage.vue
<template>
<div>
<p>用户ID: <strong>{{ $route.params.id }}</strong></p>
<p>用户信息: {{ userInfo }}</p>
<button @click="onClick">修改用户信息</button>
</div>
</template>
<script>
import { mapState, mapMutations } from 'vuex'
export default {
computed: {
...mapState(['userInfo']),
},
methods: {
...mapMutations(['setUserInfo']),
onClick() {
this.setUserInfo({ id: this.$route.params.id, name: '张三' })
},
},
}
</script>
在上面的示例代码中,我们在 UserPage 组件中使用 mapState 和 mapMutations 函数来获取和修改 store 中的状态数据。
4. 总结
本文介绍了 Vue.js 中的路由机制,并介绍了 Vue Router 中的三种参数传递方式。通过这些技术,我们可以实现页面之间的数据共享,增强应用程序的交互性和可用性。除此之外,使用 Vuex 状态管理器,我们还可以实现全局状态数据的管理,方便应用程序的状态维护。