{{ tweet.tweet_text }}
我獲取數(shù)據(jù)的方式有點復(fù)雜。我有“tweets”數(shù)組,其中存儲數(shù)據(jù),每條推文都是一張卡片,單擊卡片時我成功地更改了樣式(markTweet 函數(shù)),但每條推文也有回復(fù),顯示與推文相同(每個回復(fù)都有自己的回復(fù))卡片)。我從服務(wù)器獲取數(shù)據(jù)的方式:
let replies = [] for(const tweet of tweets) { let reply = await SQL('SELECT * FROM tweet_replies WHERE tweet_replies.conversation_id = ?', tweet.tweet_id) replies.push(reply) } const data = { tweets: tweets, page: parseInt(currentPage), numberOfPages: arr, replies }
然后我在 vue 中有組件。您可以看到回復(fù)存儲在每條推文中的 tweets 數(shù)組中,作為 tweetReplies。 在markReply函數(shù)中,我成功地將id添加到數(shù)組中。
<template> <div class="container-full"> <div class="tweets-container"> <div v-for="(tweet, i) in tweets" :key="tweet.id" > <div class="tweet-card" :class="{ selected: tweet.isSelected }" @click="markTweet(tweet.tweet_id, i)" > <div class="text"> <p v-html="tweet.tweet_text" > {{ tweet.tweet_text }} </p> </div> </div> <div class="replies"> <div v-for="(reply, index) in tweet.tweetReplies" :key="reply.tweet_id" @click="markReply(reply.tweet_id, index)" > <div class="tweet-card tweet-reply"> <div class="text"> <p> {{ reply.tweet_text }} </p> </div> </div> </div> </div> </div> </div> </div> </template> <script> import axios from 'axios' import { getUserToken } from '@/auth/auth' import moment from 'moment' import { BFormTextarea, BButton, BFormSelect } from 'bootstrap-vue' export default { components: { BFormTextarea, BButton, BFormSelect }, data() { return { tweets: [], tweetActionIds: [], categories: [], } }, beforeMount() { this.getTweets() }, methods: { getTweets() { this.tweets = [] const API_URL = `${this.$server}/api/twitter/tweets` const params = { token: getUserToken(), page: this.$route.query.page, newCurrentPage: newCurrent, } axios.post(API_URL, null, { params }).then(res => { this.currentPage = res.data.page this.numberOfPages = res.data.numberOfPages if (res.data) { res.data.tweets.forEach(tweet => { const tweetData = { id: tweet.id, tweet_id: tweet.tweet_id, tweet_text: htmlText, tweet_text_en: htmlTextEn, twitter_name: tweet.twitter_name, twitter_username: tweet.twitter_username, added_at: moment(String(tweet.added_at)).format( 'MM/DD/YYYY hh:mm', ), URL: tweet.URL, isSelected: false, tweetReplies: [], } this.tweets.push(tweetData) }) res.data.replies.forEach(reply => { reply.forEach(r => { this.tweets.forEach(tweet => { if (tweet.tweet_id === r.conversation_id) { tweet.tweetReplies.push(r) } }) }) }) } }) }, markTweet(tweetId, i) { const idIndex = this.tweetActionIds.indexOf(tweetId) this.tweets[i].isSelected = !this.tweets[i].isSelected if (this.tweetActionIds.includes(tweetId)) { this.tweetActionIds.splice(idIndex, 1) } else { this.tweetActionIds.push(tweetId) } }, markReply(replyId) { const idIndex = this.tweetActionIds.indexOf(replyId) if (this.tweetActionIds.includes(replyId)) { this.tweetActionIds.splice(idIndex, 1) } else { this.tweetActionIds.push(replyId) } }, }, } </script>
我嘗試在數(shù)據(jù)中添加 replySelected
,然后當(dāng)在 markReply 中觸發(fā)單擊時,我將 replySelected
更改為 true,但是隨后選擇了推文的每個回復(fù),這不是我想要的。
您可以在 Nikola 的答案的基礎(chǔ)上構(gòu)建,只需檢查它是否在 tweetActionIds
數(shù)組中,即可繞過向每條推文添加 isSelected
的額外步驟,然后執(zhí)行相同的操作并通過回復(fù)保持干凈
{{tweetActionIds}}{{ tweet.tweet_text }}
{{ reply.tweet_text }}
const app = Vue.createApp({ data() { return { tweets: [] tweetActionIds: [], categories: [], } }, methods: { markTweet(tweetId, i) { const idIndex = this.tweetActionIds.indexOf(tweetId) if (this.tweetActionIds.includes(tweetId)) { this.tweetActionIds.splice(idIndex, 1) } else { this.tweetActionIds.push(tweetId) } }, markReply(replyId) { const idIndex = this.tweetActionIds.indexOf(replyId) if (this.tweetActionIds.includes(replyId)) { this.tweetActionIds.splice(idIndex, 1) } else { this.tweetActionIds.push(replyId) } }, isSelected(tweet) { return this.tweetActionIds.includes(tweet.tweet_id); } }, })
如果我理解正確,請嘗試以下代碼片段:
const app = Vue.createApp({ data() { return { tweets: [{id: 1, tweet_id: 1, isSelected: true, tweet_text: 'aaa', tweetReplies: [{tweet_id: 11, tweet_text: 'bbb'}, {tweet_id: 12, tweet_text: 'ccc'}]}, {id: 2, tweet_id: 2, isSelected: false, tweet_text: 'ddd', tweetReplies: [{tweet_id: 21, tweet_text: 'eee'}, {tweet_id: 22, tweet_text: 'fff'}]}], tweetActionIds: [], } }, methods: { markTweet(tweetId, i) { const idIndex = this.tweetActionIds.indexOf(tweetId) this.tweets[i].isSelected = !this.tweets[i].isSelected if (this.tweetActionIds.includes(tweetId)) { this.tweetActionIds.splice(idIndex, 1) } else { this.tweetActionIds.push(tweetId) } }, markReply(replyId) { const idIndex = this.tweetActionIds.indexOf(replyId) if (this.tweetActionIds.includes(replyId)) { this.tweetActionIds.splice(idIndex, 1) } else { this.tweetActionIds.push(replyId) } }, checkReply(r) { return this.tweetActionIds.includes(r) ? true : false } }, }) app.mount('#demo')
.selected {color: red;}
sssccc{{tweetActionIds}}{{ tweet.tweet_text }}
{{ reply.tweet_text }}