VueJS:单击后呈现新组件

时间:2019-05-16 09:24:35

标签: javascript vue.js frontend

我想在vue.js中呈现新组件,就像它是新页面一样。

我正在尝试使用称为“动态组件”的东西

父母:Post.vue
孩子:Detail.vue

因此,如果单击其中一个帖子,则“帖子”关闭,“详细信息”打开。

问题是我必须将单击的帖子的ID发送到详细信息。

这是我的一些代码。

Post.vue


<template>
  <div>
    <div v-if="loading">
      loading...
    </div>
    <div v-else class="container">
      <ul>
        <li v-for="(post, index) in filteredPosts" v-bind:key="post.no">
            <section class="post__main">
              <div @click..?? class="main__title">{{post.title}}</div>
            </section>
        </li>
      </ul>

    </div>
  </div>
</template>

<script>
    created() {
      axios.get(this.url, {
        params: {
          page: this.page,
          ord: this.ord,
          category: []
        }
      }).then(res => {
        this.posts = res.data.list;
        this.loading = false;
        this.page++;
      });

Detail.vue

<template>
    <div>
        {{contents}}
    </div>
</template>

<script>
import axios from 'axios';
export default {
    name: 'Datail',
    data() {
        return {
            req_no: null,
            contents: {}
        }
    },
    created() {
      axios.get(url, {
        params: {
          req_no: this.req_no
        }
      }).then(res => {
          this.contents = this.res.data
      });
    }
}
</script>

我觉得我可以使用propsv-if来做到这一点。 有人能帮我吗?谢谢!

2 个答案:

答案 0 :(得分:3)

点击帖子后,将帖子ID传递给点击处理程序。在点击处理程序中,路由到detail.vue,并将帖子ID作为路由参数传递。

如下所示:

  <li v-for="(post, index) in filteredPosts" v-bind:key="post.no">
      <section class="post__main">
          <div @click="onPostClick(post.id)" class="main__title">{{post.title}}</div>
      </section>
  </li>

在您的点击处理程序中:

 onPostClick(id: number) {
        this.$router.push({
            name: 'details',
            params: {
                id
            }
        });
    }

只要您在应用中正确设置了vue路由器并且具有有效的详细信息路由,这将起作用。

您可以按以下方式访问详细信息组件中的帖子ID:

created() {
    this.postId = this.$route.params.id;
}

答案 1 :(得分:1)

我来看看<component>,它需要一个道具:to并呈现一个组件,这对于诸如制表符这样的东西很有用,因为您可以从相同的常规位置呈现不同的组件页面,而无需重新加载整个页面。看这里: https://vuejs.org/v2/guide/components-dynamic-async.html 对于您来说,这似乎是一个非常好的用例,只需将component传递给您所需的道具即可。