【发布时间】:2020-02-05 15:24:10
【问题描述】:
我正在使用使用 Bootstrap-Vue 构建的选项卡式界面。单击其中一个选项卡时,我使用 v-for 在显示为网格的手风琴/下拉列表中呈现一些数据。
目前,我有一个显示所有结果的选项卡,在使用以下内容时可以正常工作 (注意:prizesData 是我使用 axios 调用后存储 response.data 的位置):
<div class="col-sm-12 col-md-6 col-lg-3 w-100 prize-dropdown-wrapper pb-5"
v-for="(prize, name, index) in prizesData"
:key="index"
>
<!--REMAINDER OF MARKUP GOES HERE-->
</div>
我的 JSON 结构看起来像这样,除了我总共有 43 个结果。每个对象中的每个值都会改变,但我想使用 prizeType1Name 和 prizeType2Name 来检查它们是否包含字符串“CTW”、“IW”或“OG”:
{
"1": [
{
"prizeTitle": "",
"prizeImage": "",
"prizeFirstLineText": "",
"prizeType1": {
"Image": "",
"Line1": "",
"Line2": ""
},
"prizeType2": {
"Image": "",
"Line1": "",
"Line2": ""
},
"prizeTermsText": "",
"prizeType1Name": "CTW",
"prizeType2Name": ""
}
],
"2": [
{
"prizeTitle": "",
"prizeImage": "",
"prizeFirstLineText": "",
"prizeType1": {
"Image": "",
"Line1": "",
"Line2": ""
},
"prizeType2": {
"Image": "",
"Line1": "",
"Line2": ""
},
"prizeTermsText": "",
"prizeType1Name": "IW",
"prizeType2Name": ""
}
]
}
要访问我正在使用的这些值中的任何一个:
this.prizesData[name][0].prizeType1 或 this.prizesData[name][0].prizeType2
我很难理解如何过滤我的结果。例如,如果我单击名为 (CTW) 的选项卡,我只想显示 JSON 文件中包含“CTW”的结果。或者,如果单击名为“IW”的选项卡,则结果应该是包含“IW”的对象。
我尝试过的:
添加了 filteredPrizes 以将过滤后的奖品存储为对象以供以后访问
data() {
return {
prizesData: {},
filteredPrizes: {},
};
}
我尝试在从 JSON 文件收到的现有 prizesData 对象上使用 filter(),我在获取 JSON 的相同方法中添加了它文件。
getPrizesInfo() {
const self = this;
//Get Error Validation JSON
axios
.get("/data/prizes.json")
.then(response => (this.prizesData = response.data));
this.filteredPrizes = this.prizesData.filter(prize =>
this.prizesData[name][0].prizeType1.includes("CTW")
);
}
我的期望: 我有 4 个选项卡,第一个工作正常(显示全部)。其他 3 个需要仅显示过滤结果,具体取决于 prizeType1Name 中是否存在“CTW”、“IW”或“OG” 或 prizeType2Name。
【问题讨论】:
-
您是否尝试过使用计算属性?
-
我最初确实尝试过,但我不确定如何构建它或确切返回什么
-
您可以控制 JSON 吗?在我看来,将它作为一个数组而不是一个对象会更有意义。这样可以更轻松地进行迭代以获得所需的过滤。
-
我同意,很遗憾,我必须按原样使用 JSON
-
@ImranR 您应该使用计算属性。这就是他们的设计目的。在你理解这个概念之前不应该做太多的实验。今晚晚些时候我可能有时间发布一个示例。
标签: javascript vue.js bootstrap-vue