我有两个组件的模板内的另一个组件是切换取决于点击“答复”和“编辑”按钮。
<comment-form :model="model" :model-id="modelId" :comment="comment" v-if="showEditForm && canComment" @closeForm="closeForm"></comment-form>
<comment-form :model="model" :model-id="modelId" :parent-id="comment.id" :reply-to="comment" v-if="showReplyForm && canComment" @closeForm="closeForm"></comment-form>现在的问题是,它从未因任何原因关闭第一个打开的实例。当我单击“编辑”然后“回复”时,“编辑”的实例似乎保持打开状态,而不是关闭它并打开“回复”实例。
以下是切换窗体显示的方法:
methods: {
closeForm: function () {
this.showReplyForm = false;
this.showEditForm = false;
},
reply: function () {
this.showReplyForm = true;
this.showEditForm = false;
},
editComment: function () {
this.showEditForm = true;
this.showReplyForm = false;
},
},我想了解这种行为的原因以及如何修复它.
下面是整个comment.vue文件:
<template>
<div class="comment">
<div class="header">
<div v-if="!comment.user">
<span class="name">{{comment.name}}</span>
wrote on
<span class="time">{{comment.created}}</span>:
</div>
<div v-else>
<span class="name">{{comment.user.username}}</span> wrote on {{comment.created}}:
</div>
</div>
<div class="body">
<template v-for="line in comment.body.split('\n')">{{line}}<br></template>
</div>
<div class="footer">
<a href="#" class="reply-btn" v-on:click.prevent="reply()" v-if="!isLoginRequired || isLoggedIn">
reply
</a>
<span v-if="isMyComment">
•
<a href="#" class="edit-btn" v-on:click.prevent="editComment()">
edit
</a>
•
<a href="#" class="delete-btn" v-on:click.prevent="deleteComment()">
delete
</a>
</span>
</div>
<comment-form :model="model" :model-id="modelId" :comment="comment" v-if="showEditForm && canComment" @closeForm="closeForm"></comment-form>
<comment-form :model="model" :model-id="modelId" :parent-id="comment.id" :reply-to="comment" v-if="showReplyForm && canComment" @closeForm="closeForm"></comment-form>
<comments-list :level="level + 1" v-if="hasChildren" :model="model" :model-id="modelId" :parent-id="comment.id"></comments-list>
</div>
</template>
<script>
export default {
props: {
comment: null,
modelId: null,
level: null,
parentId: null,
model: {
type: String,
default: null
},
},
computed: {
hasChildren: function() {
return this.$commentsStore.getters.hasChildren(
this.model,
this.modelId,
this.comment.id,
);
},
canComment: function() {
return this.$commentsStore.getters.canPost;
},
isLoggedIn: function() {
return this.$commentsStore.getters.isLoggedIn;
},
isMyComment: function () {
return this.$commentsStore.getters.isMyComment(this.comment);
},
isLoginRequired: function() {
return this.$commentsStore.getters.getConfig('loginRequired');
}
},
methods: {
closeForm: function () {
this.showReplyForm = false;
this.showEditForm = false;
},
reply: function () {
this.showReplyForm = true;
this.showEditForm = false;
},
editComment: function () {
this.showEditForm = true;
this.showReplyForm = false;
},
deleteComment: function () {
return this.$commentsStore.dispatch('deleteComment', this.comment);
}
},
data: function() {
return {
showReplyForm: false,
showEditForm: false
};
}
};
</script>发布于 2018-01-26 14:15:11
这有点疯狂,但你需要一个key。这是我第一个看到在v-for之外需要一个的例子。
在两个v-if中有相同的组件,当Vue进行更新时,它会看到它应该有一个comment-form,而且它已经有了。它不认识不同之处。我将其称为Vue,tbh中的一个bug,但解决方法是为每个组件实例提供一个key。
new Vue({
el: '#app',
data: {
showEditForm: true,
showReplyForm: false
},
components: {
commentForm: {
methods: {
close() {
this.$emit('close-form');
}
}
}
},
methods: {
closeForm: function() {
this.showReplyForm = false;
this.showEditForm = false;
},
reply: function() {
this.showReplyForm = true;
this.showEditForm = false;
},
editComment: function() {
this.showEditForm = true;
this.showReplyForm = false;
},
}
})<script src="//unpkg.com/vue@latest/dist/vue.js"></script>
<div id="app">
<button @click="reply">
Reply
</button>
<button @click="editComment">
Edit
</button>
<comment-form v-if="showEditForm" key="edit" @close-form="closeForm" inline-template>
<div>
This is the edit form
<button @click="close">
Close it
</button>
</div>
</comment-form>
<comment-form id="reply" key="reply" v-if="showReplyForm" @close-form="closeForm" inline-template>
<div>
This is the reply form
<button @click="close">
Close it
</button>
</div>
</comment-form>
</div>
https://stackoverflow.com/questions/48462639
复制相似问题