2つのコンポーネント(RequestListとRequest)があります。親コンポーネントは、getRequestList()
メソッドを呼び出して、サーバーから子コンポーネントにフェッチされたオブジェクトの配列を小道具としてリストします。更新時に子コンポーネントのデータが次の兄弟コンポーネントに渡されます
子コンポーネントから、親コンポーネントのメソッドdeleteRequest(request_id)
を呼び出してオブジェクトを削除することができます。これは、小道具として送信されました。 親コンポーネントメソッドでは、削除要求をサーバーに送信してオブジェクトを削除します。成功した場合は、同じメソッドを呼び出してリクエストのリストを取得しますgetRequestList()
。
私が直面している問題は、子コンポーネントでは、別の方法でリクエストを投票することですVoteRequest()
。投票が成功した場合、Requestコンポーネントの投票ステータスが更新されます。失敗した場合は、エラーが表示されます。
ここで、リクエストコンポーネント(子)の1つ、たとえば最初のリクエストオブジェクトにすでにエラーがあるとします。そのリクエストを削除すると、リクエストリストが更新されます。何らかの理由で私は理由を知らないが、削除されたコンポーネントのエラーは次のリクエストコンポーネントにまだ残っている。私はここで間違って何をしていますか?
親コンポーネント(RequestList.vue):
template
<ul id="request_list" v-if="request_list_data.length > 0">
<li v-for="request in request_list_data">
<request :request_id="request.id"
:deleteRequest="deleteRequest"
:updateVotes="updateRequestVotes">
</request>
</li>
<p class="error" style="margin-top: 20px;" v-show="request_error !== ''">{{request_error}}</p>
</ul>
script
export default {
data: function() {
return {
request_list_data: [],
}
},
methods: {
getRequestList() {
const url = this.$store.state.website + '/api/activities/-requests/?ordering=-id';
this.$http.get(url)
.then(function (response) {
this.request_list_data = Object.assign([], response.data);
})
},
deleteRequest(request_id){
const url = this.$store.state.website + '/api/activities/-requests/' + request_id + '/';
this.$http.delete(url)
.then(function (response) {
this.getRequestList();
})
}
},
created: function() {
this.getRequestList();
}
}
子コンポーネント(Request.vue):
template
<div class="request">
<div class="vote-action" @click="VoteRequest('down')">▼</div>
</div>
<div class="_data">
<div class="request_error" v-show="vote_error !== ''">
<p class="error">{{vote_error}}</p>
</div>
<button v-show="selfrequest" class="deleterequest_btn" @click="deleterequest()">Delete your request</button>
</div>
</div>
script
export default {
name: 'request_wrapper',
props: {
request_id: {
type: Number,
},
updateVotes: {
type: Function
},
deleteRequest: {
type: Function
}
},
data: function() {
return {
vote_error: ''
}
},
methods: {
VoteRequest(vote_type) {
this.vote_error = '';
if (this.$store.state.user_logged_in) {
if (vote_type === 'up') {
const data = {
'request': this.request_id,
'vote_type': true
};
this.PostVote(data);
}
else if (vote_type === 'down') {
const data = {
'request': this.request_id,
'vote_type': false
};
this.PostVote(data);
}
},
PostVote(data) {
const url = this.$store.state.website + '/api/activities/-request-votes/none/voterequest/';
this.$http.post(url, data)
.then(function (response) {
console.log(response.data);
this.updateVotes(this.request_id, response.data.votes);
})
},
deleterequest() {
this.deleteRequest(this.request_id);
}
}
}
定義されていますどこに?私はそれがどのようにループ内の '要求'アイテムに接続しているのか分かりません。それに(無関係かもしれませんが)、 'v-for'ループ内の各項目に対して常に一意の' key 'を与えるべきです(そうでなければ、奇妙なビューの振る舞いにつながる可能性があります)。 – wostex
@wostex 'request_error'は、親RequestListコンポーネントで定義されています。サーバーから要求アイテムを取得中にエラーがあった場合に表示されます。 'key'を使って試してみます。指摘していただきありがとうございます。 – Kakar
@wostexはい、あなたの権利がありました。キーはここで問題だった。ありがとうございました。私はそれを受け入れることができ、他の人を助けることができるように、あなたはそれに答えることができますか? – Kakar