在VueJS的嵌套v-for循环中切换表单

时间:2019-07-03 13:40:34

标签: laravel vue.js vuejs2 v-for

我有一个嵌套评论列表。在每个评论下,我想添加一个“回复”按钮,单击该按钮即可显示回复表单。

就目前而言,每当我单击“答复”按钮时,它就会显示该表单。但问题是,我只想在整个页面上显示一种形式。因此,基本上,当我单击“答复”时,应关闭打开的其他表格,并在正确的注释下打开一个新表格。

编辑:

所以我能够取得一些进展。现在,我只能在嵌套循环的每个深度级别上打开一个活动表单。显然,我现在要做的是只拥有一个。 我所做的是从子组件中发出事件并处理父组件中的所有事件。事实是,它在非嵌套的评论列表中会很好用,但就我而言不是那么重要...

这是新代码:

在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>

在此先感谢您的帮助!

0 个答案:

没有答案