我有一个嵌套评论列表。在每个评论下,我想添加一个“回复”按钮,单击该按钮即可显示回复表单。
就目前而言,每当我单击“答复”按钮时,它就会显示该表单。但问题是,我只想在整个页面上显示一种形式。因此,基本上,当我单击“答复”时,应关闭打开的其他表格,并在正确的注释下打开一个新表格。
编辑:
所以我能够取得一些进展。现在,我只能在嵌套循环的每个深度级别上打开一个活动表单。显然,我现在要做的是只拥有一个。 我所做的是从子组件中发出事件并处理父组件中的所有事件。事实是,它在非嵌套的评论列表中会很好用,但就我而言不是那么重要...
这是新代码:
在parentComponent中,我有一个handleSelected方法,
handleSelected (id) {
if(this.selectedItem === id)
this.selectedItem = null;
else
this.selectedItem = id;
},
还有我的childComponent:
<template>
<div v-if="comment">
<div v-bind:style=" iAmSelected ? 'background: red;' : 'background: none;' ">
<p>{{ comment.author.name }}<br />{{ comment.created_at }}</p>
<p>{{ comment.content }}</p>
<button class="button" @click="toggle(comment.id)">Répondre</button>
<button class="button" @click="remove(comment.id)">Supprimer</button>
<div v-show="iAmSelected">
<form @submit.prevent="submit">
<div class="form-group">
<label for="comment">Votre réponse</label>
<textarea class="form-control" name="comment" id="comment" rows="5" v-model="fields.comment"></textarea>
<div v-if="errors && errors.comment" class="text-danger">{{ errors.comment[0] }}</div>
</div>
<button type="submit" class="btn btn-primary">Envoyer</button>
<div v-if="success" class="alert alert-success mt-3">
Votre réponse a bien été envoyée !
</div>
</form>
</div>
</div>
<div v-if="comment.hasReply">
<div style="margin-left: 30px;">
<comment v-for="comment in comments"
:key="comment.id"
:comment="comment" @remove-comment="remove"
:is-selected="selectedItem" @selected="handleSelected($event)">
</comment>
</div>
</div>
</div>
</template>
<script>
import comment from './CommentItem'
export default {
name: 'comment',
props: {
isSelected: Number,
comment: {
required: true,
type: Object,
}
},
data () {
return {
comments: null,
fields: {},
errors: {},
success: false,
loaded: true,
selectedItem: null,
}
},
computed: {
iAmSelected () {
return this.isSelected === this.comment.id;
}
},
methods: {
remove(id) {
this.$emit('remove-comment', id)
},
toggle(id) {
this.$emit('selected', id);
},
handleSelected(id) {
if(this.selectedItem === id)
this.selectedItem = null;
else
this.selectedItem = id;
},
},
mounted(){
if (this.comment.hasReply) {
axios.get('/comment/replies/' + this.comment.id)
.then(response => {
this.comments = response.data
})
}
}
}
</script>
在此先感谢您的帮助!