如何使用vue-router

时间:2017-08-16 19:51:17

标签: vue.js vuejs2 vue-component vue-router

vue-router.vue文件一起使用时,没有记录的方法将数据从一个视图/组件传递到另一个视图/组件。

我们采取以下设置......

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从一个视图/组件传递到另一个视图/组件?

3 个答案:

答案 0 :(得分:2)

只能通过URL访问路径,并且URL必须是用户可以在URL栏中键入的内容,因此要将变量从一个视图组件传递到另一个视图组件,您必须使用route params

我假设您在Posts组件中有一个帖子列表,并希望更改页面以编辑EditPost组件中的特定帖子。

最基本的设置是在帖子列表中添加一个链接以重定向到编辑页面:

<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配置选项只是通知路由器将路由参数转换为组件道具。有关详细信息,请参阅Passing props to route components

然后在EditPost中,您接受了ID并从服务器获取帖子。

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有自己的副本,可以进一步处理。

请注意,在每个帖子编辑和每次进入帖子列表时,您都会向服务器发出请求,这在某些情况下可能是不必要的,因为所有需要的信息已经在帖子列表中并且没有& #39;在请求之间进行更改。如果您想在这种情况下提高性能,我建议您将Vuex集成到您的应用中。 如果您决定这样做,组件看起来非常相似,除了通过HTTP请求获取要编辑的帖子,您将从Vuex商店检索它。有关详细信息,请参阅Vuex documentation

答案 1 :(得分:1)

如果您不希望params出现在URL栏中,您可以使用window.sessionStorage,window.localStorage或vuex。 在离开视图之前,请在进入新视图后设置参数并获取参数。

答案 2 :(得分:1)

您可以使用<router-view :my-id="parentStoredId"></router-view>上的道具传递app.vue(主要组件)中的数据。要更改父数据,您需要从子项(Posts.vue,EditPost.vue)中发出包含值的custom event

另一种方式是Non Parent-Child Communication

我喜欢的方式是Vuex。即使它需要您学习使用情况,它也会在应用程序增长时回复。