我想在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>
我觉得我可以使用props
和v-if
来做到这一点。
有人能帮我吗?谢谢!
答案 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
传递给您所需的道具即可。