【发布时间】:2020-05-23 00:39:49
【问题描述】:
我有一个父组件和一个子组件。父组件“邀请”包含多个“邀请”子组件。当我刷新网站时,所有邀请都会显示在网站上,但是一旦我更新了邀请数组(添加邀请),它就不会显示在页面上,即使我可以在 vue 开发人员上看到数组正在更新安慰。我必须刷新页面才能看到它。
当某些东西被添加到数组(更新)时,它看起来像这样: see here
将页面添加到数组后刷新页面时看起来像这样。
这是我的两个组件:
invitations.vue
<template>
<li class="nav-item dropdown" id="invitations">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
Invitations <i class="far fa-bell"></i>
</a>
<div class="dropdown-menu" style="min-width: 20rem" aria-labelledby="navbarDropdown"
id="dropdownMenu">
<div v-for="invitation in invitations" v-bind:key="invitation.id" v-
bind:invitations="invitations">
<Invitation :invitation="invitation" v-on:accept-invitation="accept" v-on:reject-
invitation="reject" v-bind:invitation="invitation"></Invitation>
</div>
</div>
</li>
</template>
<script>
import Invitation from "./Invitation";
export default {
name: "Invitations",
props: {
invitations: {
type: Array,
default: [],
required: true
},
user: {
type: Object,
required: true
}
},
methods: {
accept(team_id) {
axios.get('/request/accept/' + team_id)
.then((response) => {
this.invitations = this.invitations.filter(invitation => invitation.id)
});
},
reject(team_id) {
axios.get('/request/reject/' + team_id)
.then((response) => {
this.invitations = this.invitations.filter(invitation => invitation.id)
});
},
handleIncoming(invitation) {
this.saveNewInvitation(invitation);
return;
},
saveNewInvitation(invitation) {
this.invitations.push(invitation);
},
},
mounted() {
Echo.channel('invitations.' + this.user.id)
.listen('NewInvitation', (e) => {
this.handleIncoming(e);
});
},
components: {Invitation}
}
</script>
invitation.vue
<template>
<div :id="invitation.id" class="mb-2">
<a class="ml-4" title="Show team info" style="margin-right: 90px"
:href="'/team/index/' + invitation.id" v-bind:name="invitation.name">{{invitation.name}}</a>
<a class="float-right mr-3" href="#" @click="$emit('reject-invitation', invitation.id)">
<i class="fas fa-times reject" :teamId="invitation.id"></i>
</a>
<a class="float-right mr-3" href="#" @click="$emit('accept-invitation', invitation.id)">
<i class="fas fa-check accept" :teamId="invitation.id"></i>
</a>
</div>
</template>
<script>
export default {
name: "Invitation",
props: {
invitation: {
type: Object,
default: null
}
}
}
</script>
谁能告诉我怎么了?
【问题讨论】:
-
你为什么有
:invitation="invitation" .... v-bind:invitation="invitation"- 因为:invitation只是v-bind:invitation的简写 - 即它们是同一个东西......虽然不是说这是问题 -
我尝试用 v-bind 解决它,但没有成功。但即使没有,它也不起作用。
-
道具是对象,因此可能需要对子组件进行深度观察
-
这是做什么的:
this.invitations = this.invitations.filter(invitation => invitation.id) -
它应该在您接受或拒绝邀请时从列表中删除邀请。
标签: javascript node.js vue.js