如何使用 vue-router 将数据从一个视图传递到另一个视图
How to pass data from one view to another with the vue-router
将 vue-router
与 .vue
文件一起使用时,没有记录将数据从一个 view/component 传递到另一个文件的方法。
让我们进行以下设置...
main.js:
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
let routes = [
{
path: '/page1',
component: require('./views/Posts.vue')
},
{
path: '/page2',
component: require('./views/EditPost.vue')
}
];
let router = new VueRouter({
routes
});
new Vue({
el: '#main',
router
});
Posts.vue:
<template>
<div>
Posts.vue passing the ID to EditPost.vue: {{ postId }}
</div>
</template>
<script>
export default {
data() {
return {
allPostsHere: // Whatever...
}
}
}
</script>
EditPost.vue:
<template>
<div>
EditPost.vue received ID from Posts.vue: {{ receivedId }}
</div>
</template>
<script>
export default {
data() {
return {
receivedId: // This is where I need the ID from Posts.vue
}
}
}
</script>
请注意:无法直接从EditPost.vue
接收ID,因为它必须从Posts.vue
中选择。
问题:如何将 ID 从一个 view/component 传递给另一个?
路由只能通过 URL 访问,并且 URL 必须是用户可以在 URL 栏中键入的内容,因此要从一个视图组件传递变量另一个你必须使用 route params.
我假设您在 Posts
组件中有一个 post 的列表,并且想要更改页面以编辑 EditPost
组件中的特定 post。
最基本的设置是在 post 列表中添加一个 link 以重定向到编辑页面:
<div v-for="post in posts">
{{ post.title }}
<router-link :to="'/post/' + post.id + '/edit'">Edit</router-link>
</div>
您的路线如下所示:
[
{
path: '/posts',
component: require('./views/Posts.vue'),
},
{
path: '/post/:postId/edit',
component: require('./views/EditPost.vue'),
props: true,
},
]
props
配置选项只是通知Router将route params转换为component props。有关详细信息,请参阅 Passing props to route components。
然后在 EditPost
中您将接受 ID 并从服务器获取 post。
export default {
props: ['postId'],
data() {
return {
post: null,
}
},
mounted() {
this.fetchPost();
},
methods: {
fetchPost() {
axios.get('/api/post/' + this.postId)
.then(response => this.post = response.data);
},
},
}
请求完成后,EditPost
有自己的副本可以进一步处理。
请注意,在每次 post 编辑和每次进入 post 列表时,您都会向服务器发出请求,这在某些情况下可能是不必要的,因为所有需要的信息已经在 post 列表中并且不会在请求之间更改。如果你想在这种情况下提高性能,我建议将 Vuex 集成到你的应用程序中。
如果您决定这样做,这些组件看起来会非常相似,只是您不是通过 HTTP 请求获取 post 进行编辑,而是从 Vuex 存储中检索它。有关详细信息,请参阅 Vuex documentation。
如果你不希望参数出现在URL栏中,你可以使用window.sessionStorage、window.localStorage或vuex。
离开视图前设置参数,进入新视图后获取。
您可以在 <router-view :my-id="parentStoredId"></router-view>
上使用 prop 来传递 app.vue(主要组件)中存在的数据。要更改父数据,您需要从子数据 (Posts.vue、EditPost.vue) 发出包含值的 custom event。
另一种方法是 Non Parent-Child Communication。
我比较喜欢的方式是Vuex。即使需要学习使用,也会随着应用的成长而得到回报。
将 vue-router
与 .vue
文件一起使用时,没有记录将数据从一个 view/component 传递到另一个文件的方法。
让我们进行以下设置...
main.js:
import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter);
let routes = [
{
path: '/page1',
component: require('./views/Posts.vue')
},
{
path: '/page2',
component: require('./views/EditPost.vue')
}
];
let router = new VueRouter({
routes
});
new Vue({
el: '#main',
router
});
Posts.vue:
<template>
<div>
Posts.vue passing the ID to EditPost.vue: {{ postId }}
</div>
</template>
<script>
export default {
data() {
return {
allPostsHere: // Whatever...
}
}
}
</script>
EditPost.vue:
<template>
<div>
EditPost.vue received ID from Posts.vue: {{ receivedId }}
</div>
</template>
<script>
export default {
data() {
return {
receivedId: // This is where I need the ID from Posts.vue
}
}
}
</script>
请注意:无法直接从EditPost.vue
接收ID,因为它必须从Posts.vue
中选择。
问题:如何将 ID 从一个 view/component 传递给另一个?
路由只能通过 URL 访问,并且 URL 必须是用户可以在 URL 栏中键入的内容,因此要从一个视图组件传递变量另一个你必须使用 route params.
我假设您在 Posts
组件中有一个 post 的列表,并且想要更改页面以编辑 EditPost
组件中的特定 post。
最基本的设置是在 post 列表中添加一个 link 以重定向到编辑页面:
<div v-for="post in posts">
{{ post.title }}
<router-link :to="'/post/' + post.id + '/edit'">Edit</router-link>
</div>
您的路线如下所示:
[
{
path: '/posts',
component: require('./views/Posts.vue'),
},
{
path: '/post/:postId/edit',
component: require('./views/EditPost.vue'),
props: true,
},
]
props
配置选项只是通知Router将route params转换为component props。有关详细信息,请参阅 Passing props to route components。
然后在 EditPost
中您将接受 ID 并从服务器获取 post。
export default {
props: ['postId'],
data() {
return {
post: null,
}
},
mounted() {
this.fetchPost();
},
methods: {
fetchPost() {
axios.get('/api/post/' + this.postId)
.then(response => this.post = response.data);
},
},
}
请求完成后,EditPost
有自己的副本可以进一步处理。
请注意,在每次 post 编辑和每次进入 post 列表时,您都会向服务器发出请求,这在某些情况下可能是不必要的,因为所有需要的信息已经在 post 列表中并且不会在请求之间更改。如果你想在这种情况下提高性能,我建议将 Vuex 集成到你的应用程序中。 如果您决定这样做,这些组件看起来会非常相似,只是您不是通过 HTTP 请求获取 post 进行编辑,而是从 Vuex 存储中检索它。有关详细信息,请参阅 Vuex documentation。
如果你不希望参数出现在URL栏中,你可以使用window.sessionStorage、window.localStorage或vuex。 离开视图前设置参数,进入新视图后获取。
您可以在 <router-view :my-id="parentStoredId"></router-view>
上使用 prop 来传递 app.vue(主要组件)中存在的数据。要更改父数据,您需要从子数据 (Posts.vue、EditPost.vue) 发出包含值的 custom event。
另一种方法是 Non Parent-Child Communication。
我比较喜欢的方式是Vuex。即使需要学习使用,也会随着应用的成长而得到回报。